oracle sql developer表正在发生变化

jfgube3f  于 2023-05-06  发布在  Oracle
关注(0)|答案(2)|浏览(155)

我试图得到一个触发器来显示一个名为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;

当我运行它时,我得到一个错误,记录表正在发生变化。请帮帮忙

jv2fixgn

jv2fixgn1#

您不能从行级触发器中刚刚修改的表中访问行,因为...如你所知,table正在变异。
然后,您说您发布的代码的触发器引发了错误。没办法,它是无效,无法编译(所以它不能工作),因为

  • 你声明了一个游标,但是没有游标变量
  • 循环?通过什么?您从未打开过游标,也从未从中提取过。。
  • 。。。并且您从未退出循环或关闭光标

一般来说,声明一些东西并发布不支持这些声明的代码不是最好的主意。
如果您切换到语句级触发器并修复代码,使其实际上有效,那么它会执行您想要的操作-显示表的内容:

SQL> set serveroutput on
SQL> create or replace trigger display_rec
  2    after insert or update or delete on records_t
  3  begin
  4    for cur in (select recno, recdate, recamt  from records_t)
  5    loop
  6      DBMS_OUTPUT.PUT_LINE (cur.recno || '   ' || cur.recdate || '   ' || cur.recamt);
  7    end loop;
  8  end;
  9  /

Trigger created.

SQL> select * from records_t;

     RECNO RECDATE       RECAMT
---------- --------- ----------
      7782 09-JUN-81     2572.5
      7839 17-NOV-81       5250
      7934 23-JAN-82       1365

SQL> update records_t set recamt = 100;
7782   09-JUN-81   100
7839   17-NOV-81   100
7934   23-JAN-82   100

3 rows updated.

SQL>

虽然它现在可以工作,但它的使用值得怀疑。除非您(或最终用户)使用能够显示dbms_output.put_line内容的工具(如SQL*Plus或SQL Developer或其他一些GUI工具)修改表,否则您将看不到任何内容。例如,如果您通过Oracle Forms应用程序或Oracle Apex更新表,则触发器将 * 静默地 * 显示输出为 * 无 *。它不会失败,但你不会看到它写了什么。
因此,只是好奇:它的真实的目的是什么?

vd8tlhqk

vd8tlhqk2#

问题似乎是PL/SQL代码声明的游标“cur”没有在循环中使用。相反,循环使用未定义的变量“c”。这将导致编译错误。此外,循环是无限的,会导致记录发生变化。

相关问题