2

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

错误:

错误 (5,3): PL/SQL: SQL 语句被忽略

错误(5,15):PL/SQL:ORA-00903:无效的表名

代码:

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;
4

2 回答 2

3

我完全同意 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, your INSERTorUPDATE将被简单地执行。

于 2015-01-28T07:13:55.500 回答
3

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

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
于 2015-01-27T21:30:46.920 回答