SELECT INTO ステートメント

SELECT INTO ステートメントは、最大 1 行から成る結果表を作成し、 その行の値をホスト変数に割り当てます。

その表が空の場合、ステートメントは、SQLCODE に +100、SQLSTATE に '02000' を割り当て、 ホスト変数には値を割り当てません。 複数の行が検索条件を満たしている場合、 ステートメントの処理は終了し、エラーが発生します (SQLSTATE 21000)。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に作成できない実行可能ステートメントです。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • 表、ビュー、またはニックネームに対する SELECT 特権
  • 表、ビュー、またはニックネームに対する CONTROL 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS 権限
  • DATAACCESS 権限
割り当てのターゲットとして使用されるグローバル変数ごとに、ステートメントの許可 ID は以下のうち 1 つの権限を保持する必要があります。
  • モジュールで定義されていないグローバル変数に対する WRITE 特権
  • モジュールで定義されているグローバル変数のモジュールに対する EXECUTE 特権
  • モジュールで定義されているグローバル変数のモジュールが含まれているスキーマに対する EXECUTEIN 特権
  • モジュールで定義されているグローバル変数のモジュールが含まれているスキーマに対する DATAACCESS 権限

静的 SELECT INTO ステートメントの場合、GROUP 特権は検査されません。

SELECT INTO ステートメントの対象がニックネームの場合は、データ・ソースでステートメントが実行されないうちは、そのデータ・ソース上のオブジェクトに対する特権は考慮されません。 この時点で、データ・ソースに接続するために使用される許可 ID は、データ・ソースのオブジェクトに対して操作を行うのに必要な特権を持っている必要があります。 ステートメントの許可 ID は、データ・ソースの別の許可 ID へマップできます。

構文

Read syntax diagramSkip visual syntax diagram WITH,common-table-expression select-clauseINTO ,assignment-targetfrom-clausewhere-clausegroup-by-clausehaving-clauseorder-by-clause offset-clause fetch-clause FOR READ ONLYFOR UPDATEOF,column-name isolation-clause

assignment-target

Read syntax diagramSkip visual syntax diagram global-variable-namehost-variable-nameSQL-parameter-nameSQL-variable-nametransition-variable-namearray-variable-name[array-index]field-reference

説明

common-table-expessionの説明については、 select-clausefrom-clausewhere-clausegroup-by-clausehaving-clauseorder-by-clauseoffset-clausefetch-clause、および isolation-clause 副選択 (subselect)を参照。

INTO 割り当て-ターゲット
出力値の割り当てのための 1 つ以上のターゲットを示します。

結果行の最初の値はリスト中の最初のターゲット、その次の値は 2 番目のターゲット、以下同様に割り当てられます。 assignment-target への個々の割り当ては、リストに指定された順序で行われます。 割り当てでエラーが発生した場合、値はassignment-targetに割り当てられません。

すべての assignment-target のデータ・タイプが行タイプではない場合、assignment-targets の数が結果列の値の数より少ないと、SQLCA の SQLWARN3 フィールドに値「W」が割り当てられます。

assignment-target のデータ・タイプが行タイプの場合は、assignment-target を 1 つだけ指定し (SQLSTATE 428HR)、列の数が行タイプ内のフィールドの数に一致し、またフェッチされる行の列のデータ・タイプが行タイプの対応するフィールドに割り当て可能である必要があります (SQLSTATE 42821)。

assignment-target のデータ・タイプが配列エレメントの場合は、assignment-target を正確に 1 つだけ指定する必要があります。

グローバル変数名 (global-variable-name)
割り当てのターゲットとなるグローバル変数を指定します。
ホスト変数名 (host-variable-name)
割り当てのターゲットとなるホスト変数を指定します。 LOB 出力値の場合、ターゲットとして可能なのは正規のホスト変数 (十分な大きさの場合)、LOB ロケーター変数、または LOB ファイル参照変数です。
SQL パラメーター名 (SQL-parameter-name)
割り当てのターゲットとなるパラメーターを識別します。
SQL 変数名 (SQL-variable-name)
割り当てターゲットである SQL 変数を識別します。 SQL 変数は、使用する前に宣言しておかなければなりません。
遷移変数名 (transition-variable-name)
遷移行で更新する列を識別します。 transition-variable-name は、新しい値を識別する相関名によってオプションで修飾されている、トリガーのサブジェクト表にある列を識別していなければなりません。
配列変数名 (array-variable-name)
配列タイプの SQL 変数、SQL パラメーター、またはグローバル変数を指定します。
[array-index]
配列のどのエレメントが割り当てのターゲットとなるかを指定する式。 通常配列の場合、array-index 式は INTEGER に割り当て可能でなければならず (SQLSTATE 428H1)、NULL 値にすることはできません。 その値は、1 と、配列に定義された最大カーディナリティーとの間でなければなりません (SQLSTATE 2202E)。 連想配列の場合、array-index 式は連想配列の指標データ・タイプに割り当て可能でなければならず (SQLSTATE 428H1)、NULL 値にすることはできません。
フィールド参照
割り当てのターゲットとなる行タイプ値内のフィールドを指定します。 field-reference は、修飾子がこのフィールドが定義されている行の値を識別する場合、修飾の field-name として指定する必要があります。
FOR READ ONLY または FOR UPDATE
選択した行の意図する利用方法を指定します。 デフォルトは FOR READ ONLY です。
FOR READ ONLY
選択した行を更新用にロックしないことを指定します。
FOR UPDATE
基礎表から選択した行を、後でトランザクション内での行の更新を容易にするためにロックすることを指定します。これは、FOR UPDATE 節が含まれたカーソルの SELECT ステートメントで行われるロックと同様です。
FOR UPDATE は、SELECT INTO ステートメントの結果表が読み取り専用の場合は指定しないでください (SQLSTATE 42829)。

column-name 値をリストする場合、それらの列は更新可能でなければなりません (SQLSTATE 42829)。

列をリストすることの効果はそれらを示すことだけであり、後続の探索済み UPDATE ステートメントが他の列を変更することを制限するものではありません。

ルール

  • コンパウンド SQL (コンパイル済み) ステートメントで定義されていないトリガーの内部、コンパウンド SQL (コンパイル済み) ステートメントで定義されていない関数の内部、メソッドの内部、またはコンパウンド SQL (インライン化) ステートメントの内部で、グローバル変数の割り当てを行うことはできません (SQLSTATE 428GX)。

  • 代替構文: SQL 照会との整合性のため
    • FOR READ ONLY の代わりに FOR FETCH ONLY を指定できます。

  • 例 1: この C の例では、EMP 表の最大給与をホスト変数 MAXSALARY に入れます。
       EXEC SQL SELECT MAX(SALARY)
         INTO :MAXSALARY
         FROM EMP;
  • 例 2: この C の例では、従業員 528671 (EMP 表から) の行をホスト変数に入れます。
       EXEC SQL SELECT * INTO :h1, :h2, :h3, :h4
         FROM EMP
         WHERE EMPNO = '528671';
  • 例 3: この SQLJ の例では、従業員 528671 (EMP 表から) の行をホスト変数に入れます。 その後、その行は検索更新を使用して更新されますが、照会の実行時にはロックされることになります。
       #sql { SELECT * INTO :FIRSTNAME, :LASTNAME, :EMPNO, :SALARY
         FROM EMP
         WHERE EMPNO = '528671'
         FOR UPDATE };
  • 例 4: この C の例では、EMP 表の最大給与をグローバル変数 GV_MAXSALARY に入れます。
       EXEC SQL SELECT MAX(SALARY)
         INTO GV_MAXSALARY
         FROM EMP;