Oracle SQL 触发器 - DBMS_OUTPUT.PUT_LINE

Oracle SQL trigger - DBMS_OUTPUT.PUT_LINE

我正在我的数据库中创建一个触发器,我遇到了两个我无法修复的错误,我很确定这两个与我使用 DBMS_OUTPUT.PUT_LINE,语句的其余部分不会导致任何错误,尽管它以前有过。

错误:

Error(5,3): PL/SQL: SQL Statement ignored

Error(5,15): PL/SQL: ORA-00903: invalid table name

代码:

CREATE TRIGGER INVOICES
BEFORE INSERT OR UPDATE ON BRUINVOICE
FOR EACH ROW 
BEGIN  
  IF :new.BRU_DATE < :new.BRU_PAID_DATE THEN
  DBMS_OUTPUT.PUT_LINE('You cannot do that');
  ELSE
  INSERT INTO table BRUINVOICE
  values 
  from inserted;
END IF;
END;

在记录级别验证方面,检查约束是比触发器更好的选择(性能方面):

ALTER TABLE bruinvoice
ADD CONSTRAINT validate_bru_date CHECK (BRU_DATE < BRU_PAID_DATE);

插入无效数据将引发如下错误消息:

scott@ORCL> insert into bruinvoice values ('21-DEC-14','20-DEC-14');
insert into bruinvoice values ('21-DEC-14','20-DEC-14')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.VALIDATE_BRU_DATE) violated

我完全同意 cstotzer 的观点,检查约束在您的情况下要好得多,应该是首选的方式。但是,仅供参考这将是触发器语法:

CREATE TRIGGER INVOICES
BEFORE INSERT OR UPDATE ON BRUINVOICE
FOR EACH ROW 
BEGIN  
  IF :new.BRU_DATE < :new.BRU_PAID_DATE THEN
     RAISE_APPLICATION_ERROR(-20001, 'You cannot do that');
  END IF;
END;

您不需要任何 ELSE,您的 INSERTUPDATE 将在这种情况下被简单地执行。