查询触发器

AGe*_*eek 1 oracle triggers

在Oracle中创建了一个触发器 ..

SQL> CREATE OR REPLACE TRIGGER student_after_insert
  2  AFTER INSERT
  3  ON student
  4  FOR EACH ROW
  5  BEGIN
  6     @hello.pl
  9  END student_after_insert;
 10  /
Run Code Online (Sandbox Code Playgroud)

hello.pl的内容是: -

BEGIN
   DBMS_OUTPUT.PUT_LINE('hello world');
END;
Run Code Online (Sandbox Code Playgroud)

并且......结果非常好,因为插入记录时屏幕上会显示hello.pl的内容.

现在,查询是 - 当我更改hello.pl文件的内容后,从oracle退出,然后再次登录,它不显示更新的内容,而是显示以前的内容..

我注意到,如果我放下触发器并再次创建它,那么它工作正常..它为什么会这样发生..这个问题的解决方案是什么..

Ren*_*ger 6

这是因为它的@工作方式与#includeac/c ++预处理器非常相似,即在编译时SQL*Plus插入文件的内容.hellp.pl

如果要在触发器触发时输出文件的内容,您可能需要查看utl_file.

但是你可能更容易创建类似的包

create or replace package trigger_content as 
  text varchar2(100); 
end;
/
Run Code Online (Sandbox Code Playgroud)

然后,您可以动态更改文本的值:

 exec trigger_content.text := 'hello world';
Run Code Online (Sandbox Code Playgroud)

并打印文本的值

dbms_output.put_line(trigger_content.text);
Run Code Online (Sandbox Code Playgroud)

但是,后一种"解决方案"在会话中不起作用.