INSERT
INSERT ステートメントは、表またはビューに行を挿入します。 ビューで INSTEAD OF INSERT トリガーが定義されていない場合にそのビューに行を挿入すると、そのビューの基礎になっている表にも行が挿入されます。 そのようなトリガーが定義されていれば、代わりにこのトリガーが活動化されます。
このステートメントには、以下の 4 つの形式があります。
- VALUES を使用した INSERT の形式は、 提供された値または参照された値を使用して、表またはビューに 1 つ以上の行を挿入する時に使用します。
- 全選択を使用する INSERT の形式は、他の表やビューからの値を使用して、表またはビューに 1 つ以上の行を挿入する時に使用します。
- ROWS を使用する INSERT 形式は、ホスト構造体配列で用意されている値を使用して、 表またはビューに複数の行を挿入する場合に使用します。
- INSERT DEFAULT VALUES の形式は、すべての列にデフォルト値を使用して 1 つの行を挿入するときに使用します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは動的に準備できる実行可能なステートメントです。 ただし、ROWS の形式は例外で、アプリケーション・プログラムに組み込まれる静的ステートメントでなければなりません。 REXX プロシージャーでは、n ROWS 形式は使用できません。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- ステートメントに指定された表またはビューに対して、
- その表やビューについての INSERT 特権、および
- 表またはビューが含まれるスキーマに対する USAGE 特権
- データベース管理者権限
全選択 が指定されている場合、ステートメントの権限 ID によって保持される特権には次の 1 つが含まれていなければなりません。
- 全選択 内で識別された、それぞれの表またはビューごとに、
- 表やビューに対する SELECT 特権、および
- 表またはビューが含まれるスキーマに対する USAGE 特権
- データベース管理者権限
SQL 特権に対応するシステム権限については『表またはビューへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-INSERT INTO--+-table-name-+----------------------------------> '-view-name--' >--+-insert-specification-----------------+-------------------->< '-DEFAULT VALUES--+------------------+-' '-isolation-clause-' insert-specification |--+-----------------------+--+-----------------+---------------> | .-,-----------. | '-include-columns-' | V | | '-(----column-name-+--)-' >--+-------------------------+----------------------------------> +-OVERRIDING SYSTEM VALUE-+ '-OVERRIDING USER VALUE---' .-,----------------------------. V | >--+-VALUES----+-+-expression-+-----------+-+--+------------------+-------------------------+--| | | +-DEFAULT----+ | '-isolation-clause-' | | | '-NULL-------' | | | | .-,--------------. | | | | V | | | | '-(----+-expression-+-+--)-' | | +-DEFAULT----+ | | '-NULL-------' | +-insert-multiple-rows--+------------------+---------------------------------------------+ | '-isolation-clause-' | '-+--------------------------------------------------+--fullselect--+------------------+-' | .-,-----------------------. | '-isolation-clause-' | V | | '-WITH--+-----------+----common-table-expression-+-' '-RECURSIVE-' include-columns .-,---------------------------------------------------------------. V | |--INCLUDE--(----column-name--+-------------------------------------+--data-type-+--)--| | .-COLUMN-. | '-FOR--+--------+--system-column-name-' insert-multiple-rows |--+-integer--+--ROWS--VALUES--(--host-structure-array--)-------| '-variable-' isolation-clause |--WITH--+-NC------------------+--------------------------------| +-UR------------------+ +-CS--+------------+--+ | '-KEEP LOCKS-' | +-RS--+-------------+-+ | '-lock-clause-' | '-RR--+-------------+-' '-lock-clause-' lock-clause |--USE AND KEEP EXCLUSIVE LOCKS---------------------------------|
built-in-type |--+-+---SMALLINT---+----------------------------------------------------------------------------------------------------------+--| | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)------------------------. | +-+-+-DECIMAL-+-+--+------------------------------+-------------------------------------------------------------------------+ | | '-DEC-----' | | .-,0--------. | | | '-+-NUMERIC-+-' '-(--integer--+-----------+--)-' | | '-NUM-----' '-, integer-' | | .-(--53--)------. | +-+-FLOAT--+---------------+-+----------------------------------------------------------------------------------------------+ | | '-(--integer--)-' | | | +-REAL---------------------+ | | | .-PRECISION-. | | | '-DOUBLE--+-----------+----' | | .-(--34--)-. | +---DECFLOAT--+----------+--------------------------------------------------------------------------------------------------+ | '-(--16--)-' | | .-(--1--)-------. | +-+-+-+-CHARACTER-+--+---------------+-------------------------------+--+----------------+------------+---------------------+ | | | '-CHAR------' '-(--integer--)-' | +-FOR BIT DATA---+ | | | | '-+-+-CHARACTER-+--VARYING-+--(--integer--)--+-----------------+-' +-FOR SBCS DATA--+ | | | | | '-CHAR------' | '-allocate-clause-' +-FOR MIXED DATA-+ | | | | '-VARCHAR----------------' '-ccsid-clause---' | | | | .-(--1M--)-------------. | | | '---+-CLOB-------------------+----+----------------------+--+-----------------+--+----------------+-' | | +-CHAR LARGE OBJECT------+ '-(--integer--+---+--)-' '-allocate-clause-' +-FOR SBCS DATA--+ | | '-CHARACTER LARGE OBJECT-' +-K-+ +-FOR MIXED DATA-+ | | +-M-+ '-ccsid-clause---' | | '-G-' | | .-(--1--)-------. | +-+---GRAPHIC----+---------------+----------------------------+--+--------------+-------------------------------------------+ | | '-(--integer--)-' | '-ccsid-clause-' | | +-+-GRAPHIC VARYING-+--(--integer--)--+-----------------+---+ | | | '-VARGRAPHIC------' '-allocate-clause-' | | | | .-(--1M--)-------------. | | | '---DBCLOB----+----------------------+--+-----------------+-' | | '-(--integer--+---+--)-' '-allocate-clause-' | | +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-+-NATIONAL CHARACTER-+--+---------------+-------------------------------+---------------------+--+------------------+-+ | | | +-NATIONAL CHAR------+ '-(--integer--)-' | | '-normalize-clause-' | | | | '-NCHAR--------------' | | | | | '-+-+-NATIONAL CHARACTER-+--VARYING-+--(--integer--)--+-----------------+-' | | | | | +-NATIONAL CHAR------+ | '-allocate-clause-' | | | | | '-NCHAR--------------' | | | | | '-NVARCHAR------------------------' | | | | .-(--1M--)-------------. | | | '-----+-+-NATIONAL CHARACTER-+--LARGE OBJECT-+------+----------------------+--+-----------------+-' | | | '-NCHAR--------------' | '-(--integer--+---+--)-' '-allocate-clause-' | | '-NCLOB--------------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-BINARY--+---------------+------------------------------+-----------------+--------------------------------------------+ | | | '-(--integer--)-' | | | | | '-+-BINARY VARYING-+--(--integer--)--+-----------------+-' | | | | '-VARBINARY------' '-allocate-clause-' | | | | .-(--1M--)-------------. | | | '---+-BLOB----------------+----+----------------------+--+-----------------+-' | | '-BINARY LARGE OBJECT-' '-(--integer--+---+--)-' '-allocate-clause-' | | +-K-+ | | +-M-+ | | '-G-' | +-+-DATE-------------------------+------------------------------------------------------------------------------------------+ | | .-(--0--)-. | | | +-TIME--+---------+------------+ | | | .-(--6--)-------. | | | '-TIMESTAMP--+---------------+-' | | '-(--integer--)-' | | .-(--200--)-----. | +-----DATALINK--+---------------+--+-----------------+--+--------------+----------------------------------------------------+ | '-(--integer--)-' '-allocate-clause-' '-ccsid-clause-' | +---ROWID-------------------------------------------------------------------------------------------------------------------+ '---XML--+-----------------+--+--------------+------------------------------------------------------------------------------' '-allocate-clause-' '-ccsid-clause-' allocate-clause |--ALLOCATE--(--integer--)--------------------------------------| ccsid-clause |--CCSID--integer--+------------------+-------------------------| '-normalize-clause-' normalize-clause .-NOT NORMALIZED-. |--+-NORMALIZED-----+-------------------------------------------|
説明
- INTO table-name または view-name
- 挿入操作の対象のオブジェクトを指定します。 この名前は、現行サーバーに存在している表またはビューを識別していなければなりませんが、履歴表、カタログ表、カタログ表のビュー、または挿入可能ではないビューを識別するものであってはなりません。挿入可能なビューの説明については、CREATE VIEWを参照してください。
- DEFAULT VALUES
- 表内のすべての列にデフォルト値が割り当てられることを指定します。 これは、すべての列にキーワード DEFAULT の値をそれぞれ含む値リストを指定することと同じです。 挿入される値は、DEFAULT キーワードの説明にあるように、列がどのように定義されたかによって異なります。
- (column-name,…)
- 値を挿入する列を指定します。
それぞれの名前は、表またはビューの列を識別する名前でなければなりません。
同じ列を複数回指定することはできません。
拡張標識変数が使用できないと、更新不可能なビュー列を識別することはできません。拡張標識変数が使用できず、挿入操作の対象となるビューに上記のような列がある場合は、列名のリストを指定しなければなりません。
この列名のリストから、値を挿入できない列の名前を除外する必要があります。
ビュー内の更新可能な列の説明については、CREATE VIEWを参照してください。
列名のリストを指定しなかった場合は、該当する表またはビューにあるすべての列を左から右の順序で指定したものと見なされます。 隠し属性で定義されたすべての列が省略されます。このリストは、ステートメントを準備するときに確立されるので、ステートメントを準備した後で表に追加した列をリストに指定してはなりません。
INSERT ステートメントがアプリケーションに組み込まれ、参照している表またはビューがプログラムの作成時に存在している場合には、そのステートメントはプログラムの作成時に準備されます。これ以外の場合には、INSERT ステートメントは、そのステートメントの最初の正常な実行時に準備されます。
- include-columns
- 全選択の FROM 文節にネストされているとき、
table-name や view-name などの列と一緒に INSERT ステートメントの中間結果表に組み込まれている列セットを指定します。
include-columns は、table-name や view-name で指定されている列のリストの最後に付加されます。
- INCLUDE
- INSERT ステートメントの中間結果表に組み込まれる列のリストを指定します。 この節は、INSERT ステートメントが全選択の FROM 文節にネストされている場合にのみ指定できます。
- column-name
- INSERT ステートメントの中間結果表の列を指定します。 この名前は、他の組み込み列や table-name または view-name 内の列と同一の名前にはできません。
- FOR COLUMN system-column-name
- 列の IBM® i 名を指定します。 この名前は、INCLUDE 列リスト内、または table-name や view-name 内のいずれかの column-name または system-column-name と同一であってはなりません。
- data-type
- 組み込み列のデータ・タイプを指定します。 data-type の説明は、CREATE TABLEを参照してください。 DATALINK データ・タイプを使用した場合は、FILE LINK CONTROL を使用できません。
- OVERRIDING SYSTEM VALUE または OVERRIDING USER VALUE
- ROWID、識別、または行変更タイム・スタンプ列に、システムが生成した値やユーザーが指定した値を使用するかどうかを指定します。OVERRIDING SYSTEM VALUE を指定する場合は、INSERT ステートメントの
対象とする暗黙または明示的な列リストに、GENERATED ALWAYS として定義さ
れた ROWID 列、ID 列、または行変更タイム・スタンプ列が含まれていることが必要です。
OVERRIDING USER VALUE を指定する場合は、INSERT ステートメントの対象と
する暗黙または明示的な列リストに、GENERATED ALWAYS また
は GENERATED BY DEFAULT として定義された列が含まれていることが必要です。
- OVERRIDING SYSTEM VALUE
- GENERATED ALWAYS として定義されている ROWID 列、ID 列、または行変更タイム・スタンプ列について、VALUES 文節に 指定されている値または全選択の結果として得られた値を使用することを指定します。 システム生成の値は挿入されません。
- 行開始列、行終了列、トランザクション開始 ID 列、または生成式列の値が提供された場合、 それは DEFAULT でなければなりません。
- OVERRIDING USER VALUE
- GENERATED ALWAYS または GENERATED BY DEFAULT として定義され ている列について、VALUES 文節に指定されている値または全選択の結果とし て得られた値を無視することを指定します。 代わりにシステム生成の値が挿入され、ユーザー指定の値はオーバーライドされます。
OVERRIDING SYSTEM VALUE と OVERRIDING USER VALUE のどちらも指定し ない場合は、以下のようになります。
- GENERATED ALWAYS として定義された ROWID 列、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、 および生成式列に、DEFAULT 以外の値を指定することはできません。
- GENERATED BY DEFAULT として定義された ROWID、識別、または行変更タイム・スタンプ列には、値を指定することができます。値を指定した場合は、この列にその値が割り当てられます。
ただし、BY DEFAULT として定義された ROWID 列に値を挿入できるのは、指定された値が、Db2® for z/OS® または Db2 for
i によって既に生成されている有効な行 ID 値である場合のみです。
BY DEFAULT として定義された識別または行変更タイム・スタンプ列に値を挿入した場合は、その識別または行変更タイム・スタンプ列が固有制約または固有索引内の唯一のキーである場合以外は、データベース・マネージャーはその指定された値が該当の列についての固有な値であるかどうかを検査しません。固有制約も固有索引もない場合は、データベース・マネージャーは、NO CYCLE が有効である
場合に限り、システム生成の値のセットの中でのみ各値の固有性を保証します。
値が指定されていない場合は、データベース・マネージャーは新しい値を生成します。
- VALUES
- 挿入する 1 つ以上の新しい行を指定します。
この文節に指定する各変数は、ホスト構造体や変数の宣言の規則に従って 宣言されているホスト構造体または変数を識別していなければなりません。 このステートメントの操作形式では、ホスト構造体に対する参照は、 その個々の変数それぞれに対する参照によって置き換えられます。 変数と構造についての詳細は、ホスト変数に対する参照および ホスト構造を参照してください。
VALUES 文節内の各行の値の数は、暗黙的または明示的な列のリスト、および INCLUDE 文節で識別された列にある名前の数と一致していなければなりません。リストの最初の列には VALUES 文節の最初の値が挿入され、 リストの 2 番目の列には VALUES 文節の 2 番目の値が挿入されるというように、 指定した列に対応する値が順に挿入されます。
- expression
- 集約関数または列名を含まない、式で説明されているタイプの expression。式 が変数 の場合、その変数は構造体を識別できます。 拡張標識変数が使用可能で、式が単一変数でない場合、DEFAULT および UNASSIGNED の拡張標識変数値は、その式に対して使用してはなりません。
- DEFAULT
- 列にデフォルト値を割り当てることを指定します。挿入する値は、次のように、列がどのように定義されたかによって異なります。
- 式に基づく生成列として列が定義されている場合は、 その式に基づいた列の値がデータベース・マネージャーによって生成されます。
- 列が ROWID 列、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、またはトランザクション開始 ID 列の場合、 データベース・マネージャーは新しい値を生成します。
- WITH DEFAULT 文節が使用される場合、挿入されるデフォルト値は、 その列に関して定義されている値になります (CREATE TABLEの列定義 のデフォルト文節 を参照してください)。
- WITH DEFAULT 文節または NOT NULL 文節が使用されない場合、挿入される値は NULL です。
- NOT NULL 文節が使用されていて、WITH DEFAULT 文節が使用されていないか、 DEFAULT NULL が使用されている場合、その列については DEFAULT キーワードは指定できません。
GENERATED ALWAYS として定義されている ROWID 列または 生成列については、OVERRIDING USER VALUE を指定することによりユーザー指定の値を無視してシステム生成の固有値を挿入することを指示した場合以外は、DEFAULT を指定する必要があります。
- NULL
- 列の値を NULL 値にすることを指定します。NULL は、NULL 可能列にのみ指定してください。
- WITH common-table-expression
- 共通表式を指定します。共通表式については、共通表式を参照してください。
- fullselect
- 全選択の結果表の形式で、新しい行の集合を指定します。
結果表が空の場合、SQLSTATE は「02000」に設定されます。
全選択 の説明については、全選択を参照してください。
INSERT の基本オブジェクトと、全選択 内のいずれかの副選択の基本オブジェクトが同じ表であるとき、その選択ステートメントは、行が挿入される前にすべて評価されます。
結果表の列の数と、列名 のリストに暗黙的または明示的に指定した名前の数は同じでなければなりません。 リストの最初の列には、結果表の最初の列の値が挿入され、リストの 2 番目の列には、結果表の 2 番目の列が挿入されるというように、対応する列の値が順に挿入されます。
- isolation-clause
- このステートメントに関して使用する分離レベルを指定します。
- WITH
-
分離レベルを指定します。次のいずれかになります。
- RR 反復可能読み取り
- RS 読み取り固定
- CS カーソル固定
- UR 非コミット読み取り
- NC コミットなし
insert-multiple-rows
- 整数 または 変数 ROWS
- 挿入する行数を指定します。変数 を指定する場合、その変数は位取りゼロの数値でなければならず、また標識変数を含むことはできません。
- VALUES (ホスト構造体配列)
- ホスト構造体の配列の形式で新しい一連の行を指定します。ホスト構造体配列 は、
その宣言の規則に従ってプログラムで宣言されていなければなりません。
ホスト構造体配列 名の代わりに、パラメーター・マーカーを使用することはできません。
ホスト構造の変数の数は、暗黙的または明示的な列のリスト、および INCLUDE 文節で識別された列にある名前の数と一致していなければなりません。配列の最初のホスト構造体は最初の行に対応し、配列の 2 番目のホスト構造体は 2 番目の行に対応します。以下同様です。 さらに、ホスト構造体の最初の変数は、該当の行の最初の列に対応し、ホスト構造体の 2 番目の変数は、該当の行の 2 番目の列に対応します。以下同様です。
ホスト構造の配列についての説明は、ホスト構造配列を参照してください。
現行接続が非リモート・サーバーへの接続の場合、insert-multiple-rows は使用できません。 RPG/400® または PL/I プログラムのデータ変更参照では、複数行挿入 は使用できません。
INSERT の規則
デフォルト値: 列のリストに指定されていない列には、その列のデフォルト値が挿入されます。 デフォルト値を持たない列は、列リストに含めなければなりません。同様に、INSTEAD OF INSERT トリガーを使用せずビューに値を挿入する場合に、そのビューに含まれていない基本表の列があれば、基本表の該当する列には、 デフォルト値が挿入されます。 このため、ビューに入っていない基本表の列は、すべて デフォルト値を持っています。
割り当て: 挿入する値は、言語エレメントで説明されている記憶域割り当て規則に従って、列に割り当てられます。
妥当性検査: 挿入操作は、以下の規則に従う必要があります。以下の規則に従わない場合や、INSERT ステートメントの実行中にその他のエラーが発生した場合は、行が挿入されません。ただし、COMMIT(*NONE) を指定した場合は例外です。
- 固有制約および固有索引: 識別された表、または識別されたビューの基本表が 1 つ以上の固有索引または固有制約を持つ場合は、表に挿入される各行は、それらの索引および制約によって課せられる制限に適合しなければなりません (SQLSTATE 23505)。
すべての固有性検査は、COMMIT(*NONE) の指定がある場合を除き、そのステートメントの終わりで実際に行われます。複数行 INSERT ステートメントの場合、このチェックはすべての行が挿入された後に行われます。COMMIT(*NONE) が指定されている場合は、各行が挿入されるごとにチェックが行われます。
- 検査制約: 識別された表、または識別されたビューの基本表が、1 つ以上の検査制約を持つ場合、表に挿入される各行ごとに、検査制約は真または不明でなければなりません (SQLSTATE 23513)。
検査制約は、ステートメントの終わりで必ずチェックされます。複数行 INSERT ステートメントの場合、このチェックはすべての行が挿入された後に行われます。
- ビューと CHECK OPTION 文節: ビューが識別されている場合は、挿入される行は適用される CHECK OPTION 文節に適合しなければなりません (SQLSTATE 44000)。詳しくは、CREATE VIEWを参照してください。
トリガー: 識別された表または識別されたビューの基本表が挿入トリガーを持つ場合、 トリガーが起動されます。 トリガーが起動された結果、挿入する値に 応じて、他のステートメントが実行されたり、エラー条件が発生したりする ことがあります。 INSERT ステートメントをデータ変更表参照 として使用すると、挿入行の変更を試みる AFTER INSERT トリガーがエラーを起こします。
参照保全: 外部キーの非 NULL の挿入値は、 関連の親表の親キーの値のいずれかに等しくなければなりません。
参照制約 (RESTRICT 削除規則を伴う参照制約以外の) は、ステートメントの終わりで実際上チェックされます。 複数行 INSERT ステートメントの場合、これはすべての行が挿入され、関連のトリガーが起動された後で行われます。
INSERT ステートメントをデータ変更表参照 として使用すると、挿入行の変更を試みるいずれかの参照制約がエラーを起こします。
XML 値: XML 列に挿入する値は、整形式 XML 文書でなければなりません。
- 新しい行の値を導出するときに列が参照されている場合に、その列に対して有効な列マスクがあれば、マスクされた値が新しい値を導出するために使用されます。オブジェクト表でも列アクセス制御がアクティブになっている場合、
新しい値を導出するために適用される列マスク
は、定数や式ではなく、列自体を戻す必要があります。列マスクを列に適用した結果が列自体にならない
場合、新しい値は挿入に使用できず、エラーが戻されます。
OVERRIDING USER VALUE 文節を指定する場合は、新しい行内の対応する値は無視されるので、列マスクに関する上記の規則はこれらの値には適用できません。
- 行を挿入でき、表に関する BEFORE INSERT トリガーがある場合、このトリガーがアクティブになる。
トリガー・アクション内で、挿入対象の新しい値を遷移変数中で変更できます。トリガーから値が戻る際に、新しい値については最後の値が挿入対象になります。
- 挿入される行は、有効な行の許可に準拠しなければならない。
表に関する使用可能な行の許可が複数定義されている場合、行アクセス制御検索条件は、それぞれの使用可能な行の許可内の検索条件に対して論理 OR 演算子を適用することにより派生します。有効な行の許可のすべてに準拠する行は、挿入された場合にも、行アクセス制御検索条件を使用して取り戻すことができます。
- 行を挿入でき、表に関する AFTER INSERT トリガー がある場合、このトリガーがアクティブになる。
前述の規則は include-columns には適用されません。 include-columns は、マスクされているかどうかに関わらず、割り当てられるすべての値を受け入れます。
マスクされた データを、挿入操作の値として使用される変数に割り当てることが できます。列に挿入違反チェック制約が存在 しない場合、マスクされたデータが列に挿入され、 エラーは発行されません。
拡張標識変数の使用: 使用可能な場合は、正の値および 0 (ゼロ) から -7 以外の標識変数値を設定しないでください。 DEFAULT および UNASSIGNED 拡張標識変数値を、それらがサポートされていないコンテキストに指定しないでください。
拡張標識変数: INSERT ステートメントにおける UNASSIGNED の拡張標識値には、列をデフォルト値に設定する効果があります。
更新可能でないターゲット列は、GENERATED ALWAYS として定義されている生成列でない限り、拡張標識変数値 UNASSIGNED が割り当てられなければなりません。 ターゲット列が GENERATED ALWAYS として定義される生成列である場合は、拡張標識変数値 DEFAULT または UNASSIGNED をこれに割り当てる必要があります。
拡張標識変数と挿入トリガー: 拡張標識変数の有無により、挿入トリガーの起動に変更が生じることはありません。暗黙的または明示的な列リスト内のすべての列に、拡張標識変数に基づく UNASSIGNED 値または DEFAULT が割り当てられている場合、すべての列に個別の DEFAULT 値を持つ挿入が試行され、これが正常に完了すると、挿入トリガーが起動されます。
拡張標識変数とエラー検査の据え置き: 拡張標識変数が使用可能な場合、更新不可能な列への挿入を認識するために、ステートメント準備の間に通常行われる妥当性検査は、ステートメントが実行されるまで据え置かれます。
注
挿入操作エラー: COMMIT(*NONE) を指定していない状態で、挿入値がいずれかの制約に違反している場合や、その他のエラーが INSERT ステートメントの実行中に発生した場合は、そのステートメントとトリガー SQL ステートメントによる変更がすべてロールバックされます。ただし、エラーが発生する前に、その作業単位の中で行われていたその他の変更はロールバックされません。COMMIT(*NONE) が指定されていれば、変更がロールバックされることはありません。
挿入された行数: INSERT ステートメントの実行後、 SQL 診断領域の ROW_COUNT ステートメント情報項目 (または SQLCA の SQLERRD(3)) は、 データベース・マネージャーが挿入した行の数となります。 ROW_COUNT 項目には、トリガーの結果として挿入された行の数は含まれません。
ROW_COUNT についての説明は、GET DIAGNOSTICSを参照してください。SQLCA についての説明は、SQLCA (SQL 連絡域)を参照してください。
ロッキング: COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、 または COMMIT(*CHG) が指定されている場合は、正常に実行される INSERT ステートメントの実行中に、 1 つ以上の排他的ロックが掛けられます。 そのようなロックがコミットまたはロールバック操作によって解放されるまで、 挿入された行は、以下によってのみアクセスすることができます。
- その挿入を行ったアプリケーション・プロセス
- 読み取り専用操作を介して、COMMIT(*NONE) または COMMIT(*CHG) を使用する別のアプリケーション・プロセス
ロックは、他のアプリケーション・プロセスがその表の操作を行うのを防止します。 ロッキングの詳細については、COMMIT、ROLLBACK、および LOCK TABLE ステートメントの説明を参照してください。 また、分離レベルおよび「データベース・プログラミング」も参照してください。
FINAL TABLE を指定した際に、INSERT をデータ変更表参照 として使用すると、SELECT が完了するまで、ロックは挿入行に置かれます。 これらのロックは、挿入行の変更を試みる AFTER TRIGGER などによる、同一のジョブ内からの挿入行に対する間接的な変更を妨げる可能性があります。 これらのロックは、COMMIT(*NONE) を含め、すべての分離レベルに対して獲得されます。
COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、または COMMIT(*CHG) を指定し た場合は、1 つの INSERT ステートメントで最高 500 000 000 行を挿入または変 更することができます。 変更される行の数には、トリガーの結果として同じコミットメント定義のもとで挿入、更新、または削除される行が含まれます。
生成列: GENERATED ALWAYS として定義された生成列は、VALUES リスト中の対応する項目が DEFAULT でない限り、列リスト に指定しないでください。 ユーザーは、OVERRIDING USER VALUE 文節を指定して、ユーザー指定の値が無視され、INSERT の時点のシステム生成値がこの列に挿入されるように指示することができます。
- 行開始列に割り当てられる値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 行開始列の値は、トランザクション全体にわたり固有になるようにデータベース・マネージャーによって生成されます。 単一の SQL トランザクション内で複数の行が挿入される場合、行開始列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
- 行終了列には、この列 (9999-12-30-00.00.00.000000000000) の最大値が割り当てられます。
- トランザクション開始 ID 列には、トランザクションごとに固有のタイム・スタンプ値、または NULL 値が割り当てられます。 トランザクション開始 ID 列が NULL 可能である場合には、この列に NULL 値が割り当てられます。 それ以外の場合、この値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 単一の SQL トランザクション内で複数の行が挿入される場合、トランザクション開始 ID 列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
システム期間テンポラル表への挿入: システム期間テンポラル表に行を挿入するとき、データベース・マネージャーは、行開始列、行終了列、またはトランザクション開始 ID 列を持つ表に対する指示に従って列に値を割り当てます。また、行を挿入するとき、そのシステム期間テンポラル表に関連付けられた履歴表に行は追加されません。
CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターに NULL 以外の値が設定され、 SYSTIME オプションの値が YES の場合は、INSERT ステートメントの基礎ターゲットを、システム期間テンポラル表にすることはできません。この制限は、システム期間テンポラル表への参照が直接か間接かにかかわらず適用されます。
REXX: 変数は、REXX プロシージャー内の INSERT ステートメントでは使用できません。INSERT を使用する場合は、必ず、パラメーター・マーカーを使用する PREPARE および EXECUTE の対象として使用してください。
代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード NONE を NC の同義語として使用することができます。
- キーワード CHG を UR の同義語として使用することができます。
- キーワード ALL を RS の同義語として使用することができます。
例
例 1: 以下の仕様を持つ新規の部門を、DEPARTMENT 表に挿入します。
- 部門番号 (DEPTNO) は ‘E31’
- 部門名 (DEPTNAME) は ‘ARCHITECTURE’
- その管理者の社員番号 (MGRNO) は ‘00390’
- 報告先の部門 (ADMRDEPT) は ‘E01’
INSERT INTO DEPARTMENT
VALUES ('E31', 'ARCHITECTURE', '00390', 'E01')
例 2: 例 1 と同様に新規の部門を DEPARTMENT 表に挿入します。ただし、この新規の部門には管理者を割り当てません。
INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT)
VALUES ('E31', 'ARCHITECTURE', 'E01')
例 3: EMPPROJACT 表と同じ列構成で、表 MA_EMPPROJACT を作成します。 EMPPROJACT 表からプロジェクト番号 (PROJNO) が文字「MA」で始まっている行を、データとして MA_EMPPROJACT に追加します。
CREATE TABLE MA_EMPPROJACT LIKE EMPPROJACT
INSERT INTO MA_EMPPROJACT
SELECT * FROM EMPPROJACT
WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
例 4: Java プログラムのステートメントを使用して、接続コンテキスト「ctx」上の PROJECT 表にプロジェクトの骨組みを追加します。プロジェクト番号 (PROJNO)、プロジェクト名 (PROJNAME)、部門番号 (DEPTNO)、 および管理担当者 (RESPEMP) の値は、ホスト変数から入手します。 プロジェクト開始日付 (PRSTDATE) には、現在の日付を使用します。 表内のその他の列には、NULL 値を割り当てておきます。
#sql [ctx] { INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE)
VALUES (:PRJNO, :PRJNM, :DPTNO, :REMP, CURRENT DATE) };
例 5: 例 2 と同じように 1 つのステートメントを 使用して 2 つの新しい部門を表 DEPARTMENT に挿入します。 ただし、この新しい部門には管理担当者を割り当てません。
INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT)
VALUES ('B11', 'PURCHASING', 'B01'),
('E41', 'DATABASE ADMINISTRATION', 'E01')
例 6: PL/I プログラムで、複数行 INSERT を使用して、 表 DEPARTMENT に 10 行を追加します。 挿入するデータは、ホスト構造体配列 DEPT に入っています。
DCL 1 DEPT(10),
3 DEPT CHAR(3),
3 LASTNAME CHAR(29) VARYING,
3 WORKDEPT CHAR(6),
3 JOB CHAR(3);
EXEC SQL INSERT INTO DEPARTMENT 10 ROWS VALUES (:DEPT);
例 7: READ UNCOMMITTED (UR, CHG) オプションを使用して、 EMPPROJACT 表に新しいプロジェクトを挿入します。
INSERT INTO EMPPROJACT
VALUES ('000140', 'PL2100', 30)
WITH CHG
例 8: SELECT ステートメントで、INSERT ステートメントをデータ変更表参照 として指定します。 VALUE 節で値が指定されている組み込み列を余分に定義し、それを、挿入される行の配列用の列として使用します。
SELECT inorder, ordernum
FROM FINAL TABLE (INSERT INTO ORDERS (CUSTNO)
INCLUDE(INSERTNUM INTEGER)
VALUES (:cnum1, 1),
(:cnum2, 2)) InsertedOrders
ORDER BY insertnum