目的: 我想从TABLE_X
位于所述DBLINK1
数据加载到位于所述DBLINK2
TABLE_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]
。
当我使用如下所示的稍微不同的方法时,CONVERT
和TRANSLATE
操作成功完成。
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
命令一起使用时CONVERT
和TRANSLATE
功能将无法正常工作?
附加信息:
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
)。
DRIVING_SITE提示是关键。我用最终的解决方案更新了这个问题。谢谢。 –