oracle-ibatis-整理

<!-- 复用sql代码 -->

<sql id="CUSTOM_CABINET_INFO.QUERY_CABINET">

<dynamic prepend="AND">

<isNotNull prepend="AND" property="requestObject.cabinetNo"> 

eci.cabinet_no like '%'||#requestObject.cabinetNo#||'%'

</isNotNull>

<isNotNull prepend="AND" property="requestObject.status"> 

eci.status = #requestObject.status#

</isNotNull>

</dynamic>

</sql><!-- 查询货柜信息 -->

<select id="CUSTOM_CABINET_INFO.queryCabinetInfo" resultClass ="com.goldenvista.webapp.basic.custom.model.QueryCabinetInfoModel" parameterClass="com.goldenvista.commons.model.PagingBaseModel">

SELECT * FROM ( 

SELECT ROW_.*, ROWNUM ROWNUM_ FROM (

select 

eci.cabinet_id as cabinetId,

eci.cabinet_no as cabinetNo,

eci.cabinet_name as cabinetName,

decode(eci.cabinet_type,'1','2组','2','4组','3','6组','4','8组','') as cabinetType,

els.line_no as lineNo

from ec_cabinet_info eci,ec_line_site_rel els

where eci.distribution_site_no =els.distribution_site_no(+)

<include refid="CUSTOM_CABINET_INFO.QUERY_CABINET" />

<![CDATA[

order by eci.cabinet_no desc

)

row_ WHERE rownum <=#endRecord#

) 

WHERE rownum_ >#startRecord#

]]>

</select>





1 decode函数



DECODE函数相当于一条件语句(IF).

它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。

函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。

当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。

区别于SQL的其它函数,DECODE函数还能识别和操作空值.

其具体的语法格式如下: DECODE(input_value,value,result[,value,result…][,default_result]);



2 外连接的另一种写法



SELECT A.id, B.IDD

FROM A, B

WHERE A.id(+)=B.IDD



等价于



SELECT A.id, B.IDD

FROM A 

RIGHT OUTER JOIN B ON (A.id=B.IDD)



3 追加过滤条件



prepend 为连接操作符 常用于连接 ""、"AND"、"OR"、"WHERE" 、"(" 、")"等



<dynamic prepend="AND">

<isNotNull prepend="AND" property="requestObject.cabinetNo"> 

eci.cabinet_no like '%'||#requestObject.cabinetNo#||'%'

</isNotNull>

</dynamic>



4 oracle 分页



要查询Test表第n条到第m条的记录,我们应该这样写: 

//对已形成的rownum进行过滤

select * from (

//先用一个select把待查sql包围起来,此时rownum已经形成 

select row_.*, rownum rownum_ from ( 

//真正的sql语句

select * from Test 

) row_

)where rownum_ <= m and rownum_ >= n;



简化:

select * from (

select row_.*, rownum rownum_ from (

select * from Test 

)row_

)where rownum_ <= m and rownum_ >= n;



5 <![CDATA[ ]]> 标记

避免Sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响.如大于小于符号



6 连接符 ||

连接字符串的连接符 常用于模糊查询



③



<insert id="insert">

INSERT INTO EC_ALARM_LIST 

(

ALARM_LIST_ID, 

RECV_NAME, 

RECV_EMAIL 

)

VALUES 

(

#alarmListId:DECIMAL#,

#recvName:VARCHAR#, 

#recvEmail:VARCHAR#

)

</insert><insert id="insertNotNull">

INSERT INTO EC_ALARM_LIST 

<dynamic prepend="("> 

<isNotNull prepend="," property="alarmListId"> 

ALARM_LIST_ID

</isNotNull>

<isNotNull prepend="," property="recvName"> 

RECV_NAME

</isNotNull>

)

</dynamic>

VALUES

<dynamic prepend="(">

<isNotNull prepend="," property="alarmListId"> 

#alarmListId#

</isNotNull>

<isNotNull prepend="," property="recvName"> 

#recvName#

</isNotNull>

)

</dynamic>

</insert><select id="queryServiceMonLogCount" resultClass="java.lang.Long" parameterClass="com.goldenvista.commons.model.PagingBaseModel">

SELECT count(*)

