目的:
我想将位于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);
列中的值不会被转换或转换。
当我使用稍微不同的方法时,NAME
和TABLE_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;
命令一起使用时,CONVERT
和TRANSLATE
函数为什么不起作用?是否有任何合理的解释?< / 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
上之后,它才完全奏效。
答案 0 :(得分:1)
我理解的不同之处在于,方法2是将数据从DBLINK1
提取到本地数据库,在本地数据库上进行转换,然后将转换后的数据插入DBLINK2
。方法1将在DBLINK1
或DBLINK2
上进行翻译,您可以尝试通过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
并使用新表进行合并。