cursor payment_cur is
select pay_serial_number,account_id,service_id from iutbs.payment;
------------后来打开cursor,
open payment_cur;
  loop
  fetch payment_cur into v_pay_serial,v_pay_account,v_pay_service
--------然后,见下面
select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
    into v_customer_id,v_service_kind,v_address_id,v_access_number
    from service
    where service_id=v_pay_service
   and service_seq_number=0;
--找不到用户信息就把customer_id付给一个序列!
   exception
     when no_data_found then
  select error_sequence.nextval into v_sequence from dual;
       v_customer_id:=v_sequence;
-------------------------
异常后执行把数据(service.customer,service.access_number,payment.service_id)插入了一个表中
在出现异常的时候,都是什么样的数据应该能插入表中?是不是根据service_id在service找不到数据,就插入异常表中啊?既然在service找不到数据,那可能有access_number值被找出来的可能吗?
可是这时,我查询插入异常的表发现access_number里面也插入了值?这个值是怎么来得啊?申明:access_number只有从service里取。
------------
写的太长。希望能得到回答!

解决方案 »

  1.   

    异常只能是某一段语的异常:
     BEGIN
       select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
         into v_customer_id,v_service_kind,v_address_id,v_access_number
         from service
        where service_id=v_pay_service
          and service_seq_number=0;
     EXCEPTION
       when no_data_found then
         select error_sequence.nextval into v_sequence from dual;
         v_customer_id:=v_sequence;
     END;
      

  2.   

    我好像明白你的意思了。是这样的,你是在loop中,执行
    select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
        into v_customer_id,v_service_kind,v_address_id,v_access_number
        from service
        where service_id=v_pay_service
       and service_seq_number=0;
    这个语句的,当找不到符合条件的记录时会触发异常,但是注意你这条语句是循环执行的,所以当出现异常时(也就是找不到记录时),v_address_id,v_access_number这些变量的值其实是上一次执行该语句取到的值!
      

  3.   

    既然在service找不到数据,那可能有access_number值被找出来的可能吗?这句话有问题,既然在service表中找不到数据,那access_number就没有值,触发异常表时就没它的值,若然有数据,那怎会触发异常表呢。错误在你的代码,把代码全贴出来吧。
      

  4.   

    做一个简单测试:
    SQL> select * from aa;ID FID
    -- ---
    1  0
    2  1
    3  1
    4  2
    5  3
    6  4
    6  5SQL> set serveroutput on
    SQL> declare
      2  v_id varchar(2);
      3  begin
      4  select id into v_id from aa where id='0';
      5  dbms_output.put_line('没有触发异常');
      6  exception
      7  when no_data_found then
      8  dbms_output.put_line('触发异常');
      9  end;
     10  /
    触发异常
    SQL> set serveroutput on
    SQL> declare
      2  v_id varchar(2);
      3  begin
      4  select id into v_id from aa where id='1';
      5  dbms_output.put_line('没有触发异常');
      6  exception
      7  when no_data_found then
      8  dbms_output.put_line('触发异常');
      9  end;
     10  /
    没有触发异常
      

  5.   

    zhuzhuyan (猪猪眼) 你好:
    一、在
       open payment_cur;
        loop
        fetch payment_cur into v_pay_serial,v_pay_account,v_pay_service;
        后你应该判断是否取到值了,比如向下面:
        IF payment_cur%NOTFOUND THEN
          --做为找到数据的处理
        END IF;
      三、我怀疑你的问题是因为没有判断NOTFOUND引起的,因为你在查询中作了这样的条件判断:
       where service_id=v_pay_service,假如v_pay_service的值为空,也就等于:
        where service_id=null而这样的语句是错误的。
      

  6.   

    谢谢各位的帮忙,我今天早上就看到了各位的答案,感觉csdn真温暖。
    现在我正在验证是不是 Lastdrop(空杯) 大哥(嘻嘻,先这样叫吧)所说的原因,数据现在还没有跑出来。
    to : qiuyang_wang(小数点) ,我的过程是有payment NOTDATEFOUND的异常判断的,就是我粘贴的时候,少了。真是不好意思。让你费心了。
    to:beckhambobo(beckham) 我的代码太长,不过,我疑惑的就是这个地方,所以没有把其它的地方贴出来。我在阐述一下我的疑惑,请帮我解答:
    ----------
    select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
        into v_customer_id,v_service_kind,v_address_id,v_access_number
        from service
        where service_id=v_pay_service
       and service_seq_number=0;
    --找不到用户信息就把customer_id付给一个序列!
       exception
         when no_data_found then
      select error_sequence.nextval into v_sequence from dual;
           v_customer_id:=v_sequence;
    -----------------------
    就是上面这段信息:我把异常的数据都插入了一个异常的表。我觉得由于异常产生的数据应该是这样的:customer_id是序列的值;service_id是payment里的service_id值,而access_number因为异常,应该是空值.可是,我现在在我的异常表里发现了,customer_id,service_id都是和我想的一样的值,可是access_number竟然也有值。我就想知道这个值是怎么插进入的?
    2.我还想知道的一个问题是:异常出现和select customer_id,access_number from service中select字段的先后还有关系吗?就是如果,customer_id找不到值,就不管access_number是否有值,就直接跳到异常?还是也判断access_number是否有值,然后在跳到异常?
    --------------------------------
    真的谢谢大家的帮忙。^_^
      

  7.   

    第一个问题:
      异常是针对你的SELECT未找到相应的记录而触发的.再你将SELECT的字段的值插入到变量中之前,这些变量有没有清空过,如果没有,则当SELECT引起NO_DATA_FOUND触发时,这些变量的值还是上次取得的值.
    第二个问题:
      其实还是上面的回答,异常触发和SELECT中的字段先后没有关系,它是指整个SELECT语句是否能够得到记录.而不是你说的,看CURSOTMER_ID是否有值,再看ACCESS_NUMBER是否有值.
    记住是整条SELECT语句.
      

  8.   

    to  tuidler() :
    谢谢你的回答,我清晰多了,真的感谢你。
    1。我没有清空过数据,看来应该是上次的值了。我在改改过程重新跑一遍。
    2。是我的同事说可能和顺序有关系,我当时觉得不是,可能我比较菜的原因,还是想问个清楚。
    谢谢。我的是qq:12553159
    如果不介意的话,
    希望能和各位高手交个朋友。
      

  9.   

    对,楼上所言属实,所以得到的ACCESS_NUMBER是最近一次成功获得那个值,而你在程序中没在异常情况下把它该值清空,所以它保存到下一次。
    当再次触发到异常情况下把该插入到表中。