FROM (

SELECT 

nvl(CEIL((sysdate - max(T.END_TIME)) * 24 * 60),-1) as communicationTime,

nvl(max(T.SERVICE_MON_ID),-1)     as    serviceMonId,

<![CDATA[(CASE WHEN NVL((sysdate - max(T.END_TIME)) * 24 * 60,30)>20 THEN '2' else '1' end) as INTERVAL,]]>

FROM SYS_MONITOR_LOG T, SYS_CABINET_INFO C

WHERE T.MON_OBJECT(+) = C.CABINET_NO 

AND T.SERVICE_MON_ID IN ( SELECT MAX(sli.SERVICE_MON_ID) FROM box.SYS_MONITOR_LOG sli GROUP BY sli.MON_OBJECT)

<isNotNull prepend="AND" property="requestObject.monObject"> 

T.MON_OBJECT like '%' || #requestObject.monObject# || '%'

</isNotNull>

<isNotNull prepend="AND" property="requestObject.intervalDate2"> 

<![CDATA[     CEIL((sysdate - T.END_TIME) * 24 * 60) > #requestObject.intervalDate2# ]]>

</isNotNull>

<isNotNull prepend="AND" property="requestObject.intervalDate1"> 

<![CDATA[     CEIL((sysdate - T.END_TIME) * 24 * 60) <= #requestObject.intervalDate1# ]]>

</isNotNull>

GROUP BY C.CABINET_NO

)

</select>



nvl(str,replaceStr)

ceil(n) 取大于等于数值n的最小整数

floor(n)取小于等于数值n的最大整数



SQL> select ceil(9.5) from dual;



CEIL(9.5)

----------

10



SQL> select floor(9.5) from dual;



FLOOR(9.5)

----------

9<select id="querySysModule" resultClass ="com.goldenvista.webapp.model.entity.mapping.SysModule" >

select distinct 

t.MODULE_ID as moduleId,

t.MODULE_PID as modulePid,

t.MODULE_NAME as moduleName,

t.MODULE_ICON as moduleIcon,

t.MODULE_ICONCLS as moduleIconcls,

t.MODULE_LINK as moduleLink,

t.ORDER_INDEX as orderIndex

from sys_module t

where t. MODULE_PID=#modulePid#

start with t.module_id in(

select sup.model_id

from sys_user_permits sup,sys_module sm

where sup.model_id = sm.module_id

and sup.USER_ID=#userId#

)

connect by prior t.module_pid = t.module_id

order by t.ORDER_INDEX,t.module_id

</select>



Oracle中递归算法 start with...connect by prior子句基本语法是:



select ... from tablename 

start with 条件1 

connect by prior 条件2 

where 条件3;



例: 

select * from table 

start with org_id = 'HBHqfWGWPy' 

connect by prior org_id = parent_id;



分析:



简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: org_id,parent_id

那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。用上述语法的查询可以取得这棵树的所有记录。 



条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 

条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。

条件3 是过滤条件,用于对返回的所有记录进行过滤。



简单介绍如下: 

早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 

第一步:从根节点开始; 

第二步:访问该节点; 

第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步; 

第四步:若该节点为根节点,则访问完毕,否则执行第五步; 

第五步:返回到该节点的父节点,并执行第三步骤。



总之:扫描整个树结构的过程也即是中序遍历树的过程。



⑦ 

<select id="CUSTOM_PURCHQUERY.queryLists" resultClass="com.goldenvista.webapp.purchase.model.PurchListModel">

select 

sum(l.Purchase_Amount) as amount,

sum(l.SUBTOTAL) as total

from 

ec_purchase_explain_list l

<dynamic prepend="WHERE">

<isNotNull property="viewList">

l.purchase_explain_head_id in

<iterate property="viewList" conjunction="," open="(" close=")">

#viewList[]#

</iterate>

</isNotNull>

</dynamic>

</select>



Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容。 

Iterate 的属性: 

prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选) 

property - 类型为 java.util.List 的用于遍历的元素(必选) 

open - 整个遍历内容体开始的字符串,用于定义括号(可选) 

close -整个遍历内容体结束的字符串,用于定义括号(可选) 

conjunction - 每次遍历内容之间的字符串,用于定义 ANDOR(可选) 

遍历类型为 java.util.List的元素。



例子: 

<iterate prepend=AND” property=”userNameList” open=”(” close=”)” conjunction=OR> 

username=#userNameList[]# 

</iterate>



<delete id="member.batchDelete" parameterClass="java.util.List">

DELETE FROM member where id IN

<iterate conjunction="," open="(" close=")" >

#value[]# 

</iterate>

</delete>



注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将

对象标记为List,以防解析器简单地将List输出成String。





⑧ 多字段 group by



<!-- 站点信息查询:查询记录数 -->

<select id="CUSTOM_STAIONQUERY.queryStationListCount" resultClass="java.lang.Long" parameterClass="com.goldenvista.commons.model.PagingBaseModel">

select count(*) from( 

select 

* 

FROM 

EC_DISTRIBUTION_SITE eds, EC_CABINET_INFO eci

WHERE 

eds.distribution_site_no = eci.distribution_site_no(+)

<include refid="CUSTOM_STATIONQUERY.QUERY_STATION" />

group by 

eds.DISTRIBUTION_SITE_ID,

eds.DISTRIBUTION_SITE_NO,

eds.SITE_TYPE,

eds.SITE_TYPE_DETAIL,

eds.SITE_LEVEL,

eds.SITE_FULL_NAME,

eds.SITE_SHORT_NAME,

eds.SITE_ADDRESS,

eds.SITE_STATUS,

eds.NOTE

)

</select>LOWER()



<select id="queryEcGoods" resultClass ="com.goldenvista.webapp.model.entity.mapping.EcGoods" >

SELECT 

GOODS_ID as goodsId,

GOODS_SN as goodsSn,

GOODS_NAME as goodsName

FROM EC_GOODS 

<dynamic prepend="WHERE">

<isNotNull prepend="AND" property="goodsSn"> 

LOWER(GOODS_SN) like '%'||#goodsSn#||'%'

</isNotNull>

</dynamic>

ORDER BY GOODS_SN

</select>

 

你可能感兴趣的:(oracle)