Chinaunix首页 | 论坛 | 博客
  • 博客访问: 74094
  • 博文数量: 10
  • 博客积分: 186
  • 博客等级: 入伍新兵
  • 技术积分: 144
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-10 17:31
文章分类

全部博文(10)

文章存档

2014年(1)

2013年(4)

2012年(2)

2011年(1)

2010年(2)

我的朋友

分类: Oracle

2010-11-13 11:15:45

深入理解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) |
给主人留下些什么吧!~~