表A
ID NAME_ID NAME
1 1 语文
2 2 数学
3 3 英语
表B
ID NAME_ID FS
1 1 100
2 6 99
表C
ID NAME FS
1 语文 100
2 其他 99要求:当表B中ISERT或者UPDATE的时候表B相应ISERT或者UPDATE,如果表B中,select name from 表A where name_id = :new.name_id不存在的时候表C中name使用‘其他’顺表问一下触发器中能使用 insert into t_a select * from b where b.name = :new.name ;不能,表b比表a多一个非关键字段
ID NAME_ID NAME
1 1 语文
2 2 数学
3 3 英语
表B
ID NAME_ID FS
1 1 100
2 6 99
表C
ID NAME FS
1 语文 100
2 其他 99要求:当表B中ISERT或者UPDATE的时候表B相应ISERT或者UPDATE,如果表B中,select name from 表A where name_id = :new.name_id不存在的时候表C中name使用‘其他’顺表问一下触发器中能使用 insert into t_a select * from b where b.name = :new.name ;不能,表b比表a多一个非关键字段
select nvl(distinct name ,'其他') into yourname from a where name_id=:new.name_id;
insert c values(.......);
2 应该是不能。
1 关于触发器,楼主既然知道思路,那继续写下去就可以了。
select nvl(distinct name ,'其他') into yourname from a where name_id=:new.name_id;
insert c values(.......);
2 不能,因为你的写法,必须字段是一致的
updating或者inserting这个布尔性变量。create or replace TRIGGER pg.trg01
before insert or update
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
vName varchar2(1000);
begin
begin
select name into vName from a where a.name_id = :new.name_id;
exception when nodatafound then
vName := '其他';
end;
if updating then
更新c表
else
插入c表
endif;
end;
select name into vName from a where a.name_id = :new.name_id;
exception when nodatafound then
上面的语句,把Name存入vName中,如果这个查询没有合适的记录,会引发nodatafound 这个异常,这个异常会被exception when nodatafound then捕获,捕获后给vName赋值为'其它'
不需要用if then else endif的。如果怕出现多行可以捕获toomuchrow(!好像是这个)来判断。在plsql里面很多的处理是需要换个思路来进行的。