次の疑似SQLの正しい構文を理解できません。
INSERT INTO some_table
(column1,
column2)
SELECT col1_value,
col2_value
FROM other_table
WHERE ...
RETURNING id
INTO local_var;
サブクエリの値で何かを挿入したいと思います。挿入後、新しく生成されたIDが必要です。
Oracle docが言うことを以下に示します。
わかりました、values句だけでは不可能だと思います...代わりはありますか?
INSERTからRETURNING BULK COLLECTを使用することはできません。この方法は、更新を処理し、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を実行)で動作させることができます。
T
彼らが作成した例を利用してそれをtest2テストテーブルに適用する
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;
/
残念ながらそれは不可能です。 RETURNINGは、INSERT ... VALUESステートメントでのみ使用できます。このテーマの説明については、 このOracleフォーラムのスレッド を参照してください。
挿入は選択に基づいているため、Oracleはその構文で複数行の挿入を許可していると想定しています。その場合は、BULK COLLECTを使用して、挿入されたすべての行から結果のコレクションに値を取得する必要があることを示しているので、returning句ドキュメントの複数行バージョンを見てください。
結局、挿入クエリが2つの行を作成する場合、どの戻り値が単一の変数に入れられますか?
編集-思ったようにこれが機能しないことがわかりました...それをくそー!