DB2_V9.7迁移Gbase8aV9532820
1.上传脚本
proc_transfromation_db2for8a.py 为通用转换,db2_merge.py为MERGE语句特殊脚本处理
使用方法:
1)执行 python proc_transfromation_db2for8a.py INPUT_PATH OUT_PATH
注意:INPUT_PATH 为DB2原始存储过程目录,OUT_PATH为自动转移后的输出目录。

2)执行 python db2_merge.py INPUT_PATH OUT_PATH
由于db2的merge语法与gbase有所差异,且merge语句过多,于是输出以下python脚本,用于转换merge语法
MERGE [INTO] [vc_name.][database_name.]table_name USING table_reference
ON conditional_exp
[WHEN MATCHED THEN UPDATE SET col_name1=expr1 [,
col_name2=expr2] ...
[WHEN NOT MATCHED THEN INSERT [(col_name3,...)] VALUES (expr3,...)]
有以下需要注意:
1).UPDATE部分不支持DELETE子句。
2).UPDATE部分和INSERT部分不支持WHERE子句。
3).UPDATE部分和INSERT部分可以省略,但不可以同时省略,否则报语法错误。
4).UPDATE部分和INSERT部分位置不可以颠倒。
5).INSERT的VALUES部分不允许使用MERGE表。
6).UPDATE或INSERT中的列如果出现多次,不会报错,后指定的列生效,但建议不要依赖于该行为,避免这样使用。
7).不允许一对多更新:如果MERGE表中的一行与USING表中的多行符合连接条件,则报错。
8).MERGE INTO a语句中,a表必须是哈希分布表。
9).USING table_xb ON (a.hash_col=b.hash_col)这部分中包含JOIN条件语句,JOIN条件中必须存在a表哈希分布列的等值关联条件,且该关联条件下,哈希分布列必须是物理列的关联,不能是表达式、函数。
例如:
a.hash_col=b.hash_col(合法)
ABS(a.hash_col)=b.hash_col(不合法)
a.hash_col=ABS(b.hash_col)(不合法),这个不合法是因为当前集群哈希重分布的限制,JOIN时均是以物理列进行哈希重分布。
10).WHEN MATCHED THEN UPDATESETa.column=b.column,…语句中,set列(a.column)不能是hash分布列。
11).WHEN NOT MATCHED THEN INSERT (a.column, …) VALUES(b.column,…)语句中,INSERT的字段列表中,a.column必须出现哈希分布列,且VALUES中对应的列中,b.column必须是哈希分布列,或者是经过动态哈希重分布后的哈希分布列。
12).如果a表和b表之间JOIN关系不是静态哈希分布JOIN关系,则gcluster_hash_redistribute_join_optimize参数不能被关闭。
13).参与MERGE操作的表,如果有表的主分片处于locked状态,则无法使用哈希重分布,因此当上例中的a与b不是静态哈希JOIN关系时,会导致MERGE无法执行。
注意:INPUT_PATH 为第一步转译后存储过程目录,OUT_PATH为特殊merge语句的输出目录。
执行db2_merge.py 后需把INPUT_PATH转译后存储与MERGE部分重复删除,保留MERGE部分

3)执行python db2_replace_diagnostics.py INPUT_PATH 处理存储过程SQL异常捕获改造部分
db2原始的SQL异常捕获与gbase8a语法有差异需改造

--原始异常捕获代码
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET V_PROC_SQLCODE = SQLCODE;
ROLLBACK;
INSERT INTO DWMM.PROC_ERR_LOG
VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,CURRENT TIMESTAMP,V_PROC_SQLCODE);
COMMIT;
RESIGNAL;
END;
DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
SET V_PROC_SQLCODE = SQLCODE;
INSERT INTO DWMM.PROC_ERR_LOG
VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,CURRENT TIMESTAMP,V_PROC_SQLCODE);
COMMIT;
END;
--调整后
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 获取详细的错误信息
GET DIAGNOSTICS CONDITION 1 @SSTATE=RETURNED_SQLSTATE,@MESSAGE=MESSAGE_TEXT;
SET V_PROC_SQLCODE = @SSTATE;
SET V_PROC_MESSAGE = SUBSTR(@MESSAGE,1,500);
INSERT INTO DWMM.PROC_ERR_LOG VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,NOW(),V_PROC_SQLCODE,V_PROC_MESSAGE);
END;
DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
GET DIAGNOSTICS CONDITION 1 @SSTATE=RETURNED_SQLSTATE,@MESSAGE=MESSAGE_TEXT ,@ERR=GBASE_ERRNO;
INSERT INTO DWMM.PROC_ERR_LOG VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,NOW(),@ERR,@MESSAGE);
END;
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526