文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>深入理解ORA-01403与ORA-01405

深入理解ORA-01403与ORA-01405

时间:2010-11-13  来源:eagledabao

深入理解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)
)
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载