触发器select 问题

qw84578872 2014-09-15 05:48:33
我有表 table1 和 table2 两个表结构是 一样的 字段 id和name, 我需求是 给 table2 建立触发器 执行 insert 语句时 判断 将要插入的数据是否在 table2 里有 如果有 就将数据插入到 table1 中。

这是我写的代码:
create or replace trigger table2_insert
after insert on table2
for each row
declare
v_count := 0;
begin
select count(*) into v_count from table2 where nvl(id,'1')=nvl(:new.id,'1') and nvl(name,'1')=nvl(:new.name,'1') ;
if v_count > 0 then
insert into table1 values(:new.id,:new.name);
end if;
end;

在我执行
insert into table2 values('1','www');
错误:
ora-04091 表system.table2 发生变化,触发器/函数不能读它。

我尝试去除
select count(*) into v_count from table2 where nvl(id,'1')=nvl(:new.id,'1') and nvl(name,'1')=nvl(:new.name,'1') ; 这句
能正常插入。

求大牛指点,我刚学oracle不久
...全文
399 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyongle 2014-09-26
  • 打赏
  • 举报
回复
将after 改成before 另外再创建个临时表,当插入到临时表的数据在table2里有的时候就将数据插入到table1,否则插入到table2里
卖水果的net 2014-09-26
  • 打赏
  • 举报
回复
after TR 没有 :new 。 建议 LZ 查查 :new 和 :old 与 insert , update , delete 的对应关系。
不写代码的钦 2014-09-16
  • 打赏
  • 举报
回复
看来楼主已经找到答案了。
qw84578872 2014-09-16
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
行级的触发器 只有before insert 可以查询表自身的数据,这是oracle的限定 目前这种情况下只能修改你的代码,在before insert 实现你的功能
我用 before insert 如果 不用 raise_application_error(-2000,‘错误’); 进行终止的话 对 table1 表数据插入怎么都会有一样的数据 不过我看了下 http://bbs.csdn.net/topics/330089509 这里面 ID:nGX20080110 他解决的方式 ,使用视图的方式就很好控制了。
bw555 2014-09-15
  • 打赏
  • 举报
回复
行级的触发器 只有before insert 可以查询表自身的数据,这是oracle的限定 目前这种情况下只能修改你的代码,在before insert 实现你的功能
qw84578872 2014-09-15
  • 打赏
  • 举报
回复
我试过将 after 改成 before 这样的话 比如我插入一条 数据 这条数据table2已经有一样的 ,执行完以后 table2 和table1 都有。
bw555 2014-09-15
  • 打赏
  • 举报
回复
触发器改为插入前,我记得插入后触发器不能查询自身数据

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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