2017-06-19 73 views
0

我正在编写一个简单的PL/SQL触发器来检查插入或更新的值是否为UPPER,触发器编译正常,但在插入或更新记录时不起作用。你有什么主意吗?谢谢为什么我的PLSQL触发器验证不会失败?

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; 
+2

顺便提一下,这可能会更好地实现为检查约束。 –

回答

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; 

附:什么异常控制我必须得到第二次世界大战的评论,认为这应该最有可能作为桌上的检查约束来实施。

+0

杰弗里你是PLSQL怪物!触发器工作正常,现在我明白你的指示。我知道我可以添加一个约束来检查大小写,但练习的第一步是创建一个触发器来检查大小写。谢谢你的帮助。当然,我投你的答案。再次感谢! –