SELECT INTO ステートメント
SELECT INTO ステートメントは、最大で 1 つの行を含む結果表を生成します。 このステートメントは、その行の値を変数に割り当てます。 表が空の場合、ステートメントはホスト変数またはグローバル変数に値を割り当てません。
呼びかけ SELECT INTO
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に作成できない実行可能ステートメントです。
承認 SELECT INTO
- ステートメントに指定されたすべての表およびビューに対する SELECT 特権。
- ステートメントに指定されたすべての表およびビューの所有権。
- ステートメントに指定されたすべてのグローバル変数に対する READ 特権。
- ステートメントで指定されるグローバル変数の所有権
- データベースに対する DBADM 権限 (表のみ)
- DATAACCESS 権限
- SYSADM 権限
- SYSCTRL 権限 (カタログ表のみ)
SELECT INTO ステートメントに SQL データ変更ステートメントが 含まれている場合、特権セットには、少なくとも表またはビューに対するその SQL データ変更ステートメントと関連付けられた特権 (INSERT、UPDATE、または DELETE) が含まれている必要があります。
グローバル変数、または配列グローバル変数のエレメントへの割り当ての場合、特権セットには、少なくとも次のいずれかが含まれていなければなりません。

- 変数に対する WRITE 特権
- 変数の所有権
- DATAACCESS 権限
- SYSADM 権限

遷移変数への割り当ての場合、特権セットには、少なくとも次のいずれかが含まれていなければなりません。

- 割り当てステートメントを含むトリガーが定義されている表またはビューに対する UPDATE 特権
- 値が割り当てられる遷移変数に対応する列に対する UPDATE 特権
- 割り当てステートメントを含むトリガーが定義されている表またはビューの所有権
- 割り当てステートメントを含むトリガーが定義されている表が含まれているデータベースに対する DBADM 権限
- DATAACCESS 権限
- SYSADM 権限

