PLSQL在表上插入并返回id表单触发器

时间:2017-01-21 02:29:17

标签: oracle plsql oracle11gr2

我正在尝试在PLSQL插入中执行insert语句,并返回从使用序列的表上的触发器生成的id 我得到的误差低于任何人对此有任何想法吗?

  

ORA-00905:缺少关键字

     

ORA-06512:at“ADMIN.F_INSERT_ORDER_DATA”,第22行

     

ORA-06512:第5行

w[nam] <- lapply(w[-1], function(x)  as.integer((w[,1]==0) & (x==1)))

调用以下功能

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;
/

2 个答案:

答案 0 :(得分:1)

您的代码几乎没有问题。一个是带有return子句的绑定是不正确的。请参阅以下链接的工作原理。

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;

在Simple SQL中,您可以调用如下:

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

答案 1 :(得分:0)

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

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;