小弟刚接触触发器,练习书上的例子,代码如下:
首先建立一个表,以审计在EMP表上执行UPDATE语句的客户主机名,语句及执行时间。
CREATE TABLE aud_upd_table(
host varchar2(30),statement varchar2(100),exectime DATE);
上述语句执行成功。
下面建立触发器的语句:
create or replace trigger tr_upd_emp
after update on emp
declare
sql_txt ora_name_list_t;
v_stmt varchar2(100);
n binary_integer;
begin
n:=ora_sql_txt(sql_txt);
for i in 1..n loop
v_stmt:=v_stmt||sql_txt(i);
end loop;
insert into aud_upd_table values(
sys_context('userenv','host'),v_stmt,SYSDATE);
END;
也对了,但用以下语句测试时有问题:
update emp set sql=2000 where empno=7369;
错误提示:
ORA—06502:PL/SQL:numeric or value error
ORA--06512:at "scott.tr_upd_emp", line 7
ORA--04088:error during execution of trigger 'scott.tr_upd_emp'
请各位朋友帮忙看看是什么问题,在线急等哦,谢谢了。
用scott/tiger登录PL/SQL可以测试,希望那位大哥帮忙调试一下。
首先建立一个表,以审计在EMP表上执行UPDATE语句的客户主机名,语句及执行时间。
CREATE TABLE aud_upd_table(
host varchar2(30),statement varchar2(100),exectime DATE);
上述语句执行成功。
下面建立触发器的语句:
create or replace trigger tr_upd_emp
after update on emp
declare
sql_txt ora_name_list_t;
v_stmt varchar2(100);
n binary_integer;
begin
n:=ora_sql_txt(sql_txt);
for i in 1..n loop
v_stmt:=v_stmt||sql_txt(i);
end loop;
insert into aud_upd_table values(
sys_context('userenv','host'),v_stmt,SYSDATE);
END;
也对了,但用以下语句测试时有问题:
update emp set sql=2000 where empno=7369;
错误提示:
ORA—06502:PL/SQL:numeric or value error
ORA--06512:at "scott.tr_upd_emp", line 7
ORA--04088:error during execution of trigger 'scott.tr_upd_emp'
请各位朋友帮忙看看是什么问题,在线急等哦,谢谢了。
用scott/tiger登录PL/SQL可以测试,希望那位大哥帮忙调试一下。
至于sql_txt ora_name_list_t;应该是可变数组。LZ把值打印出来一步步看值。
for i in 1..n loop ---这个会报错
改成:
for i in 1..nvl(n, 0) loop --OK了,但是loop里面的代码不会执行
只有在系统事件触发器中才能获取到SQL语句。
试图在DML触发器中使用ORA_SQL_TXT函数,这个函数返回NULL,而且传入的OUT变量将不会被初始化。