Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在同一SQLPLUS INSERT INTO语句中使用SELECT查询和RETURNING_Sql_Oracle_Plsql - Fatal编程技术网

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

如何在同一SQLPLUS INSERT INTO语句中使用SELECT查询和RETURNING,sql,oracle,plsql,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,

我在做这个项目,我在使用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命令没有正确结束。我在网上找不到任何关于如何正确操作的信息。我试着让你点了一张桌子。我试着让它返回批量收集到。我试着把返回放在选择之前。我不知道还能尝试什么。有人有什么建议吗?

您应该查看您的sp结构。 除IS外,用作

使用RETURN代替RETURN

以下是一个例子:


我不确定返回到是否在此查询中有任何意义。 如果您希望在过程中进一步操作数据,那么它将非常有用,而这似乎没有发生

简单插入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; 
/

你也可能想要承诺;在过程内部。

这是因为在PL/SQL中,不能使用
返回
选择

insert into table (col1, col2, ...)
select val1, val2 ...
from ...
returning val1 into ...
它仅适用于

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.

这是因为,您不能从
插入
使用
返回批量收集
。您可以使用
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; 
/ 

我正计划进一步操作,这就是我需要它的原因,我只是还没走到那一步。我喜欢一步一步地编码。首先要做的事情是,哈哈……在一大组数据上做这件事的最好方法是使用光标,在数据上移动,然后一次插入一个数据,这样我就可以使用返回数据了吗?嗯,这要看情况而定。您从未说过要对返回的值执行什么操作。如果您稍后使用它,那么是的-您将需要以某种方式迭代这些行。游标循环是一种选择。我想对每个订单执行并调用另一个过程,\u no,然后再执行并处理订单。然后您得到了答案:)