您的位置:首页 > 数据库 > Oracle

oracle 应用中遇到的问题

2009-09-25 14:22 246 查看

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

今天晚上易方达进行验收测试时,发现一个问题:
打开开放式基金指令快速下达界面时,发生oracle错误,错误描述如下:
ORA-00918: 未明确定义列,详细信息见图ERR1.JPG。
错误的原因为:中间层(business/pm/func/ GetMonitorCmndData.java)写SQL语句时,部分列没有指定对应的表名。

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

大家以后在先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’格式的数据,所以转换就会出错!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