項目從Oracle數據遷移到GBase數據庫時解決適配遇到的問題


@

一,oracle中nvl()函數

NVL(表達式1,表達式2)
如果表達式1為空值,NVL返回值為表達式2的值,否則返回表達式1的值。該函數的目的是把一個空值(null)轉換成一個實際的值。其表達式的值可以是數字型、字符型和日期型。但是表達式1和表達式2的數據類型必須為同一個類型。

二,oracle數據庫中sql語句中with as 的用法

相當於建了個e臨時表

with e as (select * from scott.emp e where e.empno=7499)
select * from e;

三,Oracle中的group by問題

在這里插入圖片描述
這條查詢語句最后的group by在oracle數據庫中可以那樣寫,但是在gbase中不可以,因為上面已經把happen_time這個時間起了別名了,oracle數據庫中,group by后面不能跟別名,gbase只能寫別名,gbase只認識上面已經起了別名的名字。

適配gbase正確語句:

select to_char(happen_time,'yyyy-MM-dd') as happen_date,count(1) as cn from dy_work_reminder a 
      where a.dm_entry_person = '1'
      and to_char(a.happen_time,'yyyy-MM')='2019-06'
      and a.yxbz='Y' group by happen_date

四,trunc()的用法

在oracle中,trunc()的用法

1.select trunc(sysdate) from dual --2011-3-18 今天的日期為2011-3-18
2.select trunc(sysdate, 'mm')  from  dual --2011-3-1  返回當月第一天.
3.select trunc(sysdate,'yy') from dual --2011-1-1    返回當年第一天
4.select trunc(sysdate,'dd') from dual --2011-3-18  返回當前年月日
5.select trunc(sysdate,'yyyy') from dual --2011-1-1  返回當年第一天
6.select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回當前星期的第一天
7.select trunc(sysdate, 'hh') from dual  --2011-3-18 14:00:00  當前時間為14:41  
8.select trunc(sysdate, 'mi') from dual --2011-3-18 14:41:00  TRUNC()函數沒有秒的精確

Oracle獲取當前月份的第一天的sql語句

select trunc(sysdate, 'mm') from dual;

Gbase獲取當前月份的第一天的sql語句

select trunc(current,'month') from sysmaster:sysdual;

注意:oracle中的dual是虛擬表,而gbase中的sysmaster:sysdual表同樣是gbase的虛表。

五,批量插入

oracle批量插入
接口

int insterZqyjList(List<YzsylgkZqyj> zqyjList);

xml

<insert id="insterZqyjList" parameterType="List">
  insert into YZSYLGK_ZQYJ (YJ_ID, ID, YJ_NR,
  TCR_NAME, TCRDW, CREATEDATE,
  MODIFYDATE, USER_ID, ORG_ID
  ) select a.* from(
  <foreach collection="list" item="item" index="index" separator="union" open="(" close=")">
    select #{item.yjId,jdbcType=VARCHAR}, #{item.id,jdbcType=VARCHAR}, #{item.yjNr,jdbcType=VARCHAR},
    #{item.tcrName,jdbcType=VARCHAR}, #{item.tcrdw,jdbcType=VARCHAR}, #{item.createdate,jdbcType=TIMESTAMP},
    #{item.modifydate,jdbcType=TIMESTAMP}, #{item.userId,jdbcType=VARCHAR}, #{item.orgId,jdbcType=VARCHAR} from dual
  </foreach>
  )a
</insert>

適配GBase寫法

<insert id="insterZqyjList" parameterType="List" databaseId="gbase">
  insert into YZSYLGK_ZQYJ (YJ_ID, ID, YJ_NR,
  TCR_NAME, TCRDW, CREATEDATE,
  MODIFYDATE, USER_ID, ORG_ID
  ) select a.* from(
  <foreach collection="list" item="item" index="index" separator="union">
    select '${item.yjId}' as YJ_ID, '${item.id}' as ID, '${item.yjNr}' as YJ_NR,
    '${item.tcrName}'as TCR_NAME, '${item.tcrdw}' as TCRDW,
    <choose>
      <when  test="item.createdate ='' or item.createdate=null">
        get_datetime('${item.createdate}') as CREATEDATE
      </when>
      <otherwise>
        '' as CREATEDATE,
      </otherwise>
    </choose>

    <choose>
      <when  test="item.modifydate ='' or item.modifydate=null">
        get_datetime('${item.modifydate}') as MODIFYDATE,
      </when>
      <otherwise>
        '' as MODIFYDATE,
      </otherwise>
    </choose>
    '${item.userId}' as USER_ID, '${item.orgId}' as ORG_ID  from dual
  </foreach>
  )a
</insert>

Choose / when / otherwise是為了保證入參不為空,如果為空則前后插入的數量不匹配報錯,如果為空則返回空字符串。

(知識點)Oracle批量更新

xml寫法如下

<update id="updateBatch"  parameterType="java.util.List">
    <foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
        update T_CITY_INDEX t
        set
        t.city_name= #{item.cityName,jdbcType=VARCHAR} ,
        t.district_name= #{item.districtName,jdbcType=VARCHAR} ,
        where t.id = #{item.id,jdbcType=NUMERIC}
    </foreach>
