マルチテーブル挿入の制限は次のとおりです。
- 複数テーブルの挿入ステートメントのどの部分にもシーケンスを指定することはできません。マルチテーブル挿入は、単一のSQLステートメントと見なされます。したがって、NEXTVALへの最初の参照は次の番号を生成し、ステートメント内の後続のすべての参照は同じ番号を返します。
これは完全に真実ではありません。シーケンスを使用できます。常に同じ値を取得するため、同じシーケンスを参照することで、親レコードと子レコードを一度に作成すると便利です。
引き続きinsert all
を使用する場合 あなたはできた シーケンス値を取得する非決定論的関数を使用して、これを回避します。
CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
RETURN postal_code_seq.nextval;
END;
/
INSERT ALL
INTO POSTAL_CODE( postal_code,description)
VALUES(get_seq,'Coimbatore')
INTO POSTAL_CODE (postal_code,description)
VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;
2 rows inserted.
SELECT * FROM postal_code;
POSTAL_CODE DESCRIPTION
--------------------------------------- --------------------
1 Coimbatore
2 Mumbai
しかし、それは少し厄介です。おそらく、個々の挿入ステートメントを使用する方が良いでしょう-単一のテーブルに複数のテーブルを挿入することは、とにかく実際にはあまり得られません-シーケンスから一意の列を設定するトリガー、または値を生成するためのCTE/インラインビュー挿入します。