zoukankan      html  css  js  c++  java
  • [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 - 每次遍历内容之间的字符串,用于定义 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>
  • 相关阅读:
    [BZOJ]1040: [ZJOI2008]骑士
    [BZOJ]1177: [Apio2009]Oil
    【luogu3384】【模板】树链剖分
    【NOIP2012TG】solution
    【NOIP2014TG】solution
    【NOIP2016TG】solution
    【NOIP2015TG】solution
    【NOIP2016】【LCA】【树上差分】【史诗级难度】天天爱跑步
    【网络流】【BZOJ1221】【HNOI2001】软件开发
    【网络流】【BZOJ1061】【NOI2008】志愿者招募
  • 原文地址:https://www.cnblogs.com/avivaye/p/3777608.html
Copyright © 2011-2022 走看看