SET 変数ステートメント

SET 変数ステートメントは、変数に値を割り当てます。

このステートメントは、トランザクションの制御下にありません。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

遷移変数を参照するには、トリガー作成者の許可 ID によって保持されている特権には、 少なくとも以下の権限のいずれかが含まれていなければなりません。
  • 割り当ての左辺で参照されているすべての列に対する UPDATE 特権、 および右辺で参照されているすべての列に対する SELECT 特権。
  • 表 (トリガーのサブジェクト表) での CONTROL 特権
  • DATAACCESS 権限
割り当てステートメントの右辺でグローバル変数が参照される場合、ステートメントの許可 ID は以下の権限のうち 1 つの特権を保持する必要があります。
  • モジュールで定義されていないグローバル変数に対する READ 特権
  • モジュールで定義されているグローバル変数のモジュールに対する EXECUTE 特権
割り当てステートメントの左辺でグローバル変数に値が割り当てられる場合、ステートメントの許可 ID は以下の権限のうち 1 つの特権を保持する必要があります。
  • モジュールで定義されていないグローバル変数に対する WRITE 特権
  • モジュールで定義されているグローバル変数のモジュールに対する EXECUTE 特権

割り当ての右側に 行全選択 を指定してこのステートメントを実行するには、許可 ID ステートメントの によって保持されている特権が必要です。 行全選択を実行するために必要な特権を組み込みます。 『SQL 照会』の許可セクションを参照してください。

選択ステートメントを使用する cursor-value-constructor を指定してこのステートメントを実行するには、ステートメントの許可 ID によって保持される特権に、 選択ステートメントを実行するために必要な特権が含まれている必要があります。 『SQL 照会』の許可セクションを参照してください。

構文

Read syntax diagramSkip visual syntax diagramSET,target-variable=expressionNULLDEFAULT(,target-variable)=(,expressionNULLDEFAULT)(row-fullselect)boolean-variable-name=search-conditionTRUEFALSENULLarray-variable-name[array-index]=expressionNULLtarget-cursor-variable=cursor-variable-namecursor-value-constructorNULLtarget-row-variable=(,expressionNULL)(row-fullselect)row-expressionNULL
target-variable
Read syntax diagramSkip visual syntax diagramglobal-variable-namehost-variableparameter markerSQL-parameter-namefield-referenceSQL-variable-nametransition-variable-name..attribute-name
field-reference
Read syntax diagramSkip visual syntax diagramrow-variable-name.field-name
cursor-value-constructor
Read syntax diagramSkip visual syntax diagram ASENSITIVEINSENSITIVE CURSOR (,parameter-declaration) holdabilityFOR select-statementstatement-name1
parameter-declaration
Read syntax diagramSkip visual syntax diagramparameter-namedata-type
data-type
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-parameter-data-typedistinct-type-name
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA2CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XML
anchored-parameter-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nametable-name.column-name
holdability
Read syntax diagramSkip visual syntax diagramWITHOUT HOLDWITH HOLD
target-row-variable
Read syntax diagramSkip visual syntax diagramglobal-variable-nameparameter markerSQL-parameter-nameSQL-variable-namerow-array-element-specificationrow-field-reference3
Notes:
  • 1 statement-name cannot be specified if parameter-declaration is specified.
  • 2 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
  • 3 The data type must be a row type.

説明

