异构迁移:MYSQL至DM8存储过程报错处理

转发文献: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 '\';

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值