</update>

六,Oracle數據庫和GBase數據庫的差異

Oracle數據庫和GBase數據庫的差異如下:

6.1 <=

Oracle:#{starttime}<=t.audit
Gbase:#{starttime}year to function(5)<=t.audit

6.2、groupby

Oracle:group by to_char(sysdate,’yyyy-MM’)
Gbase:group by 后面不能直接跟to_char(sysdate,’yyyy-MM’),需要先給
to_char起一個別名例如a,然后group b ya

6.3、with別名as

Oracle:在oracle數據庫中可以使用with別名as的用法,相當於建了一張臨時
表,例如
with tmp as(select * from test)
Selecta.test1,b.test2 from try a,tmp b where a.id=b.id
GBase:在GBase中不可以使用with別名as的用法,只能這樣寫
Selecta.test1,b.test2 from try a,(select * from test) b where a.id=b.id

6.4、to_char()

Oracle:select to_char(a.id) id from...
GBase:select ‘a.id’ id from...

6.5、批量插入

Oracle:在foreach標簽中接收yjId參數時是這樣接收的

{item.yjId,jdbcType=VARCHAR}

GBase:在foreach標簽中接受yjId參數時是這樣接收的
'${item.yjId}' as YJ_ID
注意:這里有一對單引號

6.6、sysdate和current

Oracle:查詢當前時間使用sysdate Select sysdate from dual;
GBase:查詢當前時間使用current Select current from sysmaster:sysdual;
(sysmaster:sysdual是GBase的虛表)

6.7、多表連接

Oracle:可以使用(+)來連接各個表
GBase:不支持(+)用法,可以使用左連接leftjoin..on..來作連接查詢。

6.8、當前時間now()和current

Oracle:小於當前時間的寫法:<=now()
GBase:小於當前時間的寫法:<=current

6.9、trunc()函數

Oracle:trunc(sysdate)獲取當前的日期
GBase:trunc(current year to fraction(5))

七,多表連接

oracle的寫法

select a.title,a.begintime,null as END_DATE ,a.compere,a.org_id,a.typeid,a.id,a.xindeandbiji,a.meeting_type,c.org_name,le.STATE,
    le.xdbgid,bj.STATE bjzt,bj.xdbgid bjid,d.ztdrlx,d.themetype,
    b.user_id,a.recuserid,a.hyjy_state,null as bmzt,null as fczs_id
    from meeting_main a,meeting_user b,g_organ c,meeting_ztdr d,LEARNING_NOTES le,LEARNING_NOTES bj
    where a.org_id=c.org_id
    and a.id = b.mainid
    and a.id = d.id
    and a.id = le.PROJECTID(+)
    and a.id = bj.PROJECTID(+)
    and le.type(+) = '0'
    and bj.type(+) = '1'
    and b.user_id = #{userId,jdbcType=VARCHAR}

gbase的(+)不適配,需要統統都改成left join 表名 on 條件

gbase的寫法

select a.title,a.begintime,null as END_DATE ,a.compere,a.org_id,a.typeid,a.id,a.xindeandbiji,a.meeting_type,c.org_name,le.STATE,
    le.xdbgid,bj.STATE bjzt,bj.xdbgid bjid,d.ztdrlx,d.themetype,
    b.user_id,a.recuserid,a.hyjy_state,null as bmzt,null as fczs_id
    from
    meeting_main a left join meeting_user b on
    a.id = b.mainid left join g_organ c on
    a.org_id = c.org_id left join meeting_ztdr d on
    a.id = d.id left join LEARNING_NOTES le on
    a.id = le.PROJECTID left join LEARNING_NOTES bj on
    a.id = bj.PROJECTID
    where
    b.user_id = '1'

八,XMLAGG函數

oracle的寫法

select substr(aorgid,0,length(aorgid)-1) aorgid,substr(aorg_name,0,length(aorg_name)-1) aorg_name from (
  	  select XMLAGG(XMLELEMENT(E,orgid || ',')).EXTRACT('//text()').getclobval() aorgid,
  	         XMLAGG(XMLELEMENT(E,org.org_name || ',')).EXTRACT('//text()').getclobval() aorg_name 
  	         from exam_exam_org b,g_organ org where b.orgid=org.org_id
  	   and b.exid=#{exid,jdbcType=VARCHAR}
  	) a   

gbase的寫法

select substr(aorgid,0,length(aorgid)-1) aorgid,substr(aorg_name,0,length(aorg_name)-1) aorg_name from (
      select WM_concat(orgid) aorgid,
             WM_concat(org.org_name) aorg_name
             from exam_exam_org b,g_organ org where b.orgid=org.org_id
       and b.exid=#{exid,jdbcType=VARCHAR}
    ) a

九,to_char()用法

oracle的寫法

