创建了一个触发器 ..
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 /
hello.pl 的内容是: -
BEGIN
DBMS_OUTPUT.PUT_LINE('hello world');
END;
而且..结果非常好,因为插入记录时屏幕上会显示hello.pl的内容..
现在,查询是 - 当我更改hello.pl文件的内容后,从oracle退出,然后再次登录,它没有显示更新的内容,而是显示以前的内容.. < / p>
我注意到,如果我放下触发器并再次创建它,那么它工作正常..为什么会这样发生..这个问题的解决方案是什么..
答案 0 :(得分:6)
这是因为@
与ac / c ++预处理器中的#include
非常相似,即SQL*Plus
在处插入文件hellp.pl
的内容编译时间。
如果要在触发触发器时输出文件内容,可能需要查看utl_file
。
但是您可能更容易创建类似于
的包create or replace package trigger_content as
text varchar2(100);
end;
/
然后,您可以动态更改文本的值:
exec trigger_content.text := 'hello world';
并使用
打印文本的值dbms_output.put_line(trigger_content.text);
但是,后一种“解决方案”不适用于各种会话。
答案 1 :(得分:0)
@ hello.pl只包含CREATE ... TRIGGER命令主体中的hello.pl文本。 Oracle与文件之间没有链接。
请注意,在一般情况下,Oracle服务器位于另一台计算机上,无法访问硬盘驱动器的内容。
答案 2 :(得分:0)
查看EXECUTE IMMEDIATE和DBMS_SQL以进行动态编码。