1

以下の pl/sql は、引用符が原因でエラーを表示しています。助けていただけますか?また、このタイプのクエリを作成する方法のヒントを教えてください。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
execute immediate 'INSERT INTO BW_TXS 
                 VALUES ('||TXN_ID.NEXTVAL||','||v_user_id||','
                         ||SYSDATE||',''super '''||v_RULE_NAME
                         ||',''super '''||v_RULE_NAME||')';

end;

ありがとう

4

3 に答える 3

3

次のようになります。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
execute immediate 'INSERT INTO BW_TXS 
                 VALUES (TXN_ID.NEXTVAL,'||v_user_id||',SYSDATE,''super '||v_RULE_NAME
                         ||''',''super '||v_RULE_NAME||''')';

end;
/

ただし、動的 ​​SQL を使用する場合は、バインド変数を使用してください (ただし、この単純なケースでは、動的 SQL は完全にやり過ぎです)。すなわち

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
execute immediate 'INSERT INTO BW_TXS 
                 VALUES (TXN_ID.NEXTVAL,:userid,SYSDATE,:rule, :rule)'
 using v_user_id, 'super ' || v_rule_name, 'super ' || v_rule_name;

end;
/

(2 つの列に同じ文字列がある理由がわからない)。この些細なケースで動的 SQL を使用しない場合は、次の場合に可能です。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
  INSERT INTO BW_TXS 
  VALUES (TXN_ID.NEXTVAL,v_user_id,SYSDATE, 'super ' || v_rule_name, 
          'super ' || v_rule_name);

end;
/

insert into bw_txt (a, b, c, d..) values (...)また、後で誰かがデフォルト値で列を追加した場合と同じように、挿入で列名を常に定義する必要があります。コードは壊れます。

于 2013-04-06T18:19:19.083 に答える
0

すぐに実行する必要はありません。これは PL/SQL の利点の 1 つであり、挿入、更新、削除などの永続化操作は非常に単純です。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2; 

begin 

insert into BW_TXS VALUES(TXN_ID.NEXTVAL, v_user_id, SYSDATE, 'super', 'super', v_RULE_NAME);
于 2013-04-06T18:19:01.157 に答える
0

理由はわかりませんが、ブロックでラップする必要があることがわかりました。そうしないと、奇妙なエラーメッセージが表示されました。

execute immediate '
  begin 
          insert into something.SomethingElse (...)
          values (SYSDATE,''1.58.0.0'',''f1a87dfbe1ba'',1,null);
  end;';

私が持っていたエラーメッセージは次のとおりです。

Error report:
ORA-00933: SQL command not properly ended
ORA-06512: at line 14
00933. 00000 -  "SQL command not properly ended"
于 2014-07-08T11:57:41.203 に答える