建了一个DML触发器,插入数据的时候触发,但是我在执行插入操作时却报错,不知道怎么回事?求解答。。
下面是触发器的代码
   create or replace trigger tr_test_insert   before insert  on test.tb1 REFERENCING  NEW AS NEW   for each row   begin       whq_update(:OLD.INVOICE_NO);--存储过程,其中参数是插入数据的第二列。共8列   end;
   /
下面是插入数据的语句
   
    insert into tb1(id,INVOICE_NO,...)    values('TEST001','0906-001',...);
下面是报错的信息
ORA-01422  精确获取的列数超过所必须的列数。求解答,,,在这先谢谢大家了

解决方案 »

  1.   

    错误可能发生在whq_update(:OLD.INVOICE_NO)
      

  2.   

    我也怀疑过,
    试过将whq_update(:OLD.INVOICE_NO)的参数改成8个 就是与插入的数据的列数一样,但是也不行。
      

  3.   

    能把whq_update的内容贴出来吗?
      

  4.   


    create or replace PROCEDURE test.my_update
    (
      a in varchar2
    )
    is
    b varchar2(16) :="";
    c number;
    d varchar2(16);
    e number;
    f varchar2(16);
    cursor c_t(A varchar2(16)) is select ...where XX=a ;
    begin  open c_t(a);
      loop
      fetch c_t into f;
      EXIT when c_t%NOTFOUND;
      b:=concat(b, detail_invoce)||',';
      end loop;
      close c_invoice;
      b:=substr(b,1,length(b)-1);
      select XX into c from xx where XX=b;
      select .. into e from ...;
      select .. into d from...where C= c and E=e;
      update ... where E= e and C=c;
      update ... where D=d;
    end my_update;这是存储过程代码...
      

  5.   

    检查一下下面的语句是不是有可能返回多行?
    select XX into c from xx where XX=b;
    select .. into e from ...;
    select .. into d from...where C= c and E=e;
      

  6.   


    我有做控制的呀,基本后面都有 where  rownum=1
      

  7.   


    恩 我重新检查了一下,有一条没有写 rownum=1 .
    在存储过程中,判断是否会返回多行,是根据实际查出来的结果判断的,还是根据语句判断的??
    请教....
    谢谢!!!
      

  8.   

    用sqlplus单步调试吧,看到底是哪一行出得问题,
      

  9.   

    你的sql对应的查询结果有多少就是多少,与语句没有关系,只与最后查询的结果有关
      

  10.   

    OK  已经好了 ,就是有一句少写了rownum=1.
    谢谢大家了。