触发器中的动态SQL老是报错,来位大大看下呗。

mchyiy 2014-01-13 01:27:43
create or replace trigger insert_user   --创建一个触发器
before insert on user_t
for each row
declare
v_sql varchar2(1000) ;
keyFieldName varchar2(50) ;
BEGIN
select c.column_name into keyFieldName from user_cons_columns c
where c.table_name ='USER_T' and c.position is not null and rownum = 1;
if inserting and keyFieldName is not null then
v_sql := 'insert into u_t(key_name) values(:new.'||keyFieldName||')';
EXECUTE IMMEDIATE v_sql;
end if;
end insert_user;

我要实现的是,监听一张表,插入数据的时候同时将改变后的主键,存储到另一张变里,主键找到了,但在new.字段的出错了
编译的时候没有错但在
EXECUTE IMMEDIATE v_sql;这句的时候
老是报并非所有变量都已绑定,
...全文
289 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
既然知道需要监控的表为user_t,那么应该知道user_t的主键列。在.new直接写上主键列明就可以。 如果是多个表,那么需要多个触发器实现。
mchyiy 2014-01-17
  • 打赏
  • 举报
回复
引用 8 楼 xiaolingdang0802 的回复:
既然知道需要监控的表为user_t,那么应该知道user_t的主键列。在.new直接写上主键列明就可以。 如果是多个表,那么需要多个触发器实现。
就是不知道user_t表里的主键的,要在存储器里获取主键字段名,存入变量里,单:new.变量名好像是不对的。
shenlele088 2014-01-16
  • 打赏
  • 举报
回复
没干过,便研究了一下,发现直接用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 =''
mchyiy 2014-01-14
  • 打赏
  • 举报
回复
有人能给个思路吗?
mchyiy 2014-01-13
  • 打赏
  • 举报
回复
引用 2 楼 forgetsam 的回复:
1 你找主键的语句就是错的,不过不是报错的原因。 2 :new. 无法动态。
主键哪里是对的,加入我就是想要将改变的主键的值提取出来该怎么写呢?
mchyiy 2014-01-13
  • 打赏
  • 举报
回复
那我要实现这个功能该怎么做呢?给点思路吧。
  • 打赏
  • 举报
回复
引用 2 楼 forgetsam 的回复:
1 你找主键的语句就是错的,不过不是报错的原因。 2 :new. 无法动态。
:new问题
forgetsam 2014-01-13
  • 打赏
  • 举报
回复
1 你找主键的语句就是错的,不过不是报错的原因。 2 :new. 无法动态。
binsweet 2014-01-13
  • 打赏
  • 举报
回复
错误很明确,变量没有绑定,就是v_sql := 'insert into u_t(key_name) values(:new.'||keyFieldName||')';中的:new.'||keyFieldName||'是不能这样的 动态SQL执行前必须明确值

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