Oracle使用经验点滴

1、由setLong()产生的空指针异常:

ref = jdbcTemplate.update(sql, new PreparedStatementSetter() {

	@Override
	public void setValues(PreparedStatement ps)
			throws SQLException {
       ....
       ps.setLong(18, crefFlag);

 如果这里的crefFlag为null,数据库定义的类型为INTEGER或NUMBER,则会抛出空指针异常,解决方法,先进行非空判断,如果为空则置0:

if (crefFlag == null) {
	ps.setLong(18, 0);
} else {
	ps.setLong(18, crefFlag);
}

 

2、在进行多表联查(包括自联接)时使用特殊处理方式

修改前:

SELECT T0.CORG_ID       CENT_ID,
 T0.CORG_NAME     ENT_NAME,
 T1.CORG_ID       CORG_ID,
 T1.CORG_NAME     ORG_NAME,
 T2.CUSER_ID      CUSER_ID,
 T2.CNAME         CNAME,
 T2.CTELEPHONE_NO CTELEPHONE_NO,
 T2.CFAX          CFAX,
 T2.CCREATOR_ID   CCREATOR_ID,
 T2.CEMAIL        CEMAIL,
 T2.CUSER_STATUS  CUSER_STATUS
  FROM T_ENTERPRISE T0, T_ENTERPRISE T1, T_USER T2, T_ENT_ORG_USER T3
 WHERE T2.CENT_ID != 'XL_01'
   AND T0.CORG_ID IN
       (SELECT CENT_ID FROM T_USER WHERE UPPER(CNAME) LIKE UPPER('%co%'))
   AND T2.CUSER_ID IN
       (SELECT CUSER_ID FROM T_USER WHERE UPPER(CNAME) LIKE UPPER('%co%'))
   AND T0.CORG_ID = T1.CENTERPRISE_ID
   AND T1.CORG_ID = T3.CORG_ID
   AND T2.CUSER_ID = T3.CUSER_ID
 ORDER BY T2.CNAME, T1.CORG_ID;

修改后:

SELECT /*+FIRST_ROWS*/
 T0.CORG_ID       CENT_ID,
 T0.CORG_NAME     ENT_NAME,
 T1.CORG_ID       CORG_ID,
 T1.CORG_NAME     ORG_NAME,
 T2.CUSER_ID      CUSER_ID,
 T2.CNAME         CNAME,
 T2.CTELEPHONE_NO CTELEPHONE_NO,
 T2.CFAX          CFAX,
 T2.CCREATOR_ID   CCREATOR_ID,
 T2.CEMAIL        CEMAIL,
 T2.CUSER_STATUS  CUSER_STATUS
  FROM T_ENTERPRISE T0, T_ENTERPRISE T1, T_USER T2, T_ENT_ORG_USER T3
 WHERE T2.CENT_ID != 'XL_01'
   AND T0.CORG_ID IN
       (SELECT CENT_ID FROM T_USER WHERE UPPER(CNAME) LIKE UPPER('%co%'))
   AND T2.CUSER_ID IN
       (SELECT CUSER_ID FROM T_USER WHERE UPPER(CNAME) LIKE UPPER('%co%'))
   AND T0.CORG_ID = T1.CENTERPRISE_ID
   AND T1.CORG_ID = T3.CORG_ID
   AND T2.CUSER_ID = T3.CUSER_ID
 ORDER BY T2.CNAME, T1.CORG_ID;
   

修改后,Oracle会调整执行SQL的路径,会提高执行效率!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值