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;
问题出在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;
os_name:='';
os_errmsg:='';
这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;