SQL 解説書
SET transition-variable ステートメントは、新しい変換変数に値を割り当てます。
これは、トランザクションによる制御下にあります。
呼び出し
このステートメントは、
細分性が FOR EACH ROW の BEFORE トリガーのトリガー・アクションで、
トリガーにより実行される SQL ステートメントとしてのみ
使用することができます (CREATE TRIGGER を参照してください)。
許可
トリガーの作成者の許可 ID の特権には、
以下の特権の少なくとも 1 つが含まれていなければなりません。
- 割り当て式の左辺で参照される列に対する UPDATE、
および右辺で参照される列に対する SELECT
- 表 (トリガーの対象表) に対する CONTROL 特権
- SYSADM または DBADM 権限
割り当ての右辺に row-fullselect (行全選択) の指定がある
このステートメントを実行する場合には、
トリガー作成者の許可 ID に与えられている特権には、
参照される表または視点のそれぞれに対する特権として、
以下の少なくとも 1 つが含まれていなければなりません。
- SELECT 特権
- CONTROL 特権
- SYSADM または DBADM
構文
>>-SET---------------------------------------------------------->
.-,--------------------------------------------------------------------------------------.
V |
>--------+-| transition-variable |--=--+-expression-+--------------------------------------+--+>
| +-NULL-------+ |
| '-DEFAULT----' |
| .-,---------------------------. .-,--------------------. |
| V | V (1) | |
'-(-----| transition-variable |---+---)--=--(--+----+-expression------+--+-+---)--'
| +-NULL------------+ |
| '-DEFAULT---------' |
| (2) |
'-row-fullselect------------'
>--------------------------------------------------------------><
transition-variable
|---+-------------------+--column-name-------------------------->
'-correlation-name.-'
>-----+--------------------------+------------------------------|
| .--------------------. |
| V | |
'----..attribute-name---+--'
注:
- 式、NULL、および DEFAULT の数は、
transition-variable (変換変数) の数と同じでなければなりません。
- 選択リストの列の数は、
transition-variable の数と同じでなければなりません。
説明
- transition-variable
- トリガーの影響を受ける一連の行の列を指定します。
- correlation-name
- 新しい (NEW) 変換変数を参照するための相関名。
この相関名 は、
CREATE TRIGGER の REFERENCING 文節の NEW の後に指定した相関名と同じでなければなりません。
その REFERENCING 文節に OLD が指定されていない場合、
相関名 のデフォルト値は NEW の後に指定した相関名 になります。
REFERENCING 文節に NEW と OLD の両方が指定されている場合は、
各列名 ごとに相関名 の指定が必要になります (SQLSTATE 42702)。
- column-name
- 更新する列を指定します。
column-name (列名) は、
トリガーの対象表の列を指定していなければなりません (SQLSTATE 42703)。
1 つの列を 2 回以上指定することはできません (SQLSTATE 42701)。
- ..attribute name
- 設定されている構造タイプの属性 (属性割り当て という) を指定します。
指定される column-name は、
ユーザー定義構造タイプで定義されているものでなければなりません (SQLSTATE 428DP)。
attribute-name は、
column-name の構造タイプの属性でなければなりません (SQLSTATE 42703)。
..attribute name 文節と関係のない割り当ては、
通常の割り当てとみなされます。
- expression
- 列の新しい値を指定します。
この expression (式) として、
式 で説明されているタイプの式はいずれも使用することができます。
スカラー全選択に現れる式を除き、
この式に列関数を含めることはできません (SQLSTATE 42903)。
expression には、
OLD および NEW の変換変数への参照を含めることができますが、
どの変換変数かを指定するために、
correlation-name (相関名) で修飾する必要があります (SQLSTATE 42702)。
- NULL
- ヌル値を指定します。
これはヌル値可能な列に対してのみ指定することができます (SQLSTATE 23502)。
NULL が特に属性のデータ・タイプにキャストされたのでない限り、
属性割り当ての値として NULL を使用することはできません (SQLSTATE 429B9)。
- DEFAULT
- 対応する列の表における定義方法に基づくデフォルト値を使用することを指定します。
挿入される値は、その列の定義方法によって異なります。
- 列が WITH DEFAULT 文節を指定して定義されている場合、
値はその列に対して定義されたデフォルト値に設定されます (ALTER TABLE の default-clause を
参照してください)。
- IDENTITY 文節を使用して列が定義された場合は、
データベース・マネージャーによって値が生成されます。
- WITH DEFAULT 文節、IDENTITY 文節、
および NOT NULL 文節のいずれも指定せずに列が定義された場合、値は NULL になります。
- 列の定義に NOT NULL 文節が使用されたが IDENTITY 文節が使用されなかった場合、
また WITH DEFAULT 文節が使用されていない場合や DEFAULT NULL が使用されている場合は、
その列に DEFAULT キーワードを指定することはできません (SQLSTATE 23502)。
- row-fullselect
- 割り当て式に指定した列名 の数に対応する数の列を含む 1 つの行を戻す全選択です。
値は、それぞれ対応する列名に割り当てられます。
この行全選択 の結果の行がない場合は、NULL 値が割り当てられます。
row-fullselect (行全選択) には、
OLD および NEW の変換変数に対する参照を含めることができます。
そのような場合、
使用する変換変数を相関名 で修飾して指定する必要があります (SQLSTATE 42702)。
結果に複数の行が含まれる場合には、エラーになります (SQLSTATE 21000)。
規則
- 式、NULL、DEFAULT、または row-fullselect から割り当てられる値の数は、
割り当て式に指定した列の数と同じでなければなりません (SQLSTATE 42802)。
- BEFORE UPDATE トリガーでこのステートメントを使用する場合、
transition-variable (変換変数) として
指定する column-name (列名) は 区分化キーの列であってはなりません (SQLSTATE 42997)。
注
- 複数の割り当て式が含まれている場合には、割り当ての実行に先立って、
すべての expression と row-fullselect が評価されます。
したがって、式または行全選択の中の列に対する参照は、
その単一の SET transition-variable ステートメントでの割り当て以前の変換変数の値になります。
- 特殊タイプとして定義された識別列が更新された場合は、
まずすべての計算がソース・タイプで行われます。
そして計算された値は、値が列に実際に割り当てられるときに、
ソース・タイプから定義された特殊タイプにキャストされます。
106
- 識別列に対する SET ステートメントで DB2 によって値が生成されるようにするには、
DEFAULT キーワードを使用します。
SET NEW.EMPNO = DEFAULT
この例では、NEW.EMPNO が識別列として定義されており、
この列の更新に使用される値は DB2 によって生成されます。
- 識別列に生成されるシーケンス値の使用に関する詳細は、
INSERTを参照してください。
- 識別列で値が最大値を超えた場合の詳細は、
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);
脚注:
- 106
-
計算に先立って、元の値がソース・タイプにキャストされることはありません。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]