如何在同一SQLPLUS INSERT INTO语句中使用SELECT查询和RETURNING
我在做这个项目,我在使用sqlplus,我在PL/SQL中制作这个过程:如何在同一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,
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,然后再执行并处理订单。然后您得到了答案:)