我正在使用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放在选择之前。我不知道还能尝试什么。有人有建议吗?
答案 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中-您不能将RETURNING
与SELECT
一起使用:
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;
/
答案 3 :(得分:0)
您应该查看您的sp结构。 入侵IS,请使用AS。
使用RETURN代替RETURNING
这是一个例子:
https://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm