マルチテーブルの挿入に関する制限事項は次のとおりです。
- マルチテーブル挿入ステートメントのどの部分にもシーケンスを指定することはできません。複数テーブルの挿入は、単一の 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 /インラインビュー挿入します。