2016-10-27 39 views
1

目的: 我想从TABLE_X位于所述DBLINK1数据加载到位于所述DBLINK2TABLE_Y甲骨文与字符集转换合并通过多个DBLinks

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

简化MERGE命令将如下所示:

MERGE INTO [email protected] TABLE_ACTUAL 
USING(SELECT ID, 
      TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME 
     FROM [email protected]) 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); 

此命令运行没有问题,但在NAME列中的值不转换,或转换当我看进[email protected]

当我使用如下所示的稍微不同的方法时,CONVERTTRANSLATE操作成功完成。

DECLARE 
    CURSOR CUR_TABLE IS 
    SELECT ID, 
      TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME 
     FROM [email protected]; 

BEGIN 
    FOR REG_TABLE IN CUR_TABLE LOOP 
    BEGIN 
     INSERT INTO [email protected](ID, NAME) 
     VALUES(REG_TABLE.ID, REG_TABLE.NAME); 

     EXCEPTION 
     WHEN DUP_VAL_ON_INDEX THEN 
      UPDATE [email protected] 
      SET NAME = REG_TABLE.NAME 
      WHERE ID = REG_TABLE.ID; 
    END; 
    END LOOP; 
END; 

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

问:是否有任何合理的解释,为什么与MERGE命令一起使用时CONVERTTRANSLATE功能将无法正常工作?

附加信息:

CURRENT DB: Oracle 10 
DBLINK2 (destination): Oracle 12 
DBLINK1 (origin): Unknown version 

更新: 作为@Kacper建议,我尝试使用DRIVING_SITE提示强制甲骨文在本地数据库中计算表达式。

最终的工作液:

MERGE INTO [email protected] TABLE_ACTUAL 
USING(SELECT /*+DRIVING_SITE(DUAL)*/ 
      ID, 
      TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME 
     FROM [email protected], 
      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); 

古怪的是,它只有充分,我把一个虚拟的工作后,在源SELECT的条款(ID > 0)。

回答

1

我所了解的差异在于方法2中,您将数据从DBLINK1拉到本地数据库,在本地数据库上执行转换,然后将转换后的数据插入DBLINK2。方法1将在DBLINK1DBLINK2上进行翻译,您可以尝试通过DRIVING_SITE提示进行控制。

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

在最坏的情况下,如果这不是帮助create table t1 as SELECT ID, TRANSLATE(CONVERT(NAME, 'WE8PC850', 'WE8ISO8859P1'), 'Ã', 'A') NAME FROM [email protected]并使用新表进行合并。

+0

DRIVING_SITE提示是关键。我用最终的解决方案更新了这个问题。谢谢。 –