oracle 应用中遇到的问题

1多表联合查询时,一定要对每一列指定表名(包括条件中的列

今天晚上易方达进行验收测试时,发现一个问题:

打开开放式基金指令快速下达界面时,发生oracle错误,错误描述如下:

ORA-00918: 未明确定义列,详细信息见图ERR1.JPG

错误的原因为:中间层(business/pm/func/ GetMonitorCmndData.java)写SQL语句时,部分列没有指定对应的表名。

 

此问题在公司的电脑上都不会发生(数据库包括:9i10g),所以此问题特别隐蔽。

 

大家以后在先sql语句和存储过程时,一定要注意:

多表联合查询时,一定要对每一列指定表名(包括条件中的列)。

 

 

2、在查询语句的条件中尽量避免使用函数

在修改bug过程中,常发现一些查询语句的条件中出现函数的情况,如:

    DELETE FROM acc_balance

     WHERE host_id = r_cell.cell_id

       AND host_type = '1'

       AND balance_date < fn_acc_PreNumDate(v_p_fundid,'0',v_accdate,5);

      

    目的是为了删除超过5个交易日的数据,这里使用了我们自己写的函数 fn_acc_preNumDate

    sql语句检索时,如果acc_balance表中有1万条数据要删除,则此删除语句会执行此函数至少1万次,导致无谓的耗时。

  

    解决方法,如果fn_acc_preNumDate返回的数据一直不改变,则可以讲其赋值给变量。通过变量去执行sql语句。

    如:

    v_preNumDate := fn_acc_PreNumDate(v_p_fundid,'0',v_accdate,5);

 

    DELETE FROM acc_balance

     WHERE host_id = r_cell.cell_id

       AND host_type = '1'

       --AND balance_date < fn_acc_PreNumDate(v_p_fundid,'0',v_accdate,5);

       AND balance_date < v_preNumDate;

    这样fn_acc_prenumdate函数只需要执行一次即可达到删除数据目的。

 

各位同事如果碰到这种情况,可以将其更改一下。提升运行效率。

查询中避免使用to_date函数

如果把一个日期字符串转换为日期格式,比如日期字符串是’2009-01-01 11:21’,用to_date函数转换为 ‘yyyy-mm-dd’格式的日期会出错!

 

参考图

系统中存在问题地方:

QueryReckonData case 22:交易员指令执行情况查询(交易所)

lsStrBuf.append("       c.simple_name as fund_name,d.group_name,e.cell_name,to_date(a.cmnd_date,'yyyy-mm-dd') as cmnd_time,");

因为系统中的指令日期cmnd_date确实存在’2009-01-01 11:21’格式的数据,所以转换就会出错!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值