table 上的 PLSQL 插入和返回 id 表单触发器

PLSQL insert and returning id form trigger on table

我正在尝试在 PLSQL insert 中执行插入语句,并返回从使用序列的 table 上的触发器生成的 ID,但是 我低于错误剂量有人知道吗?

ORA-00905: missing keyword

ORA-06512: at "ADMIN.F_INSERT_ORDER_DATA", line 22

ORA-06512: at line 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;

您的代码几乎没有问题。一是与 return 子句的绑定不正确。请参阅下面它在 link.

中的工作原理

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
  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 块中调用函数的方式:

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

在简单 SQL 中你可以调用如下:

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

这是我的版本(我需要 file_id 这是另一个 table 的外键):

create or replace function INSERT_INTO_table_name_ID return number 
 is
  v_file_name  VARCHAR2(690) := 'List from .. on '||sysdate;
  v_file_id    NUMBER;
 BEGIN     
  INSERT INTO table_name(file_id, file_name) --file_id filled by trigger to
       VALUES (null, v_file_name) 
    RETURNING file_id 
         INTO v_file_id;                  
  COMMIT;
  RETURN(v_file_id);
 END;

演示:

declare
v_id number;
begin
v_id := INSERT_INTO_table_name_ID ;
 dbms_output.put_line(v_id);
end;