-3

約 150 列で構成される親テーブルが 1 つあります。親テーブルからレコードを取得し、列名とデータ型を持つ 11 の異なる子テーブルに挿入する必要があります。

4

1 に答える 1

2

Oracle には、この場合に役立つ非常に便利な INSERT ALL コマンドがあります。無条件バージョン

の構文は次のとおりです。

INSERT ALL
  INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
  INTO child2 VALUES( col1, col2, col3 )
  INTO child3 ( col1, col2, col3 )
  INTO child4
SELECT col1, col2, col3
FROM parent
-- WHERE some conditions;

デモへのリンク: --> http://sqlfiddle.com/#!4/3eb62/1

上記のコマンドは、(下部にある)parentを使用してテーブルからすべての行を取得SELECT ... FROM ...し、取得したレコードごとにすべての行を実行します。INSERT ...ステートメント。 句に句もある
場合、これらの条件を満たす行のみが挿入されます。 この例のクエリの部分には、さまざまな形式があります。SELECTWHERE conditions

INSERT

  • ソース テーブルと宛先テーブルの列が明示的に定義された完全な形式:

    INTO dest_table( destcol1, ... destcolN ) VALUES (sourcecol1, ..., sourcecolN)

  • ソース テーブルの列のみを指定する短縮形

    INTO dest_table VALUES (sourcecol1, ..., sourcecolN)

  • 宛先テーブルの列のみが指定される別の短縮形

    INTO dest_table( destcol1, ... destcolN )

  • または最も簡単な:

    INTO dest_table


INSERT ALL条件付きバージョンもあります:

INSERT ALL
  WHEN 1=1 THEN INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
  WHEN col1 <> 2 THEN INTO child2 VALUES( col1, col2, col3 )
  WHEN col3 < 3 THEN INTO child3 ( col1, col2, col3 )
  WHEN col2 = 'rec 3' THEN INTO child4
SELECT col1, col2, col3
FROM parent;

デモへのリンク: ---> http://sqlfiddle.com/#!4/e7da3/1 このバージョンは、句

の後に指定された条件が満たされた場合にのみ行を挿入します。選択された行ごとに、常にすべての条件が評価されます。WHEN



別の条件付きフォームもあります。INSERT FIRST

INSERT FIRST
  WHEN col1 >= 4 THEN INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
  WHEN col1 >= 3 THEN INTO child2 VALUES( col1, col2, col3 )
  WHEN col1 >= 2 THEN INTO child3 ( col1, col2, col3 )
  WHEN col1 >= 1 THEN INTO child4
SELECT col1, col2, col3
FROM parent;

デモへのリンク: http://sqlfiddle.com/#!4/a421e/1

ここで、Oracle はソース行ごとに条件を上から下に評価し、いくつかの条件が真の場合、この 1 つのINSERTステートメントのみを実行します。残りの挿入をスキップします。




- - - - 編集 - - - -

手続き的な方法でそれを行う方法の例:

CREATE OR REPLACE PROCEDURE name
AS
BEGIN
   INSERT ALL
      INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
      INTO child2 VALUES( col1, col2, col3 )
      INTO child3 ( col1, col2, col3 )
      INTO child4
   SELECT col1, col2, col3
   FROM parent ;
   -- if commit is required, place it here
   -- COMMIT;
END;
/
于 2013-10-06T11:18:30.400 に答える