gbase oracle mysql_项目从Oracle数据迁移到GBase数据库时解决适配遇到的问题

本文详细介绍了在将Oracle数据库中的数据迁移至GBase过程中,遇到的函数和SQL语句适配问题,包括NVL、WITH AS、GROUP BY、TRUNC以及批量插入等,并提供了相应的解决方案。同时,对比了Oracle和GBase在时间处理、别名使用、多表连接等方面的差异,有助于理解两者间的兼容性和调整策略。
摘要由CSDN通过智能技术生成

@

一,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问题

38f6bf0fb624027e473a560c3654d124.png

这条查询语句最后的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 zqyjList);

xml

insert into YZSYLGK_ZQYJ (YJ_ID, ID, YJ_NR,

TCR_NAME, TCRDW, CREATEDATE,

MODIFYDATE, USER_ID, ORG_ID

) select a.* from(

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

)a

适配GBase写法

insert into YZSYLGK_ZQYJ (YJ_ID, ID, YJ_NR,

TCR_NAME, TCRDW, CREATEDATE,

MODIFYDATE, USER_ID, ORG_ID

) select a.* from(

select '${item.yjId}' as YJ_ID, '${item.id}' as ID, '${item.yjNr}' as YJ_NR,

'${item.tcrName}'as TCR_NAME, '${item.tcrdw}' as TCRDW,

get_datetime('${item.createdate}') as CREATEDATE

'' as CREATEDATE,

get_datetime('${item.modifydate}') as MODIFYDATE,

'' as MODIFYDATE,

'${item.userId}' as USER_ID, '${item.orgId}' as ORG_ID from dual

)a

Choose / when / otherwise是为了保证入参不为空,如果为空则前后插入的数量不匹配报错,如果为空则返回空字符串。

(知识点)Oracle批量更新

xml写法如下

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}

六,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写法

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') <= '19490930' THEN '1949之前'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19491001'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19660430' THEN '1949~1966'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19660501'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19761031' THEN '1966~1976'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19761101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19781231' THEN '1976~1978'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19790101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '20021031' THEN '1979~2002'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20021101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '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') <= '19490930' THEN '1949之前'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19491001'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19660430' THEN '1949~1966'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19660501'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19761031' THEN '1966~1976'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19761101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19781231' THEN '1976~1978'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19790101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '20021031' THEN '1979~2002'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20021101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '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

gbase写法

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') <= '19490930' THEN '1949之前'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19491001'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19660430' THEN '1949~1966'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19660501'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19761031' THEN '1966~1976'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19761101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '19781231' THEN '1976~1978'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '19790101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '20021031' THEN '1979~2002'

WHEN TO_CHAR(z.ybdybeginDate,'YYYYMMDD') >= '20021101'

AND TO_CHAR(z.ybdybeginDate,'YYYYMMDD') <= '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

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

oracle写法

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

gbase写法

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

参考gbase官方文档

a02365cca17c937777255f74f70d3685.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值