--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)