PLSQL插入与子查询和返回条款(甲骨文)PLSQL插入与子查询和返回条款(甲骨文)(PLSQL I

2019-05-12 04:59发布

我想不通为以下伪-SQL的语法正确:

INSERT INTO some_table
           (column1,
            column2)
     SELECT col1_value, 
            col2_value 
       FROM other_table
      WHERE ...       
  RETURNING id
       INTO local_var; 

我想插入一个子查询的值的东西。 插入后,我需要新生成的ID。

继承人甲骨文医生说:

INSERT语句

返回进入

好吧,我认为这是不可能只值条款等有其他选择吗?

Answer 1:

你不能从一个INSERT COLLECT使用returning BULK。 这种方法可以与更新工作,并删除howeveer:

create table test2(aa number)
/
insert into test2(aa)
      select level
        from dual
        connect by level<100
/        

set serveroutput on
declare 
     TYPE t_Numbers IS TABLE OF test2.aa%TYPE
        INDEX BY BINARY_INTEGER;
      v_Numbers t_Numbers;
      v_count number;
begin


update test2
  set aa = aa+1
returning aa bulk collect into v_Numbers;

    for v_count in 1..v_Numbers.count loop
        dbms_output.put_line('v_Numbers := ' || v_Numbers(v_count));
    end loop;

end;

你可以把它与一些额外的步骤(做一个FORALL INSERT利用TREAT)这篇文章中所描述的工作:

与insert..select返回

Ť

利用他们所创造的例子,将它应用于TEST2测试表

 CREATE or replace TYPE ot AS OBJECT
    ( aa number);
/


CREATE TYPE ntt AS TABLE OF ot;
/

set serveroutput on
 DECLARE

       nt_passed_in ntt;
       nt_to_return ntt;

       FUNCTION pretend_parameter RETURN ntt IS
          nt ntt;
       BEGIN
          SELECT ot(level) BULK COLLECT INTO nt
         FROM   dual
         CONNECT BY level <= 5;
         RETURN nt;
      END pretend_parameter;

   BEGIN

      nt_passed_in := pretend_parameter();

      FORALL i IN 1 .. nt_passed_in.COUNT
         INSERT INTO test2(aa)
         VALUES
         ( TREAT(nt_passed_in(i) AS ot).aa
         )
         RETURNING ot(aa)
         BULK COLLECT INTO nt_to_return;

      FOR i IN 1 .. nt_to_return.COUNT LOOP
         DBMS_OUTPUT.PUT_LINE(
            'Sequence value = [' || TO_CHAR(nt_to_return(i).aa) || ']'
            );
      END LOOP;

   END;
   /


Answer 2:

不幸的是这是不可能的。 RETURNING仅适用于INSERT ... VALUES语句。 请参阅此Oracle论坛主题为这个问题的讨论。



Answer 3:

因为插入是基于选择,甲骨文假设你是允许与语法多行插入。 在这种情况下,看看返回条款文档的多个行版本,因为它表明你需要使用BULK COLLECT来检索所有插入行的价值转化为成果的集合。

毕竟,如果您的插入查询创建两行 - 其返回值将放入一个变量?

编辑-事实证明这并不像我原以为工作....该死!



Answer 4:

这并不像你想象中的那样简单,因为它是使用MySQL的确不容易。 Oracle不保留最近插入的轨道,在这你可以ping回结果的方式。

您将需要制定出这样的一些其他的方式,你可以使用ROWID做到这一点 - 但是这有它的缺陷。

这个环节讨论了这个问题: http://forums.oracle.com/forums/thread.jspa?threadID=352627



文章来源: PLSQL Insert into with subquery and returning clause (Oracle)