错误很明确,变量没有绑定,就是v_sql := 'insert into u_t(key_name) values(:new.'||keyFieldName||')';中的:new.'||keyFieldName||'是不能这样的
动态SQL执行前必须明确值

解决方案 »

  1.   

    1 你找主键的语句就是错的,不过不是报错的原因。2 :new. 无法动态。
      

  2.   

    没干过,便研究了一下,发现直接用oracle 是无法解决的。只有几种变通方式:
    1、用rowid。:new.rowid记录入表,然后你再写个job定时,从rowid还原回id。
    缺点:一致性不好
    2、将这个单表用简单视图替换,然后你就知道字段了。这个视图替换,可以写脚本跑批完成,将所有有主键的表建立都是相同主键名的视图。
    缺点:需要建立很多没啥大用的视图。看着有点怪。
    3、,视图字段固定后,用instead of触发器来实现。这个只是一种方法,针对你的需求,第2种要在各方面胜过此种。附查询主键的正确写法:
        select a.column_name
          into v_pk_column_name
          from user_cons_columns a, user_constraints b
         where a.constraint_name = b.constraint_name
           and b.constraint_type = 'P'
           and a.table_name =''
      

  3.   

    既然知道需要监控的表为user_t,那么应该知道user_t的主键列。在.new直接写上主键列明就可以。
    如果是多个表,那么需要多个触发器实现。
      

  4.   

    就是不知道user_t表里的主键的,要在存储器里获取主键字段名,存入变量里,单:new.变量名好像是不对的。