有一表ggss ,在其插入一条记录后,自动在uploads表内增加一条记录,但是要根据ggss这条记录的一个外键找到另一个表rwdxx中的type字段,取出后根据值判断将固定数据插入到uploads里。我是这么写的,但是提示错误,大家帮看一下怎么改create or replace trigger INSERT_UPLOADS  after insert  on  ggss 
for each row
declare
pid number(1);--定义两个变量
ghdw varchar2(200);
begin
  select r.rwdlx into pid from ggss g,rwdxx r where r.rwdid=g.rwdid and g.ggssid=:new.ggssid ;--在这行提示错误,不知道可不可以用=:new.ggssid 做为条件,也不知道这么写对不对
  if(pid=0 ) then
    ghdw:='类型A';
  end if;
  if(pid=1) then
    ghdw:='类型B';  
  end if;
  if(pid=2) then
  ghdw:='类型C';
  end if;
  INSERT INTO UPLOADS(inspectid,Glscc,Fgscc)VALUES (:NEW.GGSSID,ghdw,:NEW.scsj);
end INSERT_UPLOADS;

解决方案 »

  1.   

     select   r.rwdlx   into   pid   from   ggss   g,rwdxx   r   where   r.rwdid=g.rwdid   and   g.ggssid=:new.ggssid   ;
    这个语句先要判断 select count(*) into  v_count from  ggss   g,rwdxx   r   where   r.rwdid=g.rwdid   and   g.ggssid=:new.ggssid   ;if v_cout > 0 then
      select   r.rwdlx   into   pid   from   ggss   g,rwdxx   r   where   r.rwdid=g.rwdid   and   g.ggssid=:new.ggssid   ;
       if(pid=0   )   then 
            ghdw:= '类型A '; 
        end   if; 
        if(pid=1)   then 
            ghdw:= '类型B ';     
        end   if; 
        if(pid=2)   then 
        ghdw:= '类型C '; 
        end   if; 
        INSERT   INTO   UPLOADS(inspectid,Glscc,Fgscc)VALUES   (:NEW.GGSSID,ghdw,:NEW.scsj);  
    end if;
    如果v_count 不大于0,那条sql就会触发一个异常.
      

  2.   

    对哦,楼上说的对,如果是多条记录也会出错的
    总之呢,用select fieldname into v_fieldname from tablename where  ....
    这样的语句一定要确保一定能查到数据,并且只能有一条数据。
      

  3.   

    我试了一下
    select   count(*) into v_count from ggss g,rwdxx r where r.rwdid=g.rwdid and g.ggssid=:new.ggssid; 在执行这条语句的时候报错,我已经定义了v_count number ;是什么原因呢?
      

  4.   

    因为ggssid是唯一的,所以查出的数据只有一条
      

  5.   

    把你的错误时候信息,贴出来看看呢?换成动态SQL看看呢?
      

  6.   

    换成动态没有问题,可以正常查出来,这是在插入时的错误信息ora-04091:表ggss 发生了变化,触发器/函数不能读
    ora -06512:在表"insert_uploads",line 6
    ora-04088 触发器 "insert_uploads"执行过程中出错第6行就是select       count(*)   into   v_count   from   ggss   g,rwdxx   r   where   r.rwdid=g.rwdid   and   g.ggssid=:new.ggssid;  
      

  7.   

    现在才看到你的SQL,赫赫。
    Oracle的触发器里面,不可以参照自己的更新表,所以才有这个错误。
    其实,你可以用old里面的值呀,你只是想确认rwdxx的表的数据呀。对吧。不需要把要更新的ggss拖进来吧。
      

  8.   

    原来不可以参照自已的更新表呀,又学习一下,我是要根据这条插入ggss表的数据中的一个字段值跟rwdxx表进行关联,应该怎么做呀
      

  9.   

    直接用new里面的ggssid和rwdid来关联不是一样的吗?
    new和old里面都有所有的字段值的。
      

  10.   

    问题解决了,多谢各位正如Croatia 说的,不参照自已,而是直接用new里面的rwdid和rwd表中的rwdid来关联,可以正常插入了,学习了rwd表和ggss表是一对多的关系。在ggss的rwdid里对应着一个rwd记录,反过来一个rwd记录对应多个ggss记录,我用:new.rwdid找到rwd里的记录,取出值就可以了,具体如下:
    create or replace trigger INSERT_UPLOADS
      after insert  on  ggss 
      for each row
    declare
    pid number(1);
    v_count number;
    ghdw varchar2(200);
    begin
      select   count(*) into v_count from  rwd r where r.rwdid=:new.rwdid ; 
    if v_count   >   0   then   select r.rwdlx into pid from rwd r where r.rwdid=:new.rwdid ; 
      if(pid=0 ) then
        ghdw:='A';
      end if;
      if(pid=1) then
        ghdw:='B';  
      end if;
      if(pid=2) then
      ghdw:='C';
      end if;
       INSERT       INTO       UPLOADS(inspectid,Glscc,Fgscc)VALUES  (:NEW.GGSSID,ghdw,:NEW.scsj);     
    end if;
    end INSERT_UPLOADS;