web-dev-qa-db-ja.com

PLSQL Insert into with subqueryおよびreturn句(Oracle)

次の疑似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句だけでは不可能だと思います...代わりはありますか?

19

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を実行)で動作させることができます。

insert..selectで戻る

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;
   /
15
Harrison

残念ながらそれは不可能です。 RETURNINGは、INSERT ... VALUESステートメントでのみ使用できます。このテーマの説明については、 このOracleフォーラムのスレッド を参照してください。

16
Tony Andrews

挿入は選択に基づいているため、Oracleはその構文で複数行の挿入を許可していると想定しています。その場合は、BULK COLLECTを使用して、挿入されたすべての行から結果のコレクションに値を取得する必要があることを示しているので、returning句ドキュメントの複数行バージョンを見てください。

結局、挿入クエリが2つの行を作成する場合、どの戻り値が単一の変数に入れられますか?

編集-思ったようにこれが機能しないことがわかりました...それをくそー!

0