|
本帖最后由 qingyun 于 2014-5-1 13:37 编辑
好贴,有Newkid兄参与,必然有深度;
1.动态绑定变量我也困惑过 : execute immedate '... 'using 后面不能接数组,只能是一个一个变量写;但是变量有的是不固定的;
上面几个朋友举得例子都有局限性,比如4个where条件,只写了4种可能性,实际是power(2,4)=16种可能性 ;
相当于考虑了 grouping sets 的 rollup ,没考虑cube ;其实就是rollup 也够不通用了;后面几个例子优化了一下,通过变量数组的个数来动态实现,稍微好些了,但是还是有局限性;
所以:dbms_sql 才是终结解决方法;NewKid兄也说的很详细,但是我也不喜欢用dbms_sql,毕竟使用起来比较复杂,而且我还怀疑dbms_sql 会损失一定的效率; 或者用 sys_context配合execute immedate 使用,感觉有很怪怪的,会不会执行路径出问题;
2. where 1=1 这个写法,我也参与讨论了;我一直觉得很傻,其实很多工具软件里也用到这个,比如toad,不知道最新版本有没有把这个去掉;
其实这个技巧,我个人认为是程序员开始的不动脑筋或是偷懒;
以为后面直接 and...and... 一路拼接下去,实现起来很“方便”;最后大家一个学一个,貌似成了一个规范;
但是当初那个帖子,大家后来的讨论的有点偏离方向,搞得1=1好像有很多玄关似的,有的人甚至认为这样是为了优化执行路径的考虑;
其实就算拼接,不用1=1 也很简单的;
每个条件都写 and...
最后拼接前 ,截掉前面4个字母就OK了;
|
|