表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多一个非关键字段

解决方案 »

  1.   

    1 关于触发器,楼主既然知道思路,那继续写下去就可以了。
      select nvl(distinct name ,'其他') into yourname from a where name_id=:new.name_id;
      insert c values(.......);
    2 应该是不能。
      

  2.   


    1 关于触发器,楼主既然知道思路,那继续写下去就可以了。
      select nvl(distinct name ,'其他') into yourname from a where name_id=:new.name_id;
      insert c values(.......);
    2 不能,因为你的写法,必须字段是一致的
      

  3.   

    写这个回贴,主要是想说明在存储过程中判断insert或者update可以使用关键字
    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;
      

  4.   

    我就像知道select name from 表A where name_id = :new.name_id能不能找到记录,这个语句有没有一个返回值就像sqlcode一样可以判断结果.想根据这个结果if then else呢.
      

  5.   

    不是已经有了吗?
    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里面很多的处理是需要换个思路来进行的。