Oracle通过多个DBLink与charset转换合并

时间:2016-10-27 12:34:14

标签: oracle merge character-encoding dblink

目的: 我想将位于TABLE_X的{​​{1}}的数据加载到位于DBLINK1的{​​{1}}中。

我还需要处理不同的字符集,所以我使用oracle TABLE_Y函数和DBLINK2函数来替换重音字符。

简化的CONVERT命令如下所示:

TRANSLATE

此命令运行时没有任何问题,但是当我查看MERGE时,MERGE INTO TABLE_Y@DBLINK2 TABLE_ACTUAL USING(SELECT ID, TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME FROM TABLE_X@DBLINK1) TABLE_NEW ON (TABLE_ACTUAL.ID = TABLE_NEW.ID) WHEN MATCHED THEN UPDATE SET NAME = TABLE_NEW.NAME WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES(TABLE_NEW.ID, TABLE_NEW.NAME); 列中的值不会被转换或转换。

当我使用稍微不同的方法时,NAMETABLE_Y@DBLINK2操作已成功完成。

CONVERT

第二种方法的问题是,与merge命令相比,执行时间更长。

问题:当TRANSLATE命令与DECLARE CURSOR CUR_TABLE IS SELECT ID, TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME FROM TABLE_X@DBLINK1; BEGIN FOR REG_TABLE IN CUR_TABLE LOOP BEGIN INSERT INTO TABLE_Y@DBLINK2(ID, NAME) VALUES(REG_TABLE.ID, REG_TABLE.NAME); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN UPDATE TABLE_Y@DBLINK2 SET NAME = REG_TABLE.NAME WHERE ID = REG_TABLE.ID; END; END LOOP; END; 命令一起使用时,CONVERTTRANSLATE函数为什么不起作用?是否有任何合理的解释?< / p>

其他信息:

MERGE

更新 正如@Kacper建议的那样,我尝试使用CURRENT DB: Oracle 10 DBLINK2 (destination): Oracle 12 DBLINK1 (origin): Unknown version 提示强制oracle评估本地数据库中的表达式。

最终的工作解决方案:

DRIVING_SITE

奇怪的是,在我将一个虚拟where子句(MERGE INTO TABLE_Y@DBLINK2 TABLE_ACTUAL USING(SELECT /*+DRIVING_SITE(DUAL)*/ ID, TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME FROM TABLE_X@DBLINK1, DUAL WHERE ID > 0) TABLE_NEW ON (TABLE_ACTUAL.ID = TABLE_NEW.ID) WHEN MATCHED THEN UPDATE SET NAME = TABLE_NEW.NAME WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES(TABLE_NEW.ID, TABLE_NEW.NAME); )放在源ID > 0上之后,它才完全奏效。

1 个答案:

答案 0 :(得分:1)

我理解的不同之处在于,方法2是将数据从DBLINK1提取到本地数据库,在本地数据库上进行转换,然后将转换后的数据插入DBLINK2。方法1将在DBLINK1DBLINK2上进行翻译,您可以尝试通过DRIVING_SITE提示进行控制。

我不确定它是否有帮助,但我会尝试create view db1_v as SELECT ID, TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME FROM TABLE_X@DBLINK1然后使用视图合并。

在最坏的情况下,如果没有帮助create table t1 as SELECT ID, TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME FROM TABLE_X@DBLINK1并使用新表进行合并。