oracle存储过程能输出空值参数吗?

_flying_ 2007-11-02 01:13:56
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 is

begin


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;
...全文
455 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
_flying_ 2007-11-02
  • 打赏
  • 举报
回复
已经解决了,不过修改比较大啊,还是很麻烦。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;
zhangzhiyong168 2007-11-02
  • 打赏
  • 举报
回复
你在第一个begin下面写上
os_name:='';
os_errmsg:='';
这2句话试下
_flying_ 2007-11-02
  • 打赏
  • 举报
回复
就算加上os_errmsg:='';这样的语句执行后sqlcdoe也报错,必须给一个字符串才行,怎么解决啊

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