2010-05-12 67 views
1

创建一个触发在甲骨文..质疑触发器

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退出,然后再次登录,它不显示更新的内容,而是显示以前的内容。

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

+0

你想维护数据库外的PL/SQL * *吗? – 2010-05-13 05:17:05

+0

是的......我想维护数据库之外的PL/SQL代码..另外,如果pl/sql代码改变了,那么它应该在触发器本身中反映出来..动态工作.. – AGeek 2010-05-13 06:11:05

+0

那么,* even如果在数据库之外有*代码的方法,那么代码必须在执行前进行编译,否则你将无法解决这个问题。另外,用“外部代码”,你必须记住,这样的代码不会被备份。因此,如果您必须恢复数据库,则还必须恢复“动态”触发器。最后,使用“动态”触发器,您不能使用'all_errors'来查看是否存在无效对象。 – 2010-05-13 07:18:40

回答

0

@ hello.pl只包括在CREATE ... TRIGGER命令的主体hello.pl的文本。没有从Oracle到该文件的链接。

请注意,在一般情况下,Oracle服务器位于另一台计算机上,无法访问硬盘驱动器的内容。

6

它发生是因为@作品很像在C/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); 

但是,后者“解决方案”在跨会话中不起作用。

+0

是不是有任何其他的方式,使这项工作动态..因为我的你好。pl文件,将不仅包含hello世界文本,而且包含sql语句系列等。 – AGeek 2010-05-13 05:19:49

+0

我听说过,它们是叫做External Triggers的smthing,它是否可以工作,即使它成为动态的.. – AGeek 2010-05-13 05:29:34

0

查看EXECUTE IMMEDIATE和DBMS_SQL进行动态编码。