特権セット:
アプリケーション・プログラムにこの
ステートメントを組み込む場合、特権セットは、パッケージの所有者が持つ特権となります。 文が動的に準備される場合、権限セットは有効なDYNAMICRULESの動作(run、bind、define、またはinvoke)によって決定され、 DYNAMICRULESの動作と権限チェックにまとめられています。 これらの動作を決定するDYNAMICRULESバインドオプション値の一覧など、 これらの動作の詳細については、 認可IDと動的SQLを参照してください。
構文 SELECT INTO
説明の対象: SELECT INTO
FL500 結果表は、 isolation-clause、 from-clause、 where-clause、 group-by-clause、 having-clause、 order-by-clause、 offset-clause、 fetch-clause、 select-clauseの順に論理的に評価することで導き出される。 Db2 サブシステムで選択されたプランによっては、実際の注文が若干異なる場合があります。 これらの句の説明については、「 クエリ 」のトピックを参照のこと。
文で指定されたテーブルまたはビューは、現在のサーバー、または現在のサーバーが接続を確立できる Db2 サブシステムに存在することができます。
- WITH 共通テーブル式
- 共通テーブル式の指定に関する情報は、 共通テーブル式を参照してください。
- INTO target-variable または array-variable[array-index]
- 出力値の割り当てのための 1 つ以上のターゲットを示します。 INTO 文節内のターゲットの数は、割り当てられる値の数と同じでなければなりません。 結果行の最初の値はリスト中の最初のターゲット、その次の値は 2 番目のターゲット、以下同様に割り当てられます。 INTO 文節内でターゲット変数を複数回指定してはなりません。 各ターゲットへの割り当ては、リストの順番に従って、 割り当てと比較で説明されているルールに従って行われます。
結果列の値の数よりもターゲットの数の方が少ない場合には、SQLCA の SQLWARN3 フィールドに値「W」が割り当てられます。
いずれかの割り当てでエラーが発生すると、エラーが発生したターゲットに値は割り当てられず、それ以上、指定されたターゲットに値は割り当てられません。 既に割り当てられている値はすべて、割り当てられたままとなります。
- global-variable-name
- 割り当てのターゲットとなるグローバル変数を指定します。
- ホスト変数名
- 割り当てのターゲットとなるホスト変数を指定します。 LOB 出力値の場合、ターゲットとして可能なのは正規のホスト変数 (十分な大きさの場合)、LOB ロケーター変数、または LOB ファイル参照変数です。
- SQL-parameter-name
- 割り当てのターゲットとなるパラメーターを識別します。
- SQL-variable-name
- 割り当てターゲットである SQL 変数を識別します。 SQL 変数は、使用する前に宣言しておかなければなりません。
遷移変数名
遷移表で更新される列を指定します。 transition-variable-nameは、トリガのサブジェクトテーブルの列を識別しなければなりません。
- 配列変数 [配列インデックス ]
- 代入のターゲットである配列エレメントを指定します。
ステートメントに common-table-expression も指定されている場合、配列エレメントを代入のターゲットとして指定することはできません。
- array-variable
- 配列変数を指定します。
- [array-index ]
- 配列のどのエレメントが割り当てのターゲットであるかを指定する式。
通常の配列の場合、添字式は INTEGER にキャスト可能でなければならず、NULL 値にすることはできません。 添字の値は、1 から、その配列に定義されている最大カーディナリティーまでの値でなければなりません。
連想配列の場合、配列添字の式は、その連想配列の添字のデータ・タイプにキャスト可能でなければならず、NULL 値であってはなりません。
array-index は、以下のものであってはなりません。
- CURRENT DATE、CURRENT TIME、または CURRENT TIMESTAMP 特殊レジスターを参照する式
- 非 deterministic 関数
- EXTERNAL ACTION を指定して定義された関数
- MODIFIES SQL DATA を指定して定義された関数
- シーケンス式
- スカラー全選択の中にない列。
変数のデータ・タイプには、それに割り当てられる値との互換性がなければなりません。 値が数値の場合、変数にはその値の整数部分を表すだけの容量がなければなりません。 日付または時刻の値の場合、変数は 「代入と比較」 で定義されている最小の長さの文字列変数でなければなりません。
変数への代入は、「代入と比較」 で説明されている規則に従って行われます。 割り当ては、リストされている順に行われます。
SELECT INTO ステートメントの SELECT リスト内の算術式の結果 としてエラー (ゼロによる除算またはオーバーフロー) が発生した場合、 あるいは数値変換エラーが発生した場合、その結果は NULL 値となります。 他の NULL 値の場合と同様に、標識変数を用意しなければなりません。メイン変数は変更されません。 しかし、この場合、標識変数が -2 に設定されます。 ステートメントの処理は、エラーが起こらなかったものとして続行されます。 (ただし、このエラーの場合は SQLCODE が正になります。) 標識変数を用意していない場合には、SQLCA の SQLCODE フィールドに負の値が戻されます。 エラーが検出されると、ステートメントの処理は終了します。
エラーが発生した場合、その変数またはそれ以降の変数に値は割り当てられませんが、既に変数に割り当てられている値はそのままになります。
結果表が複数行となったためにエラーが発生したときは、ホスト変数に値が割り当てられる場合があります。 変数に値が割り当てられても、その値のソースとなる行は未定であり、予測することはできません。
- SKIP LOCKED DATA
- 他トランザクションが、行に対して非互換ロックを保持している場合、その行がスキップされることを示します。 これらの行は、このステートメントで指定されたどのアクセス対象の表に属していても構いません。 SKIP LOCKED DATA を使用できるのは、CS 分離または RS 分離が有効な場合に限定され、行レベル・ロックまたはページ・レベル・ロックにのみ適用されます。
SKIP LOCKED DATA は、有効な分離レベルが反復可能読み取り (WITH RR) または非コミット読み取り (WITH UR) であるときに指定されると、それは無視されます。
- QUERYNO integer
- EXPLAIN 出力とトレース・レコード内でこの SQL ステートメントに使用する番
号を指定します。 この番号は、プラン表の、この SQL ステートメント
に対する情報が入っている行の QUERYNO 列として使用されます。 この番号は、SYSIBM.SYSSTMT と SYSIBM.SYSPACKSTMT の
カタログ表の QUERYNO 列でも使用されます。
この文節を省略すると、その SQL ステートメントに関連付けられる番号は、プリコンパ イル時に割り当てられたステートメント番号となります。 したがって、アプリケーション・プログラムを変更してからプリコンパイルした場合、 ステートメント番号が変更される可能性があります。
QUERYNO 文節を使用してプログラム内の SQL ステートメントに固有の番号を割り当てると、次のことに役立ちます。
- アクセス・パスを選択するための最適化ヒントの使用を単純化する
- SQL ステートメント・テキストとプラン表内の EXPLAIN 出力とを相関させる
最適化ヒントの有効化と使用方法の詳細については、「アクセスパスの選択に影響を与える 」を参照してください。
注釈 SELECT INTO
- ターゲットへの割り当て
- INTO 文節に示される、または SQLDA 内で記述される n 番目のターゲットは、カーソルの結果表の n 列目に対応しています。 ターゲットのデータ・タイプは、その対応する値と互換でなければなりません。 値が数値の場合、ターゲットにはその値の整数部分を表すだけの容量がなければなりません。 datetime値の場合、ターゲットは、datetime値の文字列表現で定義されている最小の長さの文字列変数でなければなりません。 ターゲットがホスト変数の際に、値が NULL の場合は、標識変数を指定しなければなりません。
割り当ては、リストされている順に行われます。 ターゲットへの各割り当ては、「SQLにおける言語要素 」で説明されているルールに従って行われます。 ターゲットの数が行の中の値の数よりも少ない場合は、SQLCA の SQLWARN3 フィールドは W に設定されます。 ターゲットの数が結果列の数より多い場合、警告は出されません。 ターゲットがホスト変数で、値が NULL の場合には、標識変数を指定しなければなりません。 割り当てエラーが発生すると、値はターゲットに割り当てられず、値はそれ以上ターゲットに割り当てられません。 それまでに既にターゲットに割り当てられていた値はそのままになります。
同じ割り当てステートメントに割り当てが複数含まれる場合は、すべての expressions を評価してから割り当てが実行されます。 例えば、式内の変数への参照は、常時、割り当てステートメント内のどの割り当てよりも前の変数の値を使用します。
通常、LOB 列に対してデータの割り当てと取り出しを行うには、LOB ロケーターを使用します。 ただし、互換性規則により、LOB ロケーターを使用して他のデータ・タイプのターゲットにデータを割り当てることもできます。 ロケータの使用方法の詳細については、「LOB ロケータを使用した LOB の操作時のストレージ容量の節約 」を参照してください。
タイム・ゾーンなしのタイム・スタンプの値を、タイム・ゾーン付きのタイム・スタンプのターゲットに割り当てることはできません。
- デフォルト・エンコード・スキーム
- このデータのデフォルトのコード化スキームは、バインド・オプション ENCODING にある値です。このオプションは、アプリケーションのエンコードのためのものです。 このステートメントが LOB ロケーター上で稼働する関数 (LENGTH または SUBSTRING など) と共に使用されている場合で、 かつそのロケーターで指定された LOB データが ENCODING バインド・オプションとは異なるコード化スキームにある場合、 LOB マテリアライズと文字変換が起こります。 LOB マテリアライズと文字変換を防止するには 、SYSIBM.SYSDUMMYA、SYSIBM.SYSDUMMYE、または SYSIBM.SYSDUMMYU サンプル表か ら LOB データを選択します。
- 結果テーブルが空の場合
- 表が空の場合、このステートメントは SQLCODE に +100 を、SQLSTATE に「02000」を割り当て、ホスト変数またはグローバル変数には値を割り当てません。
- 挿入された行の数
- カーソルの SELECT INTO ステートメントに SQL データ変更ステートメントが含まれている場合は、その SELECT INTO 操作によって SQLERRD(3) が挿入された行数に設定されます。
オフセット条項の考慮事項

