pro*c调存储过程,当某个输出参数为空时,sqlcode返回-1405,但此时存储过程是正常返回的,该输出参数是允许为空的,如何让sqlcode在此情况下正常返回0.例如下面的存储过程,正常执行时,客户端收到了返回值0,name也取到正确值,可sqlcode却是-1405。
问题出在os_errmsg是空.如果给os_errmsg随便赋一个值就一切ok.例如把程序里面/* os_errmsg :='执行失败'; */语句的注释拿掉就可以了。
oracle不能输出NULL参数吗?还是说客户端需要特别设置?或者存储过程需要修改?因为是从其他数据库移植过来,存储过程很多,有些逻辑比较复杂,如果一处一处检查每个输出在return时是否为null比较麻烦,而且随便赋值也可能给客户端造成麻烦。有什么简单方法处理这个输出空值报错的问题?create or replace function up_getname (
 is_cardid char ,
 os_name out char ,
 os_errmsg out varchar
)
return number isbegin
  if is_cardid is null then
  os_errmsg := '入口卡号不能为空';
    return (-1);
  end if;  begin
   select name into os_name from ep_card where cardid = is_cardid;
  exception
    when others then
    begin
        os_errmsg :='查询失败';
        return(-2);
    end;
  end;
  /* os_errmsg :='执行失败'; */
  return(0);exception
 when others then
 begin
  os_errmsg :='执行失败';
  return(SQLCODE);
 end;
end up_getname;

解决方案 »

  1.   

    就算加上os_errmsg:='';这样的语句执行后sqlcdoe也报错,必须给一个字符串才行,怎么解决啊
      

  2.   

    你在第一个begin下面写上
    os_name:='';
    os_errmsg:='';
    这2句话试下
      

  3.   

    已经解决了,不过修改比较大啊,还是很麻烦。2楼说的方法赋空格也算是乱赋值啊.
    下面是网上搜到的一篇文章中的一段PROC中的NULL值的处理 
      如果某一字段取出的值是NULL,会报:sqlcode=-1405, sqlerr=ORA-01405: 读取的列值为 NULL 
      并且相应的宿主变量的值不会被改变,为执行该SQL语句之前的值. 常用的处理NULL值的方法有: 
      (1)采用指示器变量,此时不会有-1405错误,当必须是所以为NULL的字段都有相应的指示器变量,如果某一字段没有指示器变量,但取出的值 
      为NULL值,则仍然会有-1405错误.当取出的值是NULL时,相应的指示器变量变量为-1,可根据指示器变量的值做响应的处理。 
      (2)如果字段较多,可取字段到一个结构体中及与该结构体对应的指示器结构体中.如上面的例子中可定义结构体: 
      struct str_emp{ 
      long al_empno; 
      char ac_ename; 
      char ac_hiredate; 
      double af_sal; 
      }; 
      struct str_emp_ind{ 
      long al_empno; 
      char ac_ename; 
      char ac_hiredate; 
      double af_sal; 
      }; 
      
      struct str_emp str_emp; 
      strcut str_emp_ind str_emp_ind; 
      在取之前可用memset(&str_emp,0,sizeof(str_emp)).清空该结构体,这样如果是字符型的NULL,会为"",整型的NULL会为0, 
      浮点型的会为0.00。此时不会有-1405错误。 
      (3)也可采用NVL()函数:举例如下: 
      EXEC SQL DECLARE authors CURSOR FOR 
      SELECT EMPNO, NVL(ENAME,chr(0)),nvl(to_char(HIREDATE,'yyyy/mm/dd hh24:mi:ss'),chr(0)),NVL(SAL,0) FROM EMP; 
      这样也不会有-1405错误不,当取出的值是NULL时,自动用NVL()中指定的值代替. 
      CHR(0)也可直接用''代替,如下: 
      SELECT EMPNO, NVL(ENAME,''),nvl(to_char(HIREDATE,'yyyy/mm/dd hh24:mi:ss'),''),NVL(SAL,0) FROM EMP;