创建应该引发raise_application_error的触发器时出错

时间:2018-11-30 19:29:34

标签: sql oracle plsql

好,所以我尝试运行以下代码:

Create or replace trigger modificare_datar
After Insert or Update of datar
ON Imprumut
for each row

Begin

if datar<datai or datar>sysdate
then Raise_application_error(-20500,'Eroare! datar nevalida');
end if;

End;

但是我遇到下一个错误:

Error at line 3: PL/SQL: Statement ignored


1. Create or replace trigger modificare_datar
2. After Insert or Update of datar
3. ON Imprumut
4. for each row
5. Begin

我想做的是创建一个引发错误的触发器,因为我要更新的日期数据器或在插入时的日期数据器小于另一个日期(datai)或大于sysdate。但是我真的不知道为什么会得到我和错误。如果没有,我想提出引发错误并设置datar到sysdate的错误,但是如果我尝试创建触发器,但是尝试运行时会遇到2个错误(我发现这是因为它将继续一个循环)你能帮我吗?

编辑:

好吧,我尝试了这段代码

Create or replace trigger modificare_datar 
After Insert or Update of datar ON Imprumut 
for each row 
Begin 
    if :new.datar<:new.datai or :new.datar>sysdate then 
        Raise_application_error(-20500,'Eroare! datar nevalida'); 
    end if; 
End; 

它可以让我创建它,但是现在触发触发器时出现以下错误

ORA-20500: Eroare! datar nevalida ORA-06512: at "RO_A372_SQL_S20.MODIFICARE_DATAR", line 4 ORA-04088: error during execution of trigger 'RO_A372_SQL_S20.MODIFICARE_DATAR' 2. set datar='26-Nov-2018' 3. where id_carte=6 and id_imp=4

2 个答案:

答案 0 :(得分:1)

您已经发现,第一个问题是需要:new.datar(或:old.datar,具体取决于情况)才能获取要插入或更新的记录的日期值。

存在其他错误的其他问题实际上并不是真正的问题。第一个是实际错误,带有正确的代码和正确的文本。另一部分是其他信息,如果您对此有兴趣的话,可以帮助您确定有关该错误的更多信息。因此,您得到ORA-06512,它紧跟在“堆栈跟踪”之后,告诉您哪里出了问题。特别是在您获得更多代码或从触发器调用存储过程的情况下,此功能尤其有用。使用此信息,您可以跟踪从拨打电话到发生错误的地方的所有步骤。

因此,所有这些额外信息都不是实际错误消息的一部分。当您使用SQLCODE and SQLERRM时,只会得到第一个数字和第一条消息(您提出的消息)。

答案 1 :(得分:0)

这可能是您正在寻找的东西。看看:

样品表:

SQL> create table imprumut
  2    (id     number,
  3     datar  date,
  4     datai  date);

Table created.

触发:您忘记了以指定要引用的值:

SQL> create or replace trigger trg_biu_imp
  2    before insert or update on imprumut
  3    for each row
  4  begin
  5    if :new.datar < :new.datai or :new.datar > sysdate then
  6       raise_application_error(-20500, 'Eroare! datar nevalida');
  7    end if;
  8  end;
  9  /

Trigger created.

测试:

SQL> -- datar < datai: error
SQL> insert into imprumut (id, datar, datai) values
  2    (1, date '2018-11-30', date '2018-12-20');
insert into imprumut (id, datar, datai) values
            *
ERROR at line 1:
ORA-20500: Eroare! datar nevalida
ORA-06512: at "SCOTT.TRG_BIU_IMP", line 3
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_IMP'


SQL> -- datar > sysdate (2018-11-30): error
SQL> insert into imprumut (id, datar, datai) values
  2    (2, date '2020-01-01', date '2018-12-20');
insert into imprumut (id, datar, datai) values
            *
ERROR at line 1:
ORA-20500: Eroare! datar nevalida
ORA-06512: at "SCOTT.TRG_BIU_IMP", line 3
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_IMP'


SQL> -- datar > datai, datar < sysdate: OK
SQL> insert into imprumut (id, datar, datai) values
  2    (3, date '2018-11-01', date '2018-08-20');

1 row created.

SQL>