【问题标题】:Oracle SQL trigger - DBMS_OUTPUT.PUT_LINEOracle SQL 触发器 - DBMS_OUTPUT.PUT_LINE
【发布时间】:2015-03-26 14:08:19
【问题描述】:

我正在我的数据库中创建一个触发器,我遇到了两个我无法修复的错误,我很确定这两个与我对 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;

【问题讨论】:

  • 您的INSERT 没有意义。 INSERT 语句中没有 table 关键字,您似乎不太可能创建了一个名为 inserted 的表来进行选择,如果您打算从另一个表中进行选择,则需要一个 INSERT ... SELECT .但是,由于您显然是插入到定义触发器的同一个表中,所以我很难想象您要完成什么。也许您想引发错误而不是写信给dbms_output 并完全删除ELSE 子句?

标签: sql oracle plsql triggers dbms-output


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我完全同意 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 在这种情况下将被简单地执行。

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多