我试图得到一个触发器来显示一个名为records_t
的整个表在删除,插入或更新。
所以我写了这个
create or replace trigger display_rec
after insert or update or delete on records_t
for each row
declare
cursor cur is
select recno, recdate, recamt from records_t;
begin
loop
DBMS_OUTPUT.PUT_LINE (c.recno || ' ' || c.recdate || ' ' || c.recamt);
end loop;
end;
当我运行它时,我得到一个错误,记录表正在发生变化。请帮帮忙
2条答案
按热度按时间jv2fixgn1#
您不能从行级触发器中刚刚修改的表中访问行,因为...如你所知,table正在变异。
然后,您说您发布的代码的触发器引发了错误。没办法,它是无效,无法编译(所以它不能工作),因为
一般来说,声明一些东西并发布不支持这些声明的代码不是最好的主意。
如果您切换到语句级触发器并修复代码,使其实际上有效,那么它会执行您想要的操作-显示表的内容:
虽然它现在可以工作,但它的使用值得怀疑。除非您(或最终用户)使用能够显示
dbms_output.put_line
内容的工具(如SQL*Plus或SQL Developer或其他一些GUI工具)修改表,否则您将看不到任何内容。例如,如果您通过Oracle Forms应用程序或Oracle Apex更新表,则触发器将 * 静默地 * 显示输出为 * 无 *。它不会失败,但你不会看到它写了什么。因此,只是好奇:它的真实的目的是什么?
vd8tlhqk2#
问题似乎是PL/SQL代码声明的游标“cur”没有在循环中使用。相反,循环使用未定义的变量“c”。这将导致编译错误。此外,循环是无限的,会导致记录发生变化。