[oracle] 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 - 每次遍历内容之间的字符串,用于定义 AND 或 OR(可选) 遍历类型为 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>