2016-07-28 1 views
0

更新値が従業員の給与の範囲外にある場合、トリガーは機能します。ここでトリガー実行中のエラー-ORA-04088?

は私のトリガコードです:

BEGIN 
    UPDATE cux_jobs_12483 
    SET min_salary = 500, max_salary = 10000 
    WHERE job_id = 'SA_MAN'; 
EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
END; 

エラーコードです:

-20901ORA-20901: Salary out of range! 
ORA-06512: at "CHECK_SAL_RANGE_12483", line 12 
ORA-04088: error during execution of trigger 'CHECK_SAL_RANGE_12483' 

私はRAISE_APPLICATION_ERRORを追加しない場合

CREATE OR REPLACE TRIGGER check_sal_range_12483 
    BEFORE UPDATE OF min_salary, max_salary ON cux_jobs_12483 
    FOR EACH ROW 
DECLARE 
    v_num NUMBER; 
BEGIN 

    SELECT e.employee_id 
    INTO v_num 
    FROM cux_employees_12483 e 
    WHERE e.job_id = 'SA_MAN' 
    AND e.salary NOT BETWEEN :NEW.min_salary AND :NEW.max_salary; 

    IF SQL%ROWCOUNT >= 1 THEN 
    raise_application_error(-20901, 'Salary out of range!'); 
    END IF; 

EXCEPTION 
    WHEN no_data_found THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    WHEN too_many_rows THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    WHEN OTHERS THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    raise_application_error(-20901, 'Salary out of range!'); 
END; 

そして、ここでは、コールがありますトリガのEXCEPTION、更新は成功し、動作しません。

+0

を私は給料の従業員は、新しい範囲の外にあるそこに持っている場合、トリガーは、更新を中断します。 – user6148078

+0

それはまさにそうです。無効な入力がある場合は例外を発生させたい – Rene

+0

'ORA-04088'は、' ORA-06512'の結果であり、これは未処理のカスタム 'ORA-20901'エラーの結果です。 –

答えて

0

これは例外の仕組みです。キャッチした場合、自動的に発信者に呼び出されません。だから、彼らを捕まえてはいけない;)それがあなたの望むものならば。

IF SQL%ROWCOUNT >= 1 THEN 
    raise_application_error(-20901, 'Salary out of range!'); 
    END IF; 

は、あなたのトリガーに巻き込まおよび更新を中断し、あなたの例外ブロックすることです:

EXCEPTION 
    WHEN ... 
    WHEN OTHERS THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    raise_application_error(-20901, 'Salary out of range!'); 
END; 

しかし、あなたはここで間違って何かをします!

...金額にリンクされていない給与エラーイベントが発生したためです。あなたは "OTHERS"の場合にそれを上げます。

あなたはそう、どのような場合には、間違ったエラーを発生させるこの事を削除する必要があります。

EXCEPTION 
    WHEN no_data_found THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    WHEN too_many_rows THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    WHEN OTHERS THEN 
    dbms_output.put_line(SQLCODE || SQLERRM); 
    raise; 
END; 
+0

'update'は例外によって中断されることがありますが、例外は単にエラーメッセージを投げることができますか? @J。 Chomel – user6148078

+0

例外は更新を中断します。 –

関連する問題