選択ステートメントによる行の挿入

INSERT ステートメントの中で選択ステートメントを使用すると、選択ステートメントの結果表から 0 行、1 行、または 2 行以上を表に挿入することができます。

この種の INSERT ステートメントの使用法の 1 つとして、要約データ用に作成した表にデータを移す場合があります。 例えば、プロジェクトに対する各社員の従事時間を示す表が必要であるとします。 EMPNUMBER 列、PROJNUMBER 列、 STARTDATE 列、および ENDDATE 列が入った EMPTIME という名前の表を作成し、次の INSERT ステートメントを用いて表にデータを入れることができます。

  INSERT INTO CORPDATA.EMPTIME
     (EMPNUMBER, PROJNUMBER, STARTDATE, ENDDATE)
  SELECT EMPNO, PROJNO, EMSTDATE, EMENDATE
    FROM CORPDATA.EMPPROJACT

INSERT ステートメントに組み込む選択ステートメントは、データの取り出しに使用する選択ステートメントと変わりありません。 FOR READ ONLY、FOR UPDATE、または OPTIMIZE 文節を除き、データの取り出しに用いられるすべてのキーワード、関数、および技法を使用することができます。 SQL は、検索条件を満たすすべての行を指定の表に挿入します。 1 つの表から別の表に行を挿入しても、ソース表の既存の行にもターゲット表の既存の行にも影響はありません。

表に複数の行を挿入する場合には、次の点に注意してください。

注 :
  1. INSERT ステートメントに暗黙にまたは明示的にリストされた列の数は、選択ステートメントにリストされた列の数と同じでなければなりません。
  2. 選択ステートメントで指定した INSERT を使用する場合、選択する列のデータは、挿入先の列と互換性がなければなりません。
  3. INSERT に組み込まれた選択ステートメントから行が戻されない場合には、行が挿入されなかったことをユーザーに警告するために SQLCODE 100 が戻されます。行の挿入が正常に行われた場合には、SQLCA の SQLERRD(3) フィールドに、SQL が実際に挿入した行の数を示す整数が入ります。 この値は、GET DIAGNOSTICS ステートメントの ROW_COUNT 診断項目からも使用可能です。
  4. SQL が INSERT ステートメントの実行中にエラーを検出すると、処理を中止します。COMMIT (*CHG)、COMMIT(*CS)、COMMIT (*ALL)、または COMMIT(*RR) の指定があるときは、表には何も挿入されず、負の SQLCODE が返されます。 COMMIT(*NONE) の指定があるときは、エラーの前に挿入された行は表に残っています。