之前开发时一直使用MySQL,现在项目中使用的数据库是Oracle,虽然大部分语句都一样,但也有一些差别比较大,因此记录一下,方便查询。代码都是整合mybatis后xml中的SQL。
1. 查询结果排序
使用nlssort(字段名,'NLS_SORT=SCHINESE_PINYIN_M')
。
例子:order by nlssort(orgName,‘NLS_SORT=SCHINESE_PINYIN_M’), nlssort(itemCategory2Name,‘NLS_SORT=SCHINESE_PINYIN_M’)
NLS_SORT的取值决定了排序的方式:
- SCHINESE_PINYIN_M : 按照拼音排序
- SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
- SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
2. 日期比较
按照日期区间查询时需要使用to_date('2019-04-02','YYYY-MM-DD')
函数。
其他:mybatis中还需要用<![CDATA[原样输出的值 ]]>
,防止<>
等符号被误读报错。
另外,大于小于号还可以用这个的标记:>=
, <=
例子:PH_PUTAWAY_DATE <=
to_date(#{order.putawayDateEnd},‘yyyy-mm-dd’)
—>PH_PUTAWAY_DATE <= to_date(#{order.putawayDateEnd},‘yyyy-mm-dd’).
3. 批量插入
先上例子。
<insert id="batchSaveCarrierFreightTempBean" parameterType="java.util.List">
INSERT INTO TMP_YFJSJDB (WTDID,ZYSFS,CYSID,FYL,YF,YSQ,SQYF,YJS,
JSYF,YKP,KPYF,YSH,SHYF,FKYF,WFKYF)
<foreach collection="list" item="item" index="index" separator="union all" >
select
#{item.wtdid},#{item.zysfs},#{item.cysId},#{item.fyl},#{item.yf},
#{item.ysq},#{item.sqyf},#{item.yjs},#{item.jsyf},#{item.ykp},
#{item.kpyf},#{item.ysh},#{item.shyf},#{item.fkyf},#{item.wfkyf}
from dual
</foreach>
</insert>
开发时,切忌在循环中访问数据库,在数据量大时会出现问题,数据库连接池中的连接都会被占用,然后报错:超出最大游标数。
按照MySQL的写法则会报错:程序未正确关闭,其实就是数据库语句本身的错误。
值太多等其他问题。
还有第二种写法:
<insert id="batchSaveCarrierFreightTempBean" parameterType="java.util.List">
INSERT ALL
<foreach collection="list" item="item" index="index" separator="union all" >
INTO TMP_YFJSJDB (WTDID,ZYSFS,CYSID,FYL,YF,YSQ,SQYF,YJS,
JSYF,YKP,KPYF,YSH,SHYF,FKYF,WFKYF) values(
#{item.wtdid},#{item.zysfs},#{item.cysId},#{item.fyl},#{item.yf},
#{item.ysq},#{item.sqyf},#{item.yjs},#{item.jsyf},#{item.ykp},
#{item.kpyf},#{item.ysh},#{item.shyf},#{item.fkyf},#{item.wfkyf} )
</foreach>
</insert>