大家好!我从某一个表中FETCH一条记录,但是如果该记录中有空值,就会报错ORA-1405。
但是我的表中肯定会有某些字段存在空值,难道这样就不能用游标取值了吗?
系统环境是oracle9i、pro*c
谢谢!

解决方案 »

  1.   

    是pro*c中独有的问题吗?我在sqlplus中试了试好像没这个问题。
    OPER@tl> create table test(aaa number,bbb number);表已创建。OPER@tl> insert into test values(1,2);已创建 1 行。OPER@tl> insert into test values(3,null);已创建 1 行。OPER@tl> insert into test values(null,null);已创建 1 行。OPER@tl> commit;提交完成。OPER@tl> declare
      2  cursor cur is select * from test;
      3  var1 test%rowtype;
      4  begin
      5  open cur;
      6  loop
      7  fetch cur into var1;
      8  exit when cur%notfound;
      9  dbms_output.put_line('aaa is:'||var1.aaa||' bbb is:'||var1.bbb);
     10  end loop;
     11  end;
     12  /
    aaa is:1 bbb is:2
    aaa is:3 bbb is:
    aaa is: bbb is:PL/SQL 过程已成功完成。OPER@tl> 
      

  2.   

    很奇怪,如果是用游标,会在定义的时候就报错(DECLARE CURSOR ORA-1405)
    如果不用游标,直接取单个值也是报错ORA-1405
    只有表中的每个字段都不为空,才能正常
      

  3.   

    谢谢vc555。你是直接输出了,而我是定义了宿主变量,将DB中取到的值放入宿主变量中,会不会不能将空值存放在宿主变量中呢?
      

  4.   

    就是这个问题了。游标中的空值是可以fetch进普通变量的。
    你只有用nvl转化了。可以转化为一个特殊值,然后在程序中根据这个值知道它本来为空。
      

  5.   


    能否明示该如何转换NVL?谢谢!
      

  6.   

    我记起来了,用指示变量可以解决,不知道你们说的NVL是指示变量吗 ?
      

  7.   

    你搜搜看oracle nvl函数的用法。
      

  8.   


    明白了。NVL函数是SQL中的,如果值为空则返回一个指定的值。
    我想还是在程序中增加指示变量来处理,谢谢!
      

  9.   

    用nvl(字段名字,0)就可以避免为空的值了