MYSQL迁移到DM常见问题和解决办法

--1.DM不支持mysql的转换字段字符集函数convert(xxx using utf8mb3),删掉即可。

--------------------------------------------------------------------------------------------------

--2.mysql的group_concat函数换成dm的LISTAGG。

--示例如下:

--例1--dm----------group_concat换成LISTAGG------------------

DROP VIEW IF EXISTS "report_org_relation";

CREATE VIEW "report_org_relation" AS

select

        "org_relation"."ID_"                                   AS "ID_"      ,

        --MYSQL原来是这么写的:

        --group_concat("org_relation"."GROUP_ID_" separator ',') AS "GROUP_IDS",

        --改成这样(group (orader by xxx)不能没有,如果原来MYSQL的语句中没有order by,改为DM后随便指定一列即可):

        listagg("org_relation"."GROUP_ID_" , ',') within group(order by "org_relation"."USER_ID_" ) AS "GROUP_IDS",

        "org_relation"."USER_ID_"                              AS "USER_ID_"

from

        "org_relation"

where

        (

                "org_relation"."USER_ID_" is not null

        )

group by

        "org_relation"."USER_ID_";

--例2

----MySQL

--select group_concat(ifnull(OPEN_STEP, '10') order by ID ASC separator '、、') from ZHZB_DEV.BID_PACKAGE BP;

--DM

select LISTAGG(ifnull("BP"."OPEN_STEP", '10'),'、、') WITHIN GROUP(ORDER BY "BP"."ID" ASC) from ZHZB_DEV.BID_PACKAGE BP;

----------------------------------------------------------------------------------------------------

--3.mysql中group by表达式的规则和DM不太一样,开启部分兼容mysql模式即可。

--DM group by的规则

--(1).在 GROUP BY 子句中的每一列必须明确地命名属于在 FROM 子句中命名的表的一列,分组列的数据类型不能是多媒体数据类型;

--(2).分组列不能为集函数表达式或者在 SELECT 子句中定义的别名;

--(3).当分组列值包含空值时,则空值作为一个独立组;

--(4).当分组列包含多个列名时,则按照 GROUP BY 子句中列出现的顺序进行分组;

--(5). GROUP BY 子句中至多可包含 255 个分组列;

--(6). ROLLUP\CUBE\GROUPING SETS 组合不能超过 9 个。

--(7)GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面。

--(8)如果 ORDER BY 后面使用集函数,则必须使用 GROUP BY 分组,且 GROUP BY分组中必须包含查询列中所有列。

----------------------------------------------------------------------------------------------------

--4.mysql的 a div b 换成dm的 trunc(a/b)。

--5.mysql的sum函数里带条件,如sum(a>=100),改成sum(if (a>=100,1,0))。

--6.mysql的 a in( b,c) is false改成  a not in (b,c)。

--7.mysql 支持 a join b 不带 on 的写法,非mysql不行,去掉 join 即可。

------------------------------------------------------------------------------------------------------

--8.mysql的find_in_set在DM中不支持,在DM手动自定义相同功能的find_in_set函数即可。

--DM自定义函数如下

CREATE OR REPLACE FUNCTION INVEST.FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')

RETURN NUMBER IS

l_idx number:=0; -- 用于计算 piv_str2 中分隔符的位置

str varchar2(500); -- 根据分隔符截取的子字符串

piv_str varchar2(500) := piv_str2; -- 将 piv_str2 赋值给 piv_str

res number:=0; -- 返回结果

BEGIN

-- 如果 piv_str 中没有分割符,直接判断 piv_str1 和 piv_str 是否相等,相等 res=1

IF instr(piv_str, p_sep, 1) = 0 THEN

IF piv_str = piv_str1 THEN

res:= 1;

END IF;

ELSE

-- 循环按分隔符截取 piv_str

LOOP

l_idx := instr(piv_str,p_sep);

-- 当 piv_str 中还有分隔符时

IF l_idx > 0 THEN

