如何在同一SQLPLUS INSERT INTO语句中同时使用SELECT查询和RETURNING

时间:2019-12-06 07:44:49

标签: sql oracle plsql

我正在使用sqlplus进行此项目,并且正在PL / SQL中进行以下过程:

CREATE OR REPLACE PROCEDURE run_simulation IS 
t_order_no stock_order.order_no%type;
BEGIN
    INSERT INTO order VALUES (order_no, id, stock, action, tot_shares, rem_shares)
    SELECT OID, cust_id, stock, action, shares, shares
    FROM stock_order 
    RETURNING order_no INTO t_order_no;
    END; 
    /
    show errors 

我只是收到错误:SQL命令未正确结束。我在网上找不到有关如何正确执行此操作的任何信息。我试图将t_order_no作为表格。我试着让它返回批量收集。我尝试将RETURNING放在选择之前。我不知道还能尝试什么。有人有建议吗?

4 个答案:

答案 0 :(得分:2)

我不确定RETURNING INTO在此查询中是否有任何含义。 如果您想在过程中进一步处理数据(这似乎没有发生),那将很有用。

简单的INSERT INTO SELECT怎么样?

CREATE OR REPLACE PROCEDURE run_simulation IS 
BEGIN
INSERT INTO order VALUES (order_no, id, stock, action, tot_shares, rem_shares)
SELECT OID, cust_id, stock, action, shares, shares
FROM stock_order 
END; 
/

您可能还想提交;在程序内部。

答案 1 :(得分:1)

那是因为-在PL / SQL中-您不能将RETURNINGSELECT一起使用:

insert into table (col1, col2, ...)
select val1, val2 ...
from ...
returning val1 into ...

它仅适用于VALUES

insert into table (col1, col2, ...)
  values (val1, val2, ...)
  returning val1 into ...

这是一个例子:

这行不通:

SQL> CREATE OR REPLACE PROCEDURE p_test
  2  AS
  3     l_id  NUMBER;
  4  BEGIN
  5     INSERT INTO dept (deptno, dname, loc)
  6        SELECT deptno + 1 AS deptno, dname || 'x', loc
  7          FROM dept
  8         WHERE deptno = 10
  9       RETURNING deptno
 10            INTO l_id;
 11
 12     DBMS_OUTPUT.put_line ('returned ' || l_id);
 13  END;
 14  /

Warning: Procedure created with compilation errors.

SQL> show err
Errors for PROCEDURE P_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/4      PL/SQL: SQL Statement ignored
9/6      PL/SQL: ORA-00933: SQL command not properly ended
SQL>

但这会:

SQL> CREATE OR REPLACE PROCEDURE p_test
  2  AS
  3     l_id  NUMBER;
  4  BEGIN
  5     INSERT INTO dept (deptno, dname, loc)
  6          VALUES (85, 'Sales', 'London')
  7       RETURNING deptno
  8            INTO l_id;
  9
 10     DBMS_OUTPUT.put_line ('returned ' || l_id);
 11  END;
 12  /

Procedure created.

SQL> EXEC p_test;
returned 85

PL/SQL procedure successfully completed.

答案 2 :(得分:1)

这是因为,您不能使用RETURNING BULK COLLECT中的INSERT。您可以使用For loop

达到要求
CREATE OR replace PROCEDURE Run_simulation 
IS 
  t_order_no NUMBER; 
BEGIN 
    FOR my_rec IN (SELECT oid, 
                          cust_id, 
                          stock, 
                          action, 
                          tot_shares, 
                          rem_shares 
                   FROM   stock_order) LOOP 
        INSERT INTO orders 
                    (order_no, 
                     id, 
                     stock, 
                     action, 
                     tot_shares, 
                     rem_shares) 
        VALUES     (my_rec.oid, 
                    my_rec.cust_id, 
                    my_rec.stock, 
                    my_rec.action, 
                    my_rec.tot_shares, 
                    my_rec.rem_shares) 
        RETURNING order_no INTO t_order_no; 

        dbms_output.Put_line (t_order_no); 
    END LOOP; 
END; 
/ 

CHECK DEMO HERE

答案 3 :(得分:0)

您应该查看您的sp结构。 入侵IS,请使用AS。

使用RETURN代替RETURNING

这是一个例子:

https://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm