为什么我的 PLSQL 触发器验证不会因错误而失败?
Why is my PLSQL trigger validation not failing on error?
我正在编写一个简单的 PL/SQL 触发器来检查要插入或更新的值是否为 UPPER,触发器编译正常但在我插入或更新记录时不起作用。你有什么主意吗?谢谢
CREATE OR REPLACE TRIGGER check_case_trg
BEFORE
INSERT OR UPDATE
ON unidades_medidas
FOR EACH ROW
DECLARE
e_invalid_case EXCEPTION;
BEGIN
IF
:NEW.unm_codigo <> UPPER(:NEW.unm_codigo) OR
:NEW.unm_descripcion <> UPPER(:NEW.unm_descripcion)
THEN
RAISE e_invalid_case;
END IF;
EXCEPTION
WHEN e_invalid_case THEN
DBMS_OUTPUT.PUT_LINE(
'Nuevos datos deben estar en mayúsculas');
END check_case_trg;
/
SHOW ERRORS;
DBMS_OUTPUT
是一个调试工具 - 它不会引发错误或异常。
要确保您的触发器停止插入或更新,您必须确保引发异常。执行此操作的一个好方法是使用 RAISE_APPLICATION_ERROR
,因为它使您可以控制向调用进程报告什么异常,例如:
CREATE OR REPLACE TRIGGER check_case_trg
BEFORE
INSERT OR UPDATE
ON unidades_medidas
FOR EACH ROW
BEGIN
IF
:NEW.unm_codigo <> UPPER(:NEW.unm_codigo) OR
:NEW.unm_descripcion <> UPPER(:NEW.unm_descripcion)
THEN
RAISE_APPLICATION_ERROR(-20000, 'Nuevos datos deben estar en mayúsculas');
END IF;
END check_case_trg;
p.s。我不得不赞同 WW 的评论,即这很可能应该作为对 table.
的检查约束来实现
我正在编写一个简单的 PL/SQL 触发器来检查要插入或更新的值是否为 UPPER,触发器编译正常但在我插入或更新记录时不起作用。你有什么主意吗?谢谢
CREATE OR REPLACE TRIGGER check_case_trg
BEFORE
INSERT OR UPDATE
ON unidades_medidas
FOR EACH ROW
DECLARE
e_invalid_case EXCEPTION;
BEGIN
IF
:NEW.unm_codigo <> UPPER(:NEW.unm_codigo) OR
:NEW.unm_descripcion <> UPPER(:NEW.unm_descripcion)
THEN
RAISE e_invalid_case;
END IF;
EXCEPTION
WHEN e_invalid_case THEN
DBMS_OUTPUT.PUT_LINE(
'Nuevos datos deben estar en mayúsculas');
END check_case_trg;
/
SHOW ERRORS;
DBMS_OUTPUT
是一个调试工具 - 它不会引发错误或异常。
要确保您的触发器停止插入或更新,您必须确保引发异常。执行此操作的一个好方法是使用 RAISE_APPLICATION_ERROR
,因为它使您可以控制向调用进程报告什么异常,例如:
CREATE OR REPLACE TRIGGER check_case_trg
BEFORE
INSERT OR UPDATE
ON unidades_medidas
FOR EACH ROW
BEGIN
IF
:NEW.unm_codigo <> UPPER(:NEW.unm_codigo) OR
:NEW.unm_descripcion <> UPPER(:NEW.unm_descripcion)
THEN
RAISE_APPLICATION_ERROR(-20000, 'Nuevos datos deben estar en mayúsculas');
END IF;
END check_case_trg;
p.s。我不得不赞同 WW 的评论,即这很可能应该作为对 table.
的检查约束来实现