ターゲット変数 (target-variable)
割り当てのターゲット変数を識別します。 同じ変数を表す target-variable を複数指定することはできません (SQLSTATE 42701)。
グローバル変数名 (global-variable-name)
割り当てのターゲットとなるグローバル変数を指定します。 global-variable-name は、現在のサーバーに存在するグローバル変数を識別するものでなければなりません (SQLSTATE 42704)。
ホスト変数
割り当てのターゲットとなるホスト変数を指定します。
パラメーター・マーカー
割り当てのターゲットとなるパラメーター・マーカーを指定します。
SQL パラメーター名 (SQL-parameter-name)
割り当てのターゲットとなるパラメーターを識別します。 そのパラメーターは、CREATE PROCEDURE ステートメントの parameter-declaration で指定しなければなりません。
フィールド参照
割り当てのターゲットとなる行タイプ値内のフィールドを指定します。
行変数名 (row-variable-name)
行タイプであるデータ・タイプを持つ変数の名前。
field-name
行タイプ内のフィールドの名前。
SQL 変数名 (SQL-variable-name)
割り当てターゲットである SQL 変数を識別します。 SQL 変数は、使用する前に宣言しておかなければなりません。
遷移変数名 (transition-variable-name)
遷移行で更新する列を識別します。 transition-variable-name は、新しい値を識別する相関名によってオプションで修飾されている、 トリガーのサブジェクト表にある列を識別していなければなりません (SQLSTATE 42703)。
..attribute-name
設定されている構造化タイプの属性 (属性割り当て という) を指定します。 指定する SQL-variable-name または transition-variable-name は、 ユーザー定義の構造化タイプで定義されていなければなりません (SQLSTATE 428DP)。 ..attribute-name は、構造化タイプの属性でなければなりません (SQLSTATE 42703)。 ..attribute-name 節と関係のない割り当ては、通常の割り当て と見なされます。
expression
割り当てのターゲットの新しい値を指定します。 この expression (式) として、『式』で説明されているタイプの式はいずれも使用することができます。 スカラー fullselect で使用される場合を除き、集約関数を組み込むことはできません (SQLSTATE 42903)。 CREATE TRIGGER ステートメントのコンテキストにおいて、 expression は OLD および NEW 遷移変数への参照を含むことができます。 遷移変数は、correlation-name で修飾されていなければなりません (SQLSTATE 42702)。
ヌル
NULL 値を指定します。 割り当ての宛先が行変数である場合、各フィールドに NULL 値が割り当てられます。 属性のデータ・タイプに特別にキャストされた場合を除いて、NULL を属性割り当ての値にすることはできません (SQLSTATE 429B9)。
DEFAULT
デフォルト値が使用されることを指定します。

SQL プロシージャーでは、静的 SQL ステートメントに対してのみ DEFAULT 節を指定できます。 ただし、例外として、動的 SQL ステートメント内で target-variable がグローバル変数である場合には、DEFAULT 節を指定できます。

target-variable が列であれば、挿入される値は、どのように列が 表に定義されているかによって異なります。
  • 列が WITH DEFAULT 節で定義されている場合、値は、その列に定義されたデフォルトに設定されます (『ALTER TABLE』の default-clause を参照してください)。
  • 列が IDENTITY 節で定義されている場合、値はデータベース・マネージャーによって生成されます。
  • 列が WITH DEFAULT 節、IDENTITY 節、または NOT NULL 節のいずれも指定せずに定義されている場合、 値は NULL になります。
  • 列が NOT NULL 節で定義されている場合で、次のいずれかに該当する場合には、 列に DEFAULT キーワードを指定できません (SQLSTATE 23502)。
    • IDENTITY 節が使用されていない
    • WITH DEFAULT 節が使用されていない
    • DEFAULT NULL が使用されている
    その列に対して DEFAULT キーワードを指定できません (SQLSTATE 23502)。
target-variable が SQL 変数であれば、挿入される値は、 変数宣言に指定または暗黙指定されているデフォルトになります。

target-variable がグローバル変数である場合、挿入される値は、変数の作成時に指定されたデフォルト値です。

target-variable が SQL プロシージャー内の SQL 変数または SQL パラメーター、ホスト変数、またはパラメーター・マーカーであれば、DEFAULT キーワードは指定できません (SQLSTATE 42608)。

