使用编译错误预言机触发成功



我有这些表

PUBRED (cod_pub, title, year, type, medium)
AUTHOR (login, name, surname, institution, country)
AUTHOR_ONE (login, cod_pub)
PUB_CITA (cod_pub, cod_pub_cited)

而且我必须得到出版物的引用应该始终在它之后

我有以下触发器,但它给了我编译错误,并且在查找其他问题时找不到任何错误

Create or replace trigger works_trg_02
Before insert or update on pub_cita
For each row
Declare
Cnt number;
Begin
Select count (*) into cnt
from pubred pr
inner join pub_cita pc
on :new.pc.cod_pub = pr.cod_pub
inner join pubred pr2
on :new.pc.cod_pub_cited = pr2.cod_pub
where pr.year < pr2.year then 1
Else 0 end = 0;
If cnt <> 0 then
Raise_application_error ('-20001', 'Not possible');
End if;
End works_trg_02;
/

我从"ORA-24344:编译错误成功"中得到典型错误

在进行插入以证明这一点时,我得到"ORA-04098:触发器"FIDDLE_WIXYFBGEUZDXILZQBEGR。WORKS_TRG_02'无效且重新验证失败'

我已经搜索了这里提出的其他类似问题,以适应我最初的解决方案,但我没有成功,我相信那里的一切都是正确的。

首先,当您得到ORA-24344: success with compilation error时,您应该运行show errors或查询user_errorsall_errors视图以查找实际错误消息。

其次,这是错误的::new.pc.cod_pub.:new变量是一个record,即当前正在插入的表(pub_cita(的行。你可以说:new.cod_pub.

第三,触发器无法查询自己的表 - 因此不能在 SELECT 查询中包含pub_cita。这很好,您可以使用:new来引用它。

第四,这是什么?

where pr.year < pr2.year then 1
Else 0 end = 0;

我想你开始了一个CASE声明,然后删除了其中的一部分?这不是有效的语法。

看看这是否适合您:

Create or replace trigger works_trg_02
Before insert or update on pub_cita
For each row
Declare
Cnt number;
Begin
Select count (*) into cnt
from pubred pr
inner join pubred pr2
on :new.cod_pub_cited = pr2.cod_pub
where pr.year < pr2.year
and pr.cod_pub = :new.cod_pub
;
If cnt <> 0 then
Raise_application_error ('-20001', 'Not possible');
End if;
End works_trg_02;
/

最新更新