SET 遷移変数
SET 遷移変数ステートメントは、新しい遷移変数に値を割り当てます。
呼び出し
このステートメントは、BEFORE トリガー内の SQL ステートメントとしてのみ使用できます。 これは実行可能ステートメントですが、動的に準備することはできません。
権限
行全選択 が指定されている場合、全選択で 各副選択に必要な権限についての説明を参照してください。
構文
.-,------------------------------------------------------------------------. V | >>-SET----+-transition-variable-- = --+-expression-+-----------------------------+-+->< | +-NULL-------+ | | '-DEFAULT----' | | .-,-------------------. .-,--------------. | | V | V | (1) | '-(----transition-variable-+--)-- = --(--+---+-expression-+-+-----+--)-' | +-NULL-------+ | | '-DEFAULT----' | | (2) | '-row-fullselect---------'
注:
- 式、NULL、および DEFAULT の数は、遷移変数 の 数と同じでなければなりません。
- 選択リストの中の列の数は、遷移変数 の数と一致していなければなりません。
説明
- transition-variable
- 新しい行の中のどの列を更新するかを指定します。
遷移変数 は、トリガーの対象表の中の列を示すものでなければ
ならず、必要に応じて、新しい値を示す相関名により修飾することができます。
OLD 遷移変数 を指定してはなりません。
遷移変数 は、SET 遷移変数ステートメントで 1 回しか識別することができません。
各遷移変数 のデータ・タイプは、それぞれに対応する結果列 と互換性のあるものでなければなりません。 値は、ストレージ割り当て規則に従って遷移変数 に割り当てられます。 詳しくは、割り当ておよび比較を参照してください。
- expression
- 遷移変数 の新しい値を指定します。
expression は、式で説明したタイプの任意の式です。式には集約関数を含めることはできません。
式 には、OLD および NEW 遷移変数 に対する参照を 含めることができます。 CREATE TRIGGER ステートメントに OLD 文節と NEW 文節の両方が含まれ ている場合は、遷移変数 への参照を相関名 によって修飾する必要があります。
- NULL
- NULL 値を指定します。NULL は、NULL 可能列に対してのみ指定できます。
- DEFAULT
- 遷移変数 に関連した列のデフォルト値を使用することを指定します。 この列が IDENTITY 列または行変更タイム・スタンプ列であるか、または ROWID データ・タイプである場合、DEFAULT は使用できません。
- row-fullselect
- 1 つの結果行を戻す全選択。結果列の値は、対応する各遷移変数 に割り当てられます。 全選択の結果に行が含まれない場合、NULL 値が割り当てられます。 結果の中に複数の行がある場合には、エラーが戻されます。
注
複数の割り当て: 複数の割り当てを同一 SET 遷移変数 ステートメント内で指定すると、割り当てを行う前にすべての式 の評価が行われます。 したがって、式の中での遷移変数 への参照は、常に、この SET ステートメントで割り当てが行われる前の遷移変数 の値です。
例
例 1: 給与列の値が 50000 を超えないようにします。 新しい値が 50000 より大きい場合は、50000 に設定します。
CREATE TRIGGER LIMIT_SALARY
BEFORE INSERT ON EMPLOYEE
REFERENCING NEW AS NEW_VAR
FOR EACH ROW MODE DB2SQL
WHEN (NEW_VAR.SALARY > 50000)
BEGIN ATOMIC
SET NEW_VAR.SALARY = 50000;
END
例 2: 職名が更新されたときに、新しい職名に基づいて給与が増額されるようにします。 そして、その地位での年数を 0 に設定します。
CREATE TRIGGER SET_SALARY
BEFORE UPDATE OF JOB ON STAFF
REFERENCING OLD AS OLD_VAR
NEW AS NEW_VAR
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
SET (NEW_VAR.SALARY, NEW_VAR.YEARS) =
(OLD_VAR.SALARY * CASE NEW_VAR.JOB
WHEN 'Sales' THEN 1.1
WHEN 'Mgr' THEN 1.05
ELSE 1 END ,0);
END