深入理解ORA-01403与ORA-01405
1、ORA-01403 详解
大家都知道在用select 查询语句时,如果遇到 data not found,则会抛出该错误信息,例如:
select process_seq from t_acct_process ; /* 如果t_acct_process 没有数据, 则会发生ORA-01403 */
但是如果, 把字段加上函数会怎么样呢? 如下:
1) select max(process_seq) from t_acct_process ; /* 此时,如果t_acct_process 没有数据, 则不会发生ORA-01403, 而是SQLCODE==0, 返回NULL*/
可是WHY?
问题出在max函数, 我们select 的contents(内容)是max(process_seq)整体,而max函数当它的参数取不到值是,它会默认付个NULL上去,并返回结果NULL,这样select结果就有记录了,为一条空记录,所以没有发生ORA-01403。
2)select to_char(process_seq) from t_acct_process;
此时,如果t_acct_process 中没有记录,则会发生ORA-01403, 愿意是to_char函数不会给参数付默认值, 也没有默认返回值, 所以返回没有记录ORA-01403
总结,对于集合类的函数max(), min(), sum, count()等等,当参数取不到值时,会默认付NULL,不会发生ORA-01403;
而对于其他非集合类函数,例如to_char, to_number等等,则不会有参数默认值, 也没有返回值,所以发生ORA-01403
2、ORA-01405 详解
我们在unix下敲入: OERR ORA 1405 会得到:
01405, 00000, "fetched column value is NULL"
// *Cause:
// *Action:
该错误发生在pro*C程序或者存储过程中:
select pay_mode into :iPayMode from t_acct_process ;
这里如果pay_mode 没有值(NULL),则可能会发生ORA-01405,为什么是可能呢,因为ORA-01405仅仅发生在:
试图将一个空值存入一个非空的变量时; 因此可以用预先初始化的方法解决此问题:
memset( xxx, 0, sizeof(xxx) ); /* 字符串初始化 */
pay_mode = 0; /* 数值初始化 */
另外一种方法是:NVL函数
select NVL(pay_mode, 0) into :iPayMode from t_acct_process ;
3、附录---表结构
create table T_ACCT_PROCESS
(
PROCESS_SEQ NUMBER(9) not null,
BILL_CYCLE_SEQ NUMBER(8) not null,
ACCT_FILE_NAME VARCHAR2(128),
PROCESS_STATUS NUMBER(2),
PROCESS_TYPE NUMBER(2),
PROCESS_PROG NUMBER(6),
CREATE_DATE DATE,
OPERATOR_ID NUMBER(6),
ACCT_FILE_TYPE NUMBER(3),
PAY_MODE NUMBER(2)
)
阅读(7516) | 评论(0) | 转发(0) |