行全選択
割り当てに指定されているターゲット変数 または 行変数のフィールドの数に対応する列数とともに、単一行を返す全選択です。 値は、対応するターゲット変数またはフィールドそれぞれに割り当てられます。 row-fullselect の結果が行なしであれば、NULL 値がリスト内のターゲット変数に割り当てられるか、または行変数への割り当てでは単一の NULL が割り当てられます。 CREATE TRIGGER ステートメントのコンテキストにおいて、 row-fullselect には OLD および NEW 遷移変数への参照を含めることができます。 その際、どの遷移変数が使用されるかを指定するために correlation-name で修飾する必要があります (SQLSTATE 42702)。 結果に行が複数ある場合、エラーが返されます (SQLSTATE 21000)。
ブール変数名 (boolean-variable-name)
SQL 変数またはパラメーターまたはグローバル変数を指定します。 変数またはパラメーターはブール・タイプでなければなりません (SQLSTATE 428H0)。 SET ステートメントは、コンパウンド SQL (コンパイル済み) ステートメント内で発行されなければなりません (SQLSTATE 428H2)。
検索条件
結果が真、偽、または不明である検索条件。 結果が不明の場合は、ブール値 NULL として戻されます。
はい
ブール値を TRUE に指定します。
いいえ
ブール値を FALSE に指定します。
ヌル
ブール値を NULL に指定します。
配列変数名 (array-variable-name)
配列タイプの SQL 変数、SQL パラメーター、またはグローバル変数を指定します (SQLSTATE 428H0)。
[配列指標]
配列のどのエレメントが割り当てのターゲットとなるかを指定する式。 通常配列の場合、array-index は INTEGER に割り当て可能でなければなりません (SQLSTATE 22018 または 428H1)。 その値は、1 と、配列に定義された最大カーディナリティーとの間でなければならず、NULL 値にすることはできません (SQLSTATE 2202E)。
連想配列の場合、配列指標の式は連想配列の指標データ・タイプに割り当て可能でなければならず (SQLSTATE 22018 または 428H1)、NULL 値にすることはできません (SQLSTATE 2202E)。
ターゲット・カーソル変数
カーソル変数を指定します。 target-cursor-variable のデータ・タイプは、カーソル・タイプでなければなりません (SQLSTATE 42821)
カーソル変数名 (cursor-variable-name)
同じカーソル・タイプ ターゲット・カーソル変数 としてのカーソル変数を識別します。
cursor-value-constructor
cursor-value-constructor には、ターゲット変数に関連付けられている select-statement を指定します。 cursor-value-constructor をカーソル変数に割り当てると、そのカーソル変数の基礎カーソルが定義されます。
ASENSITIVE または INSENSITIVE
カーソルが変更に対してアセンシティブかインセンシティブか指定します。 詳しくは、『DECLARE CURSOR』を参照してください。 デフォルトは ASENSITIVE です。
ASENSITIVE
カーソルが、結果表の元になっている行に対する挿入、アップデート、削除に可能な限りセンシティブになるよう指定します。これは、select-statement がどれほど最適化されるかによって異なります。 ASENSITIVE がデフォルトです。
INSENSITIVE
カーソルが、結果表の元になっている行に対する挿入、アップデート、削除に影響されないように指定します。 INSENSITIVE が指定された場合、カーソルは読み取り専用で結果表はカーソルがオープンされる時にマテリアライズされます。 結果として、結果表のサイズ、行の順序、および各行の値は、カーソルがオープンされた後は変更されません。 SELECT ステートメントに FOR UPDATE 節を含めることはできませんし、カーソルを位置指定更新または削除に使用することもできません。
(parameter-declaration, ...)
各パラメーターの名前およびデータ・タイプを含む、カーソルの入力パラメーターを指定します。 名前付き入力パラメーターは、select-statementcursor-value-constructor に指定する場合にだけ指定できます (SQLSTATE 428HU)。
parameter-name
select-statement内で SQL 変数として使用する cursor パラメーターを指定します。 この名前は、カーソルの他のすべてのパラメーター名と同じにすることはできません。 また、この名前は、列名がパラメーター名の前に解決されるため、select-statement で使用できるすべての列名と同じにならないように選択しなければなりません。
data-type
select-statement内で使用される カーソル・パラメーター のデータ・タイプを指定します。 構造化タイプおよび参照タイプを指定することはできません (SQLSTATE 429BB)。
組み込みタイプ (built-in-type)
組み込みデータ・タイプを指定します。 各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。
アンカー・パラメーター・データ・タイプ
カーソル・パラメーターのデータ・タイプを決定するために使用される別のオブジェクトを指定します。 アンカー・オブジェクトの データ・タイプには、データ・タイプを直接的に指定する際に適用されるのと同じ制限が課せられます。
ANCHOR DATA TYPE TO
データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
variable-name
ローカルの SQL 変数、SQL パラメーター、またはグローバル変数を指定します。 参照される変数のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
table-name.column-name
既存の表またはビューの列名を指定します。 列のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
特殊タイプ名 (distinct-type-name)
特殊タイプの名前を指定します。 distinct-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、特殊タイプは解決されます。
保持可能性
コミット操作の結果としてカーソルをクローズすることを回避するかどうかを指定します。 詳しくは、『DECLARE CURSOR』を参照してください。 デフォルトは WITHOUT HOLD です。
WITHOUT HOLD
コミット操作の結果としてカーソルをクローズすることを回避しません。
WITH HOLD
複数の作業単位を通してリソースを維持します。 コミット操作の結果としてカーソルをクローズすることを回避します。
選択ステートメント
カーソルの SELECT ステートメントを指定します。 詳しくは、『select-statement』を参照してください。 parameter-declarationcursor-value-constructor に含まれている場合は、select-statement にはローカルの SQL 変数またはルーチンの SQL パラメーターを含めてはなりません (SQLSTATE 42704)。
ステートメント名
カーソルの準備済み select-statement を指定します。 準備済みステートメントの説明については『PREPARE』を参照してください。 ターゲットのカーソル変数には、厳密に型付けされたユーザー定義のカーソル・タイプのデータ・タイプがあってはなりません (SQLSTATE 428HU)。 statement-name を指定する場合は、名前付き入力パラメーターを cursor-value-constructor に指定してはなりません (SQLSTATE 428HU)。
ターゲット行変数 (target-row-variable)
割り当てのターゲット行変数を識別します。 データ・タイプは、行タイプでなければなりません。
行式
割り当てのターゲットの新しい行値を指定します。 この値は、『ROW 式』で説明されているいずれかのタイプの行式とすることができます。 行内のフィールドの数は割り当てのターゲットと一致していなければならず、行内の各フィールドは割り当てのターゲット内の対応するフィールドに割り当て可能でなければなりません。 ソース値とターゲット値がユーザー定義行タイプの場合は、タイプ名は同じでなければなりません (SQLSTATE 42821)。

