1

私は PLSQL の初心者であり、更新を行う前にテーブルにレコードがあるかどうかを最初にチェックするトリガーを作成したいと考えています。これまでに取得したコードは次のとおりです。

CREATE OR REPLACE TRIGGER table_bu
BEFORE UPDATE ON employee
FOR EACH ROW
DECLARE
    v_employee_id:=employee.employee_ID%TYPE;
BEGIN
    SELECT employee_id INTO v_employee_id FROM employee;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR (-20001,'data not found');
END;

テーブルにレコードが存在するかどうかをチェックし、存在しない場合は更新を許可しないトリガーを作成する方法。私のテーブルの構造は次のとおりです。

employee_id NUMBER
employee_name VARCHAR(20)
employee_salary NUMBER
...

ありがとう

4

2 に答える 2

2

あなたは間違った道を進んでいます。トリガーはそのままで、構文エラーを修正した後でもランタイムの「テーブルの変更」エラーをスローします-後にセミコロンを逃しましたraise_application_error(また、1つではなく2つの引数を取る必要があります)。正しい構文:

EXCEPTION
WHEN NO_DATA_FOUND THEN
    RAISE_APPLICATION_ERROR (-20001, 'data not found'); -- 1st parameter -error code

アップデート

質問の更新バージョンを理解している限り、レコードが存在しない場合はエラーを表示したいと思います。行レベルのトリガーアプローチの問題は、の条件が原因で何も見つからない場合は実行されないことですWHERE。最も簡単な方法は、クライアント側で影響を受ける行の数を確認し、そこでエラーを発生させることです。または、目的の更新を実行した後にチェックするプロシージャを記述し、sql%rowcount0の
場合は例外をスローすることもできます。難しい方法で実行したい場合は、変数employee.employee_ID%TYPEをリセットする更新ステートメントレベルのトリガーの前に、タイプのパッケージ変数を作成できます(nullこの変数をに設定する行レベルのトリガーを更新した後、)に設定するとしますNEW.employee_ID、および更新後、変数がnullの場合に例外をスローするステートメントレベルトリガー。注:これは、個々の更新に対してのみ適切に機能します。

于 2012-12-16T13:15:05.417 に答える
0

「レコードがテーブルに存在するかどうかをチェックし、存在しない場合は更新を許可しないトリガーを作成する方法を教えてください。」

これを行う実際的な方法は 1 つだけです。参照制約 (外部キー) を使用することです。

于 2012-12-18T01:34:59.127 に答える