- offset-文節 は、照会の結果が複数行になる可能性がある場合に、SELECT INTO ステートメントで使用できます。
- どの行が戻されるか操作するために、order-by-clause を使用できます。 order-by-clause を指定すると、結果の行が順序付けされ、指定された行数がスキップされ、最初の行が戻されます。 fetch-節 が指定されておらず、結果表に複数の行が含まれている場合は、エラーが発生します。

フェッチ句の考慮事項
FL 500- fetch-節 は、照会の結果が複数行になる可能性がある場合に、SELECT INTO ステートメントで使用できます。 FETCH FIRST 1 ROW ONLY を指定すると、結果表の行数に関係なく、最大で 1 行を取り出すことができます。
- fetch-節 を使用して結果表を単一行に明示的に制限すると、複数行を返す可能性がある照会で SELECT INTO ステートメントを使用する方法が提供されます。 この文節を使用すると、1 行だけを取り出したいときに カーソルを使用することを避けることができます。 どの行が戻されるか操作するために、order-by-clause を使用できます。 order-by-clause を指定すると、結果の行が順序付けられ、最初の行が戻されます。 fetch-節 が指定されておらず、結果表に複数の行が含まれている場合は、エラーが発生します。

例 SELECT INTO
- 例 1
- DSN8C10.EMPの最大給与をホスト変数MAXSALRYに入力します。
EXEC SQL SELECT MAX(SALARY) INTO :MAXSALRY FROM DSN8C10.EMP; - 例 2
- 従業員528671の行を、 DSN8C10.EMP からホスト構造EMPRECに入力します。
EXEC SQL SELECT * INTO :EMPREC FROM DSN8C10.EMP WHERE EMPNO = '528671' END-EXEC. - 例 3
- 従業員528671の行を、 DSN8C10.EMP からホスト構造EMPRECに入力します。 行は後で更新され、照会の実行時にはデータをロックする必要があるとします。
EXEC SQL SELECT * INTO :EMPREC FROM DSN8C10.EMP WHERE EMPNO = '528671' WITH RS USE AND KEEP EXCLUSIVE LOCKS END-EXEC. - 例 4
- SELECT INTO文を使用して、 INTCOL1 の値を T1 テーブルから配列 MYINTARRAY1 の要素に取得します。この配列は、式 INTCOL2+MYINTVAR+1 の値によってインデックス付けされます。
SELECT INTCOL1 INTO MYINTARRAY1[INTCOL2+MYINTVAR+1] FROM T1 WHERE INTCOL1 = MYINTARRAY1[INTCOL2] ;
