下面是一个场景:
甲骨文A:字符集WE8ISO8859P1
甲骨文B:字符集WE8MSWIN1252
Oracle A <- dblink -> Oracle B
I不能直接访问Oracle,防火墙问题:( )
我必须从OracleB获得一些二进制文件,这些文件位于CLOB类型的列中(不要问我为什么,我不能更改为BLOB)。
我使用"select insert“将文件从B转换为A,并使用clob_to_blob函数查找这里将它们转换为二进制文件。
我得到了一些损坏的文件,我相信这是因为甲骨文通过dblink自动将WE8MSWIN1252转换为WE8ISO8859P1 (好吧,列是CLOB,所以它是文本,对吗?)
我不能以任何方式改变数据库字符集。
有什么解决办法吗?
提前感谢
发布于 2010-08-03 23:05:29
你试过使用DBMS_LOB.CONVERTTOBLOB@remote(.)吗?
但是,您可能希望获得远程CLOB的某种校验和,以查看它们在从任何原始外部源插入/更新字符集时是否得到字符转换。也就是说,如果完成插入时的客户端字符集与数据库字符集不同,则在进行选择之前可能已经发生了问题。
编辑以添加。
我能找到的最接近的对象需要链接的另一端的一些对象。首先,一个在远程端执行转换的函数。第二,表示数据的“BLOB”视图的视图。这使用一个虚拟表(基于v$sql,因为它是我能找到的第一个CLOB )。我没有理由看到您不能简单地将CLOB作为参数传递给函数。
create or replace function ret_blob return blob is
cursor c_1 is
select sql_fulltext, sql_id, length(sql_fulltext)
from v_sql
where sql_id = 'bzmb01whp36wt';
rec_c1 c_1%rowtype;
--
v_blob blob;
v_dest number := 1;
v_src number := 1;
v_lang number := 0;
v_warn number;
--
begin
open c_1;
fetch c_1 into rec_c1;
close c_1;
dbms_lob.createtemporary(v_blob, TRUE);
--
dbms_lob.CONVERTTOBLOB (v_blob, rec_c1.sql_fulltext, DBMS_LOB.LOBMAXSIZE,
v_dest, v_src, DBMS_LOB.DEFAULT_CSID, v_lang, v_warn);
--
dbms_output.put_line(':'||v_warn||'>'||length(v_blob));
--
return v_blob;
end;
/
create view rblob as select ret_blob from dual;然后,从本地数据库中,执行
create table t as select ret_blob from rblob@remote发布于 2010-08-03 18:44:06
我最好的建议是不要使用DB链接,而是这样做:
发布于 2010-08-05 23:01:56
完全不同的选择。创建具有与B相同的字符集的数据库C(不需要任何转换),然后在将数据移动到A之前,可以使用C进行操作。
https://stackoverflow.com/questions/3399566
复制相似问题