请教各位高手触发器的写法

roselife 2007-12-25 09:01:14
表A(id,no,val1,stat1,val2,stat2,val3,stat3,...val10,stat10);
表B(value,status);

1往表A中插入一条记录时,在B中产生记录的个数取决于表A中no的值,这个插入触发器如何写
2修改表A中val或stat的值,B中相应的记录也会改变,这个触发器如何写
谢谢!
...全文
85 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxlineji 2008-01-03
  • 打赏
  • 举报
回复
试试!!
create or replace trigger insert_a
before insert on a
for each row
declare
v_no a.no%type;
x b.r_id%type;
v_sql varchar2(8000);
begin
v_no := :new.no;
I := 0;
select max(r_id) into x from b;
x:=x+1;
for i in 1..v_no loop
v_sql := 'insert into B(r_id,id,value,status) values (:x,:id,:val,:stat)' ;
v_sql:=v_sql||' using x,:new.id,:new.val'||i||',:new.stat'||i;
execute immediate v_sql ;
x:=x+1;
End Loop;


end insert_a;

update触发器,可以通过判断:old.val1=:new.val1,:old.stat1=:new.stat1 如果不等,则说明更新该列,如果等,说明没有更新该列数据
读出是第几个stat+n被更新,再到b表update相应的行!!
RedGeneral 2007-12-25
  • 打赏
  • 举报
回复
也不知道表A 和 表B 靠什么去关联,以及表B的主键。
大体写了个,你看看吧

Create Or Replace Trigger TIUA_表A
After Insert Or Update On 表A Of No ,Value ,Status For Each Row
Declare
I Integer := 0;
Begin
If Inserting Then
I := 0;
Loop
Exit When I >= Nvl(:New.No,0);
--//循环向表B中插入数据
End Loop;
End If;


If Updating Then
Update 表B
Set Value = :New.Value,
Status = :New.Status
Where ……
End If;

End TIUA_表A ;
roselife 2007-12-25
  • 打赏
  • 举报
回复

谢谢上面各位,可能我描述的不是很清楚
表A(id,no,val1,stat1,val2,stat2,val3,stat3,...val10,stat10);
表B(r_id,id,value,status)其中r_id为主键,id同表A中的id。
1插入触发器 当在表A中插入一条记录的时候,表B中产生相应的no条记录。先找出表B中r_id的最大值max(r_id)
插入的记录为(max(r_id)+1,id,val1,stat1),...(max(r_id)+no,id,valno,statno)
2更新触发器 当在表A中更新val或stat值时,表B中相应的纪录会修改。
当表A中更新no的值时,表B中的记录会相应的增删。
这两个触发器如何实现,谢谢!
shui_windows 2007-12-25
  • 打赏
  • 举报
回复
关于修改的不知道两个表之间是什么关系,不知道该怎么写。
shui_windows 2007-12-25
  • 打赏
  • 举报
回复
按照我自己的理解写的一个
不知道lz要的是不是这样的?
create or replace trigger insert_a
before insert on a
for each row
declare
v_no a.no%type;
I a.no%type;
v_sql varchar2(8000);

begin
v_no := :new.no;
I := 0;
Loop
Exit When I >= Nvl(:New.No,0);
v_sql := 'insert into B(value,status) values (:new.val'||to_char(I)||',:new.stat'||to_char(I)||')';
execute immediate v_sql;
End Loop;


end insert_a;

17,089

社区成员

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

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