我正在编写一个简单的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;
答案 0 :(得分:3)
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。我必须对第二次世界大战的评论说,这应该最有可能作为一个检查约束来实现。