SELECT
            to_char(a.id) id,
            a.SCOREPROJECT,
            b.USERID,
            to_char(b.score) score,
            to_char(a.SCORESUM) scoresum
        FROM
            score_ruler a,
            ( SELECT USERID, SCOREPROJECTID, sum( score ) score FROM SCORE_LOG WHERE USERID = #{userid,jdbcType=VARCHAR} GROUP BY USERID, SCOREPROJECTID ) b
        WHERE
            a.ID = b.SCOREPROJECTID ( + )

gbase的寫法

SELECT
            'a.id' id,
            a.SCOREPROJECT,
            b.USERID,
            'b.score' score,
            'a.SCORESUM' scoresum
        FROM
            score_ruler a,
            ( SELECT USERID, SCOREPROJECTID, sum( score ) score FROM SCORE_LOG WHERE USERID = #{userid,jdbcType=VARCHAR} GROUP BY USERID, SCOREPROJECTID ) b
        WHERE
            a.ID = b.SCOREPROJECTID ( + )

十,查看當前月份trunc( )函數

oracle的寫法

select trunc(sysdate,'mm') from dual;

gbase的寫法

select trunc(current year to fraction(5),'month') from dual;

十一,group by

oracle寫法

<select id="selectPartyAge" parameterType="java.lang.String"
            resultType="cn.com.qianlong.light.vo.dy.DyTjCxVo">
        SELECT BB.name,nvl(AA.value,'0')value
        FROM
        (SELECT
        CASE
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') &lt;= '19490930' THEN '1949之前'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19491001'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19660430' THEN '1949~1966'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19660501'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19761031' THEN '1966~1976'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19761101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19781231' THEN '1976~1978'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19790101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '20021031' THEN '1979~2002'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20021101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '20121031' THEN '2002~2012'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20121101' THEN '2012之后'
        END as name , COUNT(z.ybdybeginDate) AS value
        FROM (
        SELECT a.user_id, a.ybdybeginDate, a.partyorganId FROM DY_INFO a,G_ORGAN b
        where
        a.PARTYORGANID like  CONCAT('%',CONCAT(#{partyorganid,jdbcType=VARCHAR},'%'))
        and a.status  IN (1,4)
        AND a.userType IN (4, 5)
        AND
        a.PARTYORGANID=b.ORG_ID
        and
        b.VALIDFLAG = 1
        ) z
        GROUP BY CASE
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') &lt;= '19490930' THEN '1949之前'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19491001'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19660430' THEN '1949~1966'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19660501'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19761031' THEN '1966~1976'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19761101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19781231' THEN '1976~1978'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19790101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '20021031' THEN '1979~2002'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20021101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '20121031' THEN '2002~2012'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20121101' THEN '2012之后'
        END
        )AA RIGHT JOIN (
        select '1949之前' as name, '1' as xh from dual
        union
        select '1949~1966' as name, '2' as xh from dual
        union
        select '1966~1976' as name, '3' as xh from dual
        union
        select '1976~1978' as name, '4' as xh from dual
        union
        select '1979~2002' as name, '5' as xh from dual
        union
        select '2002~2012' as name, '6' as xh from dual
        union
        select '2012之后' as name, '7' as xh from dual
        )BB on AA.name=BB.name
        ORDER BY BB.xh
    </select>

gbase寫法

<select id="selectPartyAge" parameterType="java.lang.String"
            resultType="cn.com.qianlong.light.vo.dy.DyTjCxVo">
        SELECT BB.name,nvl(AA.value,'0')value
        FROM
        (SELECT
        CASE
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') &lt;= '19490930' THEN '1949之前'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19491001'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19660430' THEN '1949~1966'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19660501'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19761031' THEN '1966~1976'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19761101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '19781231' THEN '1976~1978'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19790101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '20021031' THEN '1979~2002'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20021101'
        AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD')  &lt;= '20121031' THEN '2002~2012'
        WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20121101' THEN '2012之后'
        END as dd , COUNT(z.ybdybeginDate) AS value
        FROM (
        SELECT a.user_id, a.ybdybeginDate, a.partyorganId FROM DY_INFO a,G_ORGAN b
        where
        a.PARTYORGANID like  CONCAT('%',CONCAT(#{partyorganid,jdbcType=VARCHAR},'%'))
        and a.status  IN (1,4)
        AND a.userType IN (4, 5)
        AND
        a.PARTYORGANID=b.ORG_ID
        and
        b.VALIDFLAG = 1
        ) z
        GROUP BY dd
        )AA RIGHT JOIN (
        select '1949之前' as name, '1' as xh from dual
        union
        select '1949~1966' as name, '2' as xh from dual
        union
        select '1966~1976' as name, '3' as xh from dual
        union
        select '1976~1978' as name, '4' as xh from dual
        union
        select '1979~2002' as name, '5' as xh from dual
        union
        select '2002~2012' as name, '6' as xh from dual
        union
        select '2012之后' as name, '7' as xh from dual
        )BB on AA.name=BB.name
        ORDER BY BB.xh
    </select>

十二,查看當前星期的星期一的日期

oracle寫法

select trunc(sysdate,'iw') from dual;

gbase寫法

select trunc(current,'day')+1 from dual;

參考gbase官方文檔
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM