|
|
原帖由 nyfor 于 2008-9-8 16:23 发表 ![]()
以上出现在 order by, group by 表达式中的函数调用与出现在 where 中的还有一个不同就是后者的函数调用表达式不论是否与表数据有关, 均对每一行数据都调用一次(注意这是筛选之后的每一行)
5.
SQL> exec pkg.reset_n;
PL/SQL procedure successfully completed
SQL> select pkg.inc_n from t where pkg.inc_n = 1;
INC_N
----------
2
3
4
SQL> select pkg.get_n from dual;
GET_N
----------
4
SQL>
SQL> exec pkg.reset_n;
PL/SQL procedure successfully completed
SQL> select pkg.inc_n from t where pkg.inc_n = 2;
INC_N
----------
SQL> select pkg.get_n from dual;
GET_N
----------
1
以上两条结果似乎不是我们所想象的.
SQL> exec pkg.reset_n;
PL/SQL procedure successfully completed
SQL> select * from (select pkg.inc_n n from t ) where n = 1;
N
----------
2
3
4
SQL> select pkg.get_n from dual;
GET_N
----------
4
SQL> exec pkg.reset_n;
PL/SQL procedure successfully completed
SQL> select * from (select pkg.inc_n n from t ) where n = 2;
N
----------
SQL> select pkg.get_n from dual;
GET_N
----------
1
这里我们发现Oracle对于复杂的查询做优化后导致执行结果不是我们想要的.
对于前两个SQL, Oracle 的执行路径已经转换为后面两个了. 那么我们有什么办法来防止这种情况发生呢, 禁止外层where谓词push 到内部查询, 但是Oracle好像又没有这样的 hint 可用. 目前我是没有找到什么好办法来阻止这种错误结果的发生.
这个简单:select * from (select pkg.inc_n n,rownum rn from t ) where n = 1;即可
|
|