下面触发器可以捕获测试表(TEST)上的DML语句
CREATE OR REPLACE TRIGGER tr_capt_sql
  BEFORE DELETE OR INSERT OR UPDATE ON test
DECLARE
  sql_text  ora_name_list_t;
  state_sql capt$sql.sql_text%TYPE;
BEGIN
  FOR i IN 1 .. ora_sql_txt(sql_text) LOOP
    state_sql := state_sql || sql_text(i);
  END LOOP;
  INSERT INTO capt$sql
    (login_user,
     sql_text)
  VALUES
    (ora_login_user,
     state_sql);
END tr_capt_sql;
在向测试表中插入数据时报错(如标题),请高手帮助解决,谢谢

解决方案 »

  1.   

    你在Insert之前,用dbms_output.put_line把你想插入到表里的变量打出来,看一下值呗。
    然后,看看插入的字段类型和变量类型是否一致。
      

  2.   

    sql_text
    怎么又是你定义的变量,又是表里的字段呢?
      

  3.   

    原因找到了  FOR i IN 1 .. nvl(ora_sql_txt(sql_text),0) LOOP
    可是又出现了一个问题,就是变量state_sql总是返回一个空值,不知道是什么原因
      

  4.   

    那就检查(ora_sql_txt(sql_text)这个,为什么返回值为空啊
      

  5.   

    把test的建表语句贴一下,可以给你实测一下。
      

  6.   


    SQL> desc test;
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     X                                                  VARCHAR2(20)
     Y                                                  VARCHAR2(20)SQL> desc capt$sql
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     LOGIN_USER                                         VARCHAR2(3000)
     SQL_TEXT                                           VARCHAR2(4000)
      

  7.   

    不知道在ORACLE10G可不可以这样写,但是这个需求我已经用FGA实现了,还是希望讨论上面的这种方法的可行性