ORACLE里面的外连接可以简写成:
(+)=:右连接的简写
也就是:保留右表存在,左表不存在的行!
=(+):左连接
也就是:保留左表存在,右表不存在的行!
对于这种简写的局限性是显而易见的
可读性就很差,需要花时间去理解.因为我们的思维方式是:首先是怎么去连接,然后用什么条件过滤!分成两步走,便使得SQL清晰易懂.
记得在数据结构里面,完成表达式求解的算法也是采取分两步走的策略,一:转换成后缀表达式,二:然后在求职!虽然一步理论上可以达到,但是根据电脑的思维方式,采取两步走,是最容易实现的!
而SQL就是宣称的以人类的思考方式去解决问题!
||在ORACLE里面是连接字符串,相当于+
在构造可执行的SQL字符串时候,对于IN 变量,动态构造SQL语句时候如下所示
then
tempsql := ' and sp.department_oid = '||''''||de_oid||'''';
end if;
if vFlag = '1' then
if flag ='1' then
open result for
'select t.inv_stock_oid INV_STOCK_OID,t.stock_type_id STOCK_TYPE_ID,t.inv_position_oid INV_POSITION_OID,nvl(t.safety,0)-t.qty state,
t.part_no PART_NO,t.part_name PART_NAME,t.spec SPEC,t.unit UNIT,t.qty TOTALQTY,t.safety SAFETY,t.update_time UPDATE_TIME,
t1.potion_id POSITION_ID,t1.description POSITION_DESC,t2.stock_type_id STOCK_TYPE_ID,t2.description TYPE_DESC,
sp.inv_partnoclass_oid partnoclassoid,sp.qty DEQTY,sp.safe_qty SAFEQTY,de.department_name DEPARTMENT
from inv_stock t,inv_position t1,inv_stock_type t2,inv_stock_partnoclass sp,basicdata_department de
where de.department_oid(+) = sp.department_oid'
||tempsql||'
and sp.inv_stock_oid(+) = t.inv_stock_oid
and t.stock_type_id = t2.inv_stock_type_oid
and t.inv_position_oid = t1.inv_position_oid(+)
and t2.description='||''''||vCondition||''''||'
order by state desc';
return result;
注意特别奇怪的如下写法
tempsql := ' and sp.department_oid = '||''''||de_oid||'''';
t2.description='||''''||vCondition||''''||'
为什么会有那么多单引号呢?
首先我来说我们期望的结果是:对于变量,这里用字符串常量来代替
sp.department_oid = 'something';
而在代码中那个变量仅仅替代值,也就是something,
还有前后两个单引号需要表示出来,但是它们是直接常量,所以当作字符串写,就需要再加两个单引号括起来,最后转义的一个
所以每次总共四个!
一定有比这个更好的解决办法,目前由于对于ORACLE是新手,好多东西都有待学习
欢迎共同讨论