转发文献:https://www.cnblogs.com/xj-mrcat/p/17689334.html
问题1
创建表失败:表[xxxxx] 中不能同时包含聚集KEY和大字段
【处理方法】
SQL> sp_set_para_value(1,'PK_WITH_CLUSTER',0);
描述:默认值:0,动态,会话级 ,定义:在建表语句或增加约束语句中指定主关键字时,是否缺省指定为 CLUSTER,0:不指定;1:指定; 注:该参数对水平分区表、列存储表和堆表无效
注意:将迁移工具退回输入DM用户名密码的页面再继续下一步,或者关闭当前迁移窗口重新打开迁移任务(PK_WITH_CLUSTER是会话级参数,直接重试会因为本会话的参数未生效而依然报错)
问题2
第 XX 行, 第 X 列 [GET]附近出现错误: 语法分析出错
【处理方法】
注释获取异常信息的SQL代码,调用输出错误日志存储过程时,异常信息的参数直接使用SQLCODE与SQLERRM(DM8内置)
原语句:
EXCEPTION
WHEN SQLEXCEPTION THEN
BEGIN
GET DIAGNOSTICS CONDITION 1 V_RETURN_CODE = RETURNED_SQLSTATE , V_ERROR_MSG = MESSAGE_TEXT;
CALL ETL.EDW_PROC_ERROR_LOG(V_ACCT_ID,V_START_TIME,NOW(),V_PROC_NAME,V_STEP_ID, V_RETURN_CODE, V_ERROR_MSG);
SET P_RESULT = 1;
END;
END;
修改后:
EXCEPTION
WHEN SQLEXCEPTION THEN
BEGIN
CALL ETL.EDW_PROC_ERROR_LOG(V_ACCT_ID,V_START_TIME,NOW(),V_PROC_NAME,V_STEP_ID, SQLCODE, SQLERRM);
SET P_RESULT = 1;
END;
END;
问题3
第 xx 行, 第 xx 列 [UNSIGNED]附近出现错误: 语法分析出错
【处理方法】
mysql的INT UNSIGNED的范围类型是0~4294967295,如果应用里面整数范围不超过2147483647就可以用int,如果超过2147483647就用bigint
此处原类型是TINYINT,范围0~255,因此使用int
原语句:
CREATE PROCEDURE "adm"."p_wb_xxx_xxx"( sDataDate IN CHAR(8) , iResult OUT TINYINT UNSIGNED ) AS
……
修改后:
CREATE PROCEDURE "adm"."p_wb_xxx_xxx"( sDataDate IN CHAR(8) , iResult OUT INT ) AS
……
问题4
第 xx 行, 第 xx 列[ENTRY_DATE]附近出现错误: 语法分析出错
第 xx 行, 第 xx 列[12]附近出现错误: 语法分析出错
【处理方法】
原语句:
SELECT DATE('2023-03-01') + INTERVAL ENTRY_DATE DAY;
SELECT SUBSTR(REPLACE(DATE_SUB(V_DATES,INTERVAL 2 MONTH),'-',''),1, 6);
修改后
SELECT TO_DATE('2023-03-01') + NUMTODSINTERVAL(ENTRY_DATE,'DAY');
SELECT SUBSTR(REPLACE(DATE_SUB(V_DATES,NUMTOYMINTERVAL(2,MONTH)),'-',''),1, 6);
问题5
第 xx 行, 第 xx 列 [:=]附近出现错误: 语法分析出错
【处理方法】
达梦为查询结果集生成临时序列可以使用rownum
原语句
SELECT a.*,( i:= i+1) num FROM
修改后
SELECT a.*,rownum num FROM
问题6
order by 大字段 报错
DM默认不支持CLOB、BLOB大字段进行比较(mysql Text类型字段会默认转成CLOB),该参数表示是否支持大字段类型的比较。0:不支持;1:支持。设置为1后支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。
【处理方法】
sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);
说明:默认值:0,动态,会话级 ,定义:是否支持大字段类型的比较。0:不支持;1:支持,此时 DISTINCT、ORDER BY、 分析函数和集函数支持对大字段进行处理,且当大字段跟字符串比较时,让大字段转换成字符串类型;2:支持,此时 DISTINCT、ORDER BY、 分析函数和集函数支持对大字段进行处理,且兼容 MYSQL 模式下,大字段跟字符串比较时,让字符串转换成大字段类型
问题7
group by报错
【处理方法】
sp_set_para_value(1,'GROUP_OPT_FLAG',53);
说明:默认值52,动态,会话级,定义:分组项优化参数开关。
0:不优化;
1:非 MYSQL 兼容模式下(即 COMPATIBLE_MODE 不等于 4),支持查询项不是 GROUP BY 表达式;
2:外层分组项下放到内层派生表中提前分组优化;
4:表示对于多级分区,并行下允许尝试不生成多个 AGR;
8:进行哈希分组时,依赖分组项列中的核心项分组列来分组;
16:位图索引覆盖简单分组查询中的所有列时,允许使用位图索引对查询进行优化;
32:进行哈希分组时,对 TOP 查询进行优化,提前返回指定数量的分组。
支持使用上述有效值的组合值,如 3 表示同时进行 1 和 2 的优化
问题8
MySQL group_concat函数报错:无法解析的成员访问表达式[GROUP_CONCAT]
【处理方法】
使用WM_CONCAT替代,如果子句中包含group by ,order by等,可以使用LISTAGG/LISTAGG2 字符串集函数
mysql中用法: GROUP_CONCAT(qua.user_answer SEPARATOR '!,');
达梦中用法: replace(WM_CONCAT(qua.user_answer ),',', '!,')
可以试试listagg() WITHIN GROUP ()函数
select listagg( user_name,'.') within group (order by create_time) from AA.tb_clue
【扩展】
把 GROUP_CONCAT(NAME SEPARATOR '/') 替换为 LISTAGG(NAME, SEPARATOR '/')后,
应用启动报错:### Error querying database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException:failed to process, Error SQL :select LISTAGG(NAME, SEPARATOR '/') ......
解决办法:使用WM_CONCAT 替换为 select REPLACE(TO_CHAR(WM_CONCAT(NAME)), ',', '/')
问题9
row_count()函数报错:无法解析的成员访问表达式[ROWCOUNT]
【处理方法】
把 ROWCOUNT() / ROW_COUNT() 替换为 SQL%rowcount
问题10
报错:无法解析的成员访问表达式DATEDIFF(CREATE_TIME, NOW())
【处理方法】
替换为 DAYS_BETWEEN(NOW(), CREATE_TIME) --天数差值
问题11
报错原因:select * from "SYSDBA"."TABLE_1" where COLUMN_1 like CONCAT('%','\%1','%') ; 中想查询出字段值包含:%1 的内容,查询出的结果不匹配要求。
【处理方法】
进行如下SQL语句的改写,不能通过修改兼容性参数:COMPATIBLE_MODE 和 BACKSLASH_ESCAPE 来实现无SQL变更的语法支持。
select * from "SYSDBA"."TABLE_1" where COLUMN_1 like '%%1';
select * from "SYSDBA"."TABLE_1" where COLUMN_1 like CONCAT('%','1%','%');
select * from "SYSDBA"."TABLE_1" where COLUMN_1 like CONCAT('%','\%1','%') ESCAPE '\';