SET 変数ステートメント
SET 変数ステートメントは、変数に値を割り当てます。
このステートメントは、トランザクションの制御下にありません。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。このステートメントは、動的に作成できる実行可能ステートメントです。
許可
遷移変数を参照するには、トリガー作成者の許可 ID によって保持されている特権には、
少なくとも以下の権限のいずれかが含まれていなければなりません。
- 割り当ての左辺で参照されているすべての列に対する UPDATE 特権、 および右辺で参照されているすべての列に対する SELECT 特権。
- 表 (トリガーのサブジェクト表) での CONTROL 特権
- DATAACCESS 権限
割り当てステートメントの右辺でグローバル変数が参照される場合、ステートメントの許可 ID は以下の権限のうち 1 つの特権を保持する必要があります。
- モジュールで定義されていないグローバル変数に対する READ 特権
- モジュールで定義されているグローバル変数のモジュールに対する EXECUTE 特権
割り当てステートメントの左辺でグローバル変数に値が割り当てられる場合、ステートメントの許可 ID は以下の権限のうち 1 つの特権を保持する必要があります。
- モジュールで定義されていないグローバル変数に対する WRITE 特権
- モジュールで定義されているグローバル変数のモジュールに対する EXECUTE 特権
割り当ての右辺で row-fullselect を使ってこのステートメントを実行するには、ステートメントの許可 ID が row-fullselect の実行に必要な特権を持つ必要があります。『SQL 照会』の許可セクションを参照してください。
select-statement を使用する cursor-value-constructor を指定してこのステートメントを実行するには、ステートメントの許可 ID が保持する特権に、 select-statement の実行に必要な特権が含まれている必要があります。『SQL 照会』の許可セクションを参照してください。
構文
注:
- 1 statement-name は parameter-declaration が指定されている場合、 指定することができません。
- 2 FOR BIT DATA 節とその後に続く他の列制約とは、任意の順序で指定できます。FOR BIT DATA 節をストリング単位の CODEUNITS32 とともに指定することはできません (SQLSTATE 42613)。
- 3 データ・タイプは、行タイプでなければなりません。
説明
- target-variable
- 割り当てのターゲット変数を識別します。
同じ変数を表す target-variable を複数指定することはできません (SQLSTATE 42701)。
- global-variable-name
- 割り当てのターゲットとなるグローバル変数を指定します。 global-variable-name は、現在のサーバーに存在するグローバル変数を識別するものでなければなりません (SQLSTATE 42704)。
- host-variable
- 割り当てのターゲットとなるホスト変数を指定します。
- parameter-marker
- 割り当てのターゲットとなるパラメーター・マーカーを指定します。
- SQL-parameter-name
- 割り当てのターゲットとなるパラメーターを識別します。 そのパラメーターは、CREATE PROCEDURE ステートメントの parameter-declaration で指定しなければなりません。
- field-reference
- 割り当てのターゲットとなる行タイプ値内のフィールドを指定します。
- row-variable-name
- 行タイプであるデータ・タイプを持つ変数の名前。
- field-name
- 行タイプ内のフィールドの名前。
- 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 値が割り当てられます。 属性のデータ・タイプに特別にキャストされた場合を除いて、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 が使用されている
target-variable がグローバル変数である場合、挿入される値は、変数の作成時に指定されたデフォルト値です。
target-variable が SQL プロシージャー内の SQL 変数または SQL パラメーター、ホスト変数、またはパラメーター・マーカーであれば、DEFAULT キーワードは指定できません (SQLSTATE 42608)。
- row-fullselect
- 割り当てに指定されているターゲット変数 または 行変数のフィールドの数に対応する列数とともに、単一行を返す全選択です。 値は、対応するターゲット変数またはフィールドそれぞれに割り当てられます。 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)。
- search-condition
- 結果が真、偽、または不明である検索条件。 結果が不明の場合は、ブール値 NULL として戻されます。
- TRUE
- ブール値を TRUE に指定します。
- FALSE
- ブール値を FALSE に指定します。
- NULL
- ブール値を NULL に指定します。
- array-variable-name
- 配列タイプの SQL 変数、SQL パラメーター、またはグローバル変数を指定します (SQLSTATE 428H0)。
- [array-index]
- 配列のどのエレメントが割り当てのターゲットとなるかを指定する式。通常配列の場合、array-index は INTEGER に割り当て可能でなければなりません (SQLSTATE 22018 または 428H1)。 その値は、1 と、配列に定義された最大カーディナリティーとの間でなければならず、NULL 値にすることはできません (SQLSTATE 2202E)。
- target-cursor-variable
- カーソル変数を指定します。target-cursor-variable のデータ・タイプは、カーソル・タイプでなければなりません (SQLSTATE 42821)。
- cursor-variable-name
- target-cursor-variable と同じカーソル・タイプのカーソル変数を指定します。
- 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-statement も cursor-value-constructor に指定する場合にだけ指定できます (SQLSTATE 428HU)。
- parameter-name
- select-statement 内で SQL 変数として使用するためにカーソル・パラメーターの名前を指定します。この名前は、カーソルの他のすべてのパラメーター名と同じにすることはできません。また、この名前は、列名がパラメーター名の前に解決されるため、select-statement で使用できるすべての列名と同じにならないように選択しなければなりません。
- data-type
- select-statement で使用されるカーソル・パラメーターのデータ・タイプを指定します。構造化タイプおよび参照タイプを指定することはできません (SQLSTATE 429BB)。
- built-in-type
- 組み込みデータ・タイプを指定します。各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。
- anchored-parameter-data-type
- カーソル・パラメーターのデータ・タイプを決定するために使用される別のオブジェクトを指定します。アンカー・オブジェクトの
データ・タイプには、データ・タイプを直接的に指定する際に適用されるのと同じ制限が課せられます。
- ANCHOR DATA TYPE TO
- データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
- variable-name
- ローカルの SQL 変数、SQL パラメーター、またはグローバル変数を指定します。参照される変数のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
- table-name.column-name
- 既存の表またはビューの列名を指定します。列のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
- distinct-type-name
- 特殊タイプの名前を指定します。distinct-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、特殊タイプは解決されます。
- holdability
- コミット操作の結果としてカーソルをクローズすることを回避するかどうかを指定します。詳しくは、『DECLARE CURSOR』を参照してください。デフォルトは WITHOUT HOLD です。
- WITHOUT HOLD
- コミット操作の結果としてカーソルをクローズすることを回避しません。
- WITH HOLD
- 複数の作業単位を通してリソースを維持します。 コミット操作の結果としてカーソルをクローズすることを回避します。
- select-statement
- カーソルの SELECT ステートメントを指定します。 詳しくは、『select-statement』を参照してください。parameter-declaration が cursor-value-constructor に含まれている場合は、select-statement にはローカルの SQL 変数またはルーチンの SQL パラメーターを含めてはなりません (SQLSTATE 42704)。
- statement-name
- カーソルの準備済み select-statement を指定します。準備済みステートメントの説明については『PREPARE』を参照してください。ターゲットのカーソル変数には、厳密に型付けされたユーザー定義のカーソル・タイプのデータ・タイプがあってはなりません (SQLSTATE 428HU)。statement-name を指定する場合は、名前付き入力パラメーターを cursor-value-constructor に指定してはなりません (SQLSTATE 428HU)。
- target-row-variable
- 割り当てのターゲット行変数を識別します。データ・タイプは、行タイプでなければなりません。
- row-expression
- 割り当てのターゲットの新しい行値を指定します。 この値は、『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は配列エレメントと同じタイプの式) という形式である場合、Aが NULL 値であれば、Aを空の配列に設定します。- 配列
AのカーディナリティーをCとします。 Aが通常配列の場合、idxがC以下であれば、idxによって識別される位置の値はrhsの値で置き換えられます。idxがCより大きい場合には、- 位置 i (i は
Cより大きくidxより小さい) の値は NULL 値に設定されます。 - 位置
idxの値はrhsの値に設定されます。 Aのカーディナリティーはidxに設定されます。
- 位置 i (i は
Aが連想配列の場合、idxが既存の配列指標値と一致する場合は、配列指標idxのエレメント値はrhsの値で置き換えられます。idxが既存の配列指標値と一致しない場合、Aのカーディナリティーが 1 増えます。- 新規エレメント値は
rhsに設定され、関連する配列指標値はidxになります。
idxがC以下であれば、idxによって識別される位置の値はrhsの値で置き換えられます。idxがCより大きい場合には、- 位置 i (i は
Cより大きくidxより小さい) の値は NULL 値に設定されます。 - 位置
idxの値はrhsの値に設定されます。 Aのカーディナリティーはidxに設定されます。
- 位置 i (i は
- 特殊レジスターの名前 (PATH など) と一致した ID で変数が宣言されている場合には、
意図せずに特殊レジスターに割り当てられてしまわないように、その変数を引用符で区切ってください (例えば、
PATH という変数が整数として宣言されている場合は
SET "PATH" = 1;)。 - 複数の割り当てが組み込まれている場合、 それぞれの expression および row-fullselect は、 割り当てが実行される前に評価されます。 そのため、式または行の全選択でのターゲット変数への参照は常に、 単一 SET ステートメントでの割り当ての前のターゲット変数の値となります。
- 特殊タイプとして定義された ID 列が更新された場合は、 まずすべての計算がソース・タイプで行われます。 その結果は、値が列に実際に割り当てられる前に、 ソース・タイプから定義された特殊タイプにキャストされます。 (計算に先立って、元の値がソース・タイプにキャストされることはありません。)
- ID 列に対する SET ステートメントでデータベース・マネージャーによって値が生成されるようにするには、
DEFAULT キーワードを使用します。
この例では、NEW.EMPNO が ID 列として定義されており、 この列の更新に使用される値はデータベース・マネージャーによって生成されます。SET NEW.EMPNO = DEFAULT - 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の配列変数PHONELISTに保管されている個人の電話番号に関する索引として割り当てます。SET PHONELIST['Home'] = '4163053745'; SET PHONELIST['Work'] = '4163053746'; SET PHONELIST['Mom'] = '4164789683';