-- 截取第一个分隔符前的字段 str

str:= substr(piv_str,1,l_idx-1);

-- 判断 str 和 piv_str1 是否相等,相等 res=1 并结束循环判断

IF str = piv_str1 THEN

res:= 1;

EXIT;

END IF;

piv_str := substr(piv_str,l_idx+length(p_sep));

ELSE

-- 当截取后的 piv_str 中不存在分割符时,判断 piv_str 和 piv_str1 是否相等,相等 res=1

IF piv_str = piv_str1 THEN

res:= 1;

END IF;

-- 无论最后是否相等,都跳出循环

EXIT;

END IF;

END LOOP;

-- 结束循环

END IF;

-- 返回 res

RETURN res;

END FIND_IN_SET;

-------------------------------------------------------------------------------------------

--9.mysql的cast(xx as signed),在DM中没有signed类型,先改为number

-------------------------------------------------------------------------------------------

--10.mysql的format(num,1)在DM中不支持,改为了round(num,1)

--如果业务不涉及format以下情况的使用,那么可以考虑直接用round替换format。

--mysql

--结果为1235

select format(1234.987,-3);

--结果为1234.000

select format(1234,3);

----------------------------------

--dm

--结果为1000

select round(1234.987,-3);

--结果为1234

select round(1234,3);

--------------------------------------------------------------

--11.视图VIEW_PROGRESS_REPORT_Y提示列YEAR不存在,先生成子查询再进行group by 后成功

----------------MYSQL 报错:无效的列名YEAR--------

        VIEW "INVEST"."VIEW_PROGRESS_REPORT_Y"

        (

                "PROJECT_CODE"                  ,

                "YEAR_TOTAL_INVEST_ACCOMPLISHED",

                "YEAR"

        ) AS

select

        "T"."PROJECT_CODE"                                                                                   AS "PROJECT_CODE"                  ,

        0                                                                                                    AS "YEAR_TOTAL_INVEST_ACCOMPLISHED",

        (case "T"."TYPE" when '428847201212956673' then year("T"."CREATE_TIME") else year("T"."MONTH2") end) AS "YEAR"

from

        "VIEW_PROJECT_PROGRESS_REPORT_LATEST" "T"

group by

        "T"."PROJECT_CODE",

        "YEAR";

       

------------DM---------------------------------------      

CREATE

        VIEW "INVEST"."VIEW_PROGRESS_REPORT_Y"

        (

                "PROJECT_CODE"                  ,

                "YEAR_TOTAL_INVEST_ACCOMPLISHED",

                "YEAR"

        ) AS

select

        "T1"."PROJECT_CODE"                  ,

        "T1"."YEAR_TOTAL_INVEST_ACCOMPLISHED",

        "T1"."YEAR"

FROM

        (

                SELECT

                        "T"."PROJECT_CODE"                                                                                   AS "PROJECT_CODE"                  ,

                        0                                                                                                    AS "YEAR_TOTAL_INVEST_ACCOMPLISHED",

                        (case "T"."TYPE" when '428847201212956673' then year("T"."CREATE_TIME") else year("T"."MONTH2") end) AS "YEAR"

                from

                        "VIEW_PROJECT_PROGRESS_REPORT_LATEST" "T"

        )

        "T1"

group by

        "T1"."PROJECT_CODE",

        "T1"."YEAR";    

--------------------------------------------------------------------------------

12.如何将datetime自定义批量转换成timestamp

mysql (8.0.26)到DM,datetime默认转换成timestamp(0)  ,如果需要使用自定义类型映射,比如转换成timestamp(6),那么设置类型映射的时候,下图红框部分不能填写,否则即使设置并保存了,也是无效的。精度随便选,标度写成6就行。

迁移的时候不要使用默认数据类型映射关系

设置完成之后,点击转换检查一下是否生效(  默认的是  精度6标度0  sql里面是timestamp(0)   ),点击编辑sql看一下ddl  ,就能看到确实转换成了timestamp(6)

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值