语句:
  存储过程中的语句,使用了游标
    ....
     select name into v_name from test where id=v_record.id and addr=v_record.addr;
    ....
 创建成功
但是执行时报错,原因是test表没有相应的记录.
尝试办法:
   select name into v_name from test where id=v_record.id and addr=v_record.addr
and exists (select 1 from test where id=v_record.id and addr=v_record.addr);
报同样的错,请问用什么办法可以让存储过程执行成功,test 没有满足条件值时,可以设空或常量

解决方案 »

  1.   

    select nvl(max(name),'空') into v_name from test where id=v_record.id and addr=v_record.addr;
      

  2.   

    不是按照cursor循环的?
    “但是执行时报错,原因是test表没有相应的记录”是什么意思?
    select into 的nodatafound错误吧?
    一头雾水
      

  3.   

    to:doer_ljy(可战)
    cursor  c1 is 
     select id,addr from test0;
    不是同一个表,在另外一个表找匹配c1的值.
    问提就是:另一个表test没有匹配值时报错
      

  4.   

    select decode(count(*),0,'changliang',name) into v_name from test where id=v_record.id and addr=v_record.addr;
      

  5.   

    在条件 where id=v_record.id and addr=v_record.addr 下,
    选择不出相应的name,select nvl(max(name),'空') into v_name 可以解决这个问题。你试试看就明白了。
      

  6.   

    SQL> select xm,yw from a;XM    YW
    ----- ----------
    1     11
    2     12SQL> select nvl(max(yw),'a') from a where xm ='1';NVL(MAX(YW),'A')
    ----------------
    11SQL> select nvl(max(yw),'a') from a where xm ='3';NVL(MAX(YW),'A')
    ----------------
    aSQL>
      

  7.   

    楼主有没有用SQLcode的返回值来处理错误了?
    这种情况好像SQLcode = 100
    你看看是不是因为这个原因?
      

  8.   

    加上异常处理就行了,例如:
    begin
    select name into v_name from test where id=v_record.id and addr=v_record.addr;
    exception
         when others then 
            dbms_output.put_line ('error');
    end;
      

  9.   

    select decode(count(*),0,'changliang',name) into v_name from test where id=v_record.id and addr=v_record.addr;嘎嘎,支持sbaz(万神渡劫)
      

  10.   

    还有一种方法就是捕捉异常:
    ......
    select name into v_name from test where id=v_record.id and addr=v_record.addr;
    .....
    exception
      when no_data_found then
        v_name := '空';
    .....
      

  11.   

    v_name := null;
    for c in (select name from test where id=v_record.id and addr=v_record.addr) 
    loop
      v_name:=c.name;
      exit;
    end loop;
      

  12.   

    nvl(正确值,正确值为空时的常量)
      

  13.   

    wiler(@_@) 的方法才是正解,加上异常处理吧,
    对于oracle来说,procedure/trigger中的异常处理将非常关键,否则经常会编译通过了,使用的时候却总是报错.