2017-01-21 13 views
1

PLSQLの挿入内にinsertステートメントを実行しようとしていますが、シーケンスを使用するテーブルのトリガーから生成されたIDを返すのですが、 私は、テーブルのPLSQLの挿入と返すIDフォームのタイプ

ORA-00905:欠落しているキーワード

ORA-06512: "ADMIN.F_INSERT_ORDER_DATA"、行で22

ORA-06512:行で5

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA (P_CUSTOMER_ID IN NUMBER, 
                             P_NOTES    IN VARCHAR2) 
     RETURN NUMBER 
    IS 
     vCreated_ON DATE := SYSDATE; 
     vORDER_ID  NUMBER; 
     vSQL   VARCHAR2 (1024); 
    BEGIN 
     vSQL := 'INSERT INTO orders' 
              ||'(ORDER_ID,' 
              || 'CUSTOMER_ID,' 
              || 'NOTES,' 
              || 'CREATED_BY,' 
              || 'CREATED_ON)' 
              || 'VALUES (NULL,'         --ORDER_ID Filled by trigger 
              || P_CUSTOMER_ID|| ','       --CUSTOMER_ID 
              || ''''|| P_NOTES|| ''','        --NOTES 
              || '''SYSTEM'','          --CREATED_BY 
              || ''''|| vCREATED_ON|| ''')'     --CREATED_ON 
       || 'RETURNING ORDER_ID INTO vORDER_ID'; 

     EXECUTE IMMEDIATE vSQL; 
     DBMS_OUTPUT.PUT_LINE(vORDER_ID); 

     RETURN (vORDER_ID); 
    END F_INSERT_ORDER_DATA; 
    /

呼び出し以下のような機能

declare 
    result varchar2(1024); 
begin 
    -- Call the function 
    result := F_INSERT_ORDER_DATA (1000,'----'); 

end; 

コード更新

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA (P_CUSTOMER_ID IN NUMBER, 
               P_NOTES   IN VARCHAR2) 
    RETURN NUMBER 
IS 
    vORDER_ID  NUMBER; 
    vCreated_by VARCHAR2 (128) := 'SYSTEM'; 
    vCreated_ON DATE := SYSDATE; 
    sql_stmt  VARCHAR2 (1024); 
BEGIN 
    sql_stmt := 
     'INSERT INTO orders (ORDER_ID, 
                 CUSTOMER_ID, 
                 NOTES, 
                 CREATED_BY, 
                 CREATED_ON) 
             VALUES (NULL,         --ORDER_ID Filled by trigger 
                 :PCUSTOMER_ID,    --CUSTOMER_ID 
                 :PNOTES,       --NOTES 
                 :PCREATED_BY,     --CREATED_BY 
                 :PCREATED_ON,     --CREATED_ON 
        RETURNING ORDER_ID INTO :vORDER_ID'; 

    EXECUTE IMMEDIATE sql_stmt 
     USING P_CUSTOMER_ID, 
      P_NOTES, 
      VCreated_by, 
      vCreated_ON 
     RETURNING INTO vORDER_ID; 

    DBMS_OUTPUT.PUT_LINE (vORDER_ID); 

    RETURN (vORDER_ID); 
END F_INSERT_ORDER_DATA; 
/

あなたのコードを持ついくつかの問題があります

DECLARE 
    vSQL VARCHAR2 (4000); 
    var  NUMBER; 
BEGIN 
    vSQL := 'F_INSERT_ORDER_DATA(:P_CUSTOMER_ID,:P_NOTES);'; 

    EXECUTE IMMEDIATE vSQL USING 1000, 'TEST' RETURNING INTO var; 

    DBMS_OUTPUT.PUT_LINE (var); 
END; 

答えて

1

関数を呼び出します。 1つは戻り節を持つバインディングは正しくありません。下のリンクでどのように動作するかをご覧ください。

Execute Immediate with returning clause

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA(P_CUSTOMER_ID IN NUMBER, 
               P_NOTES  IN VARCHAR2) 
    RETURN NUMBER IS 
    vCreated_ON DATE := SYSDATE; 
    vORDER_ID NUMBER; 

BEGIN 
    vSQL := 'INSERT INTO orders' || '(ORDER_ID,' || 'CUSTOMER_ID,' || 
      'NOTES,' || 'CREATED_BY,' || 'CREATED_ON)' || 'VALUES (NULL,' --ORDER_ID Filled by trigger 
      || P_CUSTOMER_ID|| ',' --CUSTOMER_ID 
      || P_NOTES || ','--NOTES 
      || '''SYSTEM'',' --CREATED_BY 
      || '''' || vCREATED_ON || ''')' --CREATED_ON 
      || 'RETURNING ORDER_ID INTO :vORDER_ID'; 

    EXECUTE IMMEDIATE vSQL RETURNING INTO vORDER_ID ; 
    DBMS_OUTPUT.PUT_LINE(vORDER_ID); 

    RETURN(vORDER_ID); 
END F_INSERT_ORDER_DATA; 
/

デモ:あなたは以下のように呼び出すことができるシンプルなSQLに

DECLARE  
    var  NUMBER; 
BEGIN 
    var := F_INSERT_ORDER_DATA(1000,'TEST'); 
    DBMS_OUTPUT.PUT_LINE (var); 
END; 

SQL> declare 
    2 var varchar2(4000); 
    3 var1 number; 
    4 begin 
    5 
    6 var := 'insert into dummy_emp(empid)values(2) RETURNING empID INTO :var1'; 
    7 
    8 execute immediate var 
    9  RETURNING INTO var1; 
10 commit; 
11  
12 dbms_output.put_line(var1); 
13 
14 end; 
15/

2 

PL/SQL procedure successfully completed. 

SQL> 

これは、あなたがPLSQLブロックで、あなたの関数を呼び出す必要があるかです。

Select F_INSERT_ORDER_DATA(1000,'TEST') from dual; 
+0

私はあなたの提供されたリンクに従って自分のコードを更新しましたが、今は関数の部分を呼び出す際にエラーが発生しています... 'ORA-00900:無効なSQL文'とエラー 'ORA-06512:at line 7'あなたが見て気にしなければ私のために新しいです.thanks – sam

+0

更新された投稿をチェックして、どのようにplsqlブロックの中であなたの関数を呼び出すことができます – XING

+0

プロのスキルを持つ輝きのサポートに感謝...私は本当にあなたの優しさのサポートを感謝します: – sam

関連する問題