ルール

  • 式から割り当てる値、NULL、DEFAULT、または row-fullselect の数は、 割り当てに指定されている target-variables の数に一致していなければなりません (SQLSTATE 42802)。
  • SET 変数ステートメントでは、1 つのステートメントで SQL 変数と遷移変数を割り当てることができません (SQLSTATE 42997)。
  • コンパウンド SQL (コンパイル済み) ステートメントで定義されていないトリガーの内部、コンパウンド SQL (コンパイル済み) ステートメントで定義されていない関数の内部、メソッドの内部、またはコンパウンド SQL (インライン化) ステートメントの内部で、グローバル変数の割り当てを行うことはできません (SQLSTATE 428GX)。
  • 配列コンストラクターまたは ARRAY_AGG の結果である配列が値として割り当てられる場合には、配列の基本タイプとターゲット変数の基本タイプは同じでなければなりません (SQLSTATE 42821)。
  • アンカー・データ・タイプの使用: アンカー・データ・タイプは次のオブジェクトを参照できません (SQLSTATE 428HS): ニックネーム、型付き表、型付きビュー、式ベースの索引に関連付けられた統計ビュー、宣言済み一時表、緩やかに型付けされたカーソルに関連付けられた行定義、データベース・コード・ページまたはデータベース照合とは異なるコード・ページまたは照合を使用するオブジェクト。
  • カーソル変数に関連する割り当て: カーソル値コンストラクターの値に設定する、カーソル変数を参照する割り当ては、コンパウンド SQL (コンパイル済み) ステートメント内のみで使用できます。 カーソル変数を使用するすべての OPEN ステートメントは、この割り当てと同じ有効範囲内で実行される必要があります (SQLSTATE 51044)。

  • 特定の割り当て規則に従って、値がターゲット変数に割り当てられます。
  • SQL プロシージャーの割り当てステートメント: SQL プロシージャーの割り当てステートメントは、 SQL 割り当て規則に準拠していなければなりません。 ストリング割り当てでは、検索割り当て規則が使用されます。
  • 配列エレメントの割り当て: 割り当てが SET A[idx] = rhs (A は配列変数名、idx は array-index として使用される式、rhs は配列エレメントと同じタイプの式) という形式である場合、
    1. A が NULL 値であれば、A を空の配列に設定します。
    2. 配列 A のカーディナリティーを C とします。
    3. A が通常配列の場合、
      • idxC 以下であれば、idx によって識別される位置の値は rhs の値で置き換えられます。
      • idxC より大きい場合には、
        • 位置 i (iC より大きく idx より小さい) の値は NULL 値に設定されます。
        • 位置 idx の値は、rhs の値に設定されます。
        • A のカーディナリティーは idxに設定されます。
    4. A が連想配列の場合、
      • idx が既存の配列指標値と一致する場合は、配列指標 idx のエレメント値は rhs の値で置き換えられます。
      • idx が既存の配列指標値と一致しない場合、
        • A のカーディナリティーが 1 増えます。
        • 新規エレメント値は rhs に設定され、関連する配列指標値は idx になります。
    5. idxC 以下であれば、idx によって識別される位置の値は rhs の値で置き換えられます。
    6. idxC より大きい場合には、
      1. 位置 i (iC より大きく idx より小さい) の値は NULL 値に設定されます。
      2. 位置 idx の値は、rhs の値に設定されます。
      3. A のカーディナリティーは idxに設定されます。
  • 特殊レジスターの名前 (PATH など) と一致した ID で変数が宣言されている場合には、意図せずに特殊レジスターに割り当てられてしまわないように、その変数を引用符で区切ってください (例えば、PATH という変数が整数として宣言されている場合は SET "PATH" = SET "PATH" = 1;)。
  • 複数の割り当てが組み込まれている場合、 それぞれの expression および row-fullselect は、 割り当てが実行される前に評価されます。 そのため、式または行の全選択でのターゲット変数への参照は常に、 単一 SET ステートメントでの割り当ての前のターゲット変数の値となります。
  • 特殊タイプとして定義された ID 列が更新された場合は、 まずすべての計算がソース・タイプで行われます。 その結果は、値が列に実際に割り当てられる前に、 ソース・タイプから定義された特殊タイプにキャストされます。 (計算に先立って、元の値がソース・タイプにキャストされることはありません。)
  • ID 列に対する SET ステートメントでデータベース・マネージャーによって値が生成されるようにするには、 DEFAULT キーワードを使用します。
       SET NEW.EMPNO = DEFAULT
    この例では、NEW.EMPNO が ID 列として定義されており、 この列の更新に使用される値はデータベース・マネージャーによって生成されます。
  • ID 列に生成されるシーケンス値の使用に関する詳細、および ID 列で値が最大値を超えた場合の詳細は、『INSERT』を参照してください。

  • 例 1: 現在トリガー・アクションが実行されている行の給与の列を 50000 に設定します。
       SET NEW_VAR.SALARY = 50000;
    または
       SET (NEW_VAR.SALARY) = (50000);
  • 例 2: 現在トリガー・アクションが実行されている行の給与と歩合の列を、 それぞれ 50000 および 8000 に設定します。
       SET NEW_VAR.SALARY = 50000, NEW_VAR.COMM = 8000;
    または
       SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (50000, 8000);
  • 例 3: 現在トリガー・アクションが実行されている行の給与と歩合の列を、 更新される行に関連した部門の従業員の平均給与および平均歩合にそれぞれ設定します。
       SET (NEW_VAR.SALARY, NEW_VAR.COMM)
          = (SELECT AVG(SALARY), AVG(COMM)
               FROM EMPLOYEE E
               WHERE E.WORKDEPT = NEW_VAR.WORKDEPT);
  • 例 4: 現在トリガー・アクションが実行されている行の給与と歩合の列を、 それぞれ 10000、および元の (つまり SET ステートメントの実行前の) 給与値に設定します。
       SET NEW_VAR.SALARY = 10000, NEW_VAR.COMM = NEW_VAR.SALARY;
    または
       SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (10000, NEW_VAR.SALARY);
  • 例 5: SQL 変数 P_SALARY を 10 % ずつ増加させます。
       SET P_SALARY = P_SALARY + (P_SALARY * .10)
  • 例 6: SQL 変数 P_SALARY を NULL 値に設定します。
       SET P_SALARY = NULL
  • 例 7: 数値 2.71828183 および 3.1415926 を、配列変数 SPECIALNUMBERS の最初のエレメントと 10 番目のエレメントに割り当てます。 最初の割り当ての後、P_PHONENUMBERS のカーディナリティーは 1 です。 2 度目の割り当ての後、カーディナリティーは 10 になり、エレメント 2 から 9 には暗黙的に NULL 値 が割り当てられます。
       SET SPECIALNUMBERS[1] = 2.71828183;
    
       SET SPECIALNUMBERS[10] = 3.14159265;
  • 例 8: SECURITY.USERS という表には、データベースに接続可能な各ユーザーごとに 1 行が含まれています。現在時刻と許可レベルをグローバル変数 USERINFO.GV_CONNECT_TIME および USERINFO.GV_AUTH_LEVEL にそれぞれ割り当てます。
       SET USERINFO.GV_CONNECT_TIME = CURRENT TIMESTAMP,
         USERINFO.GV_AUTH_LEVEL = (
           SELECT AUTHLEVEL FROM SECURITY.USERS
             WHERE USERID = CURRENT USER)
  • 例 9: 値を連想配列変数 CAPITALS に割り当てます。この変数は配列タイプ CAPITALSARRAY として宣言されています
       SET CAPITALS['British Columbia'] = 'Victoria';
       SET CAPITALS['Alberta'] = 'Edmonton';
       SET CAPITALS['Manitoba'] = 'Winnipeg';
       SET CAPITALS['Canada'] = 'Ottawa';
    CAPITALS 配列にデータを設定する際、配列指標はストリングで指定された州、地域、および国名となり、関連する配列エレメントは同じくストリングで指定された州都となります。
  • 例 10: 覚えやすい名前を、配列タイプ PERSONAL_PHONENUMBERS ERS の配列変数 PHONELIST に保管されている個人の電話番号に関する索引として割り当てます。
       SET PHONELIST['Home'] = '4163053745';
       SET PHONELIST['Work'] = '4163053746';
       SET PHONELIST['Mom']  = '4164789683';