【问题标题】:I'm getting an error while excuting a trigger statement执行触发器语句时出现错误
【发布时间】:2021-12-05 08:34:38
【问题描述】:

enter image description here创建或替换触发器 weekd_tri

BEFORE INSERT OR UPDATE ON payment

FOR EACH ROW

BEGIN

IF TO_CHAR(SYSDATE, 'D') = '1' THEN

RAISE_APPLICATION_ERROR(-20000, 'Cannot make a payment on weekends');

END IF;

END;

错误信息 ORA-06512:在“SCOTT.WEEKD_TRI”第 3 行 ORA-04088: 执行触发器“SCOTT,WEEKD_TRI”时出错 你能告诉我为什么会出现这个错误以及如何解决这个错误

* *此触发器在星期六/星期日进行时不应接受客户付款,因此我编写了此触发器,但是当我尝试在 Sun 上插入数据时,它确实触发了触发器 ORA - 20000 周末无法付款,我无法更新这些值,但除此之外,我还得到了另外两个 Erros ORA-06512 & ORA:04088 **

【问题讨论】:

  • 嗨 Keth,欢迎来到 SO。请使用您尝试插入或更新的数据来更新问题
  • 我正在尝试更新付款表,我正在其中添加客户的付款详细信息
  • 为了能够帮助您,我们需要一个导致错误的插入或更新语句。桌子设计也很好
  • 谢谢你帮助我 ekochergin 我已经编辑了问题并添加了一张图片以便更好地理解和关于表 PAY_CUST_ID NUMBER(5) PAY_ID NOT NULL NUMBER(5) PAY_AMT NUMBER(10) PAY_DATE DATE PAY_DESC VARCHAR2(100) 这是表描述

标签: exception plsql triggers procedure


【解决方案1】:

从您的屏幕截图中,我看到有 3 个错误消息行

  • ORA-20000 - 这是由您的逻辑引起的真正错误消息
  • ORA-6512 - 识别代码行错误的服务消息
  • ORA-4088 - 另一个服务消息,用于识别发生错误的触发器名称

因此,您获得 ora-4088 的原因是您用于触发异常的 raise_application_error 命令。这只是开发者服务信息的一部分

【讨论】:

    【解决方案2】:

    没有“错误”,除了您自己故意创建的错误。

    今天是星期几?

    SQL> select to_char(sysdate, 'D') from dual;
    
    T
    -
    1       --> OK, that's the value you're checking in a trigger
    
    SQL>
    

    示例表:

    SQL> create table payment (id number);
    
    Table created.
    

    触发器:

    SQL> create or replace trigger weekd_tri
      2    before insert or update on payment
      3    for each row
      4  begin
      5    if to_char(sysdate, 'D') = '1' then
      6       raise_application_error(-20000, 'Cannot make a payment on weekends');
      7    end if;
      8  end;
      9  /
    
    Trigger created.
    

    测试:

    SQL> insert into payment (id) values (1);
    insert into payment (id) values (1)
                *
    ERROR at line 1:
    ORA-20000: Cannot make a payment on weekends
    ORA-06512: at "SCOTT.WEEKD_TRI", line 3
    ORA-04088: error during execution of trigger 'SCOTT.WEEKD_TRI'
    

    对;这就是完全您想要做的:IF 得出结论,今天真的是 '1' 并引发了错误。


    如果是,例如'2'你检查了,今天你可以插入一行:

    SQL> create or replace trigger weekd_tri
      2    before insert or update on payment
      3    for each row
      4  begin
      5    if to_char(sysdate, 'D') = '2' then
      6       raise_application_error(-20000, 'Cannot make a payment on weekends');
      7    end if;
      8  end;
      9  /
    
    Trigger created.
    
    SQL> insert into payment (id) values (2);
    
    1 row created.
    
    SQL>
    

    【讨论】:

    • 谢谢...是的,它今天可以更新/插入值,但我的问题是我写了一个触发语句,客户无法在周日和我的代码中插入/更新值SYSDATE = '1' 是星期天,但是当我执行此代码时,除了我故意编写的错误之外,还弹出了其他两个错误。为了清楚地了解我已经更新了问题并添加了我昨天收到的错误图片
    • 这是完整的错误堆栈 - 据我所知 - 你无法避免它。
    • 如果可能的话,您能帮我更简单地理解一下吗
    • 你有什么不明白的?您说触发器应该引发异常 - 这就是触发器的作用。故事结束。
    • 我的意思是完整的错误堆栈..?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多