約 150 列で構成される親テーブルが 1 つあります。親テーブルからレコードを取得し、列名とデータ型を持つ 11 の異なる子テーブルに挿入する必要があります。
1 に答える
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 ...
ステートメント。
句に句もある
場合、これらの条件を満たす行のみが挿入されます。
この例のクエリの部分には、さまざまな形式があります。SELECT
WHERE 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;
/