oracle 应用中遇到的问题
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函数
如果把一个日期字符串转换为日期格式,比如日期字符串
相关文档:
本系列文章导航
[Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
[Oracle]高效的PL/SQL程序设计(二)--标量子查询
[Oracle]高效的PL/SQL程序设计(三)--Package的优点
[Oracle]高效的PL/SQL程序设计(四)--批量处理
[Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
[Oracle]高效的PL/SQL程序设计(六)- ......
SQL*PLus> desc emp;
名称 &nbs ......
Oracle函数和mysql函数比较
1. Oracle中的to_number()转换成数字;
Oracle> Select to_number(‘123’) from dual; ----- 123;
&nbs ......
Oracle笔记
l 关于TRUNC函数
SELECT
RELATED_ID ,
DOC_ID ,
CAT_ID ,
CAT_CODE ,
RELEASE_DATE ,
&n ......