PLSQL 插入子查询和返回子句
我无法找出以下伪 sql 的正确语法:
I can't figure out the correct syntax for the following pseudo-sql:
INSERT INTO some_table
(column1,
column2)
SELECT col1_value,
col2_value
FROM other_table
WHERE ...
RETURNING id
INTO local_var;
我想插入带有子查询值的内容.插入后,我需要新生成的 id.
I would like to insert something with the values of a subquery. After inserting I need the new generated id.
以下是 oracle 文档所说的:
Heres what oracle doc says:
插入声明
回归
好的,我认为仅使用 values 子句是不可能的...有没有替代方案?
OK i think it is not possible only with the values clause... Is there an alternative?
推荐答案
不能使用 INSERT 中的 RETURNING BULK COLLECT.这种方法可以用于更新和删除,但是:
You cannot use the RETURNING BULK COLLECT from an INSERT. This methodology can work with updates and deletes 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;
你可以通过几个额外的步骤让它工作(使用 TREAT 执行 FORALL INSERT)如本文所述:
You can get it to work with a few extra steps (doing a FORALL INSERT utilizing TREAT) as described in this article:
返回插入..select
T
利用他们创建的示例并将其应用于 test2 测试表
to utilize the example they create and apply it to test2 test table
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;
/
相关文章