具有不同字符集的数据库链接上的Oracle clob

具有不同字符集的数据库链接上的Oracle clob,oracle,blob,character-encoding,clob,dblink,Oracle,Blob,Character Encoding,Clob,Dblink,以下是场景: Oracle A:charset WE8ISO8859P1 甲骨文B:charset WE8MSWIN1252 甲骨文甲骨文甲骨文甲骨文乙 我无法直接访问Oracle B,防火墙问题:( 我必须从OracleB获取一些二进制文件,这些文件位于CLOB类型的列中(不要问我为什么,我不能更改为BLOB) 我使用“selectinsert”将文件从B转换为a,并使用clob_to_blob函数将其转换为二进制文件 我得到了一些损坏的文件,我相信这是因为Oracle正在通过dblink自动

以下是场景:

Oracle A:charset WE8ISO8859P1

甲骨文B:charset WE8MSWIN1252

甲骨文甲骨文甲骨文甲骨文乙

我无法直接访问Oracle B,防火墙问题:(

我必须从OracleB获取一些二进制文件,这些文件位于CLOB类型的列中(不要问我为什么,我不能更改为BLOB)

我使用“selectinsert”将文件从B转换为a,并使用clob_to_blob函数将其转换为二进制文件

我得到了一些损坏的文件,我相信这是因为Oracle正在通过dblink自动将WE8MSWIN1252转换为WE8ISO8859P1(嗯,该列是CLOB,所以它是文本,对吗?)

我无法以任何方式更改数据库字符集

有什么解决办法吗


提前感谢

我最好的建议是不要使用DB链接,而是这样做:

  • 获取一个独立的或您自己的客户机程序,从OracleB中提取CLOB,并将数据写入包含正确二进制数据的“文本”文件
  • 将该文件作为二进制文件导入到BLOB中

  • 我的最佳建议是不要使用DB链接,而是这样做:

  • 获取一个独立的或您自己的客户机程序,从OracleB中提取CLOB,并将数据写入包含正确二进制数据的“文本”文件
  • 将该文件作为二进制文件导入到BLOB中

  • 您是否尝试过使用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
    

    您是否尝试过使用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
    

    完全不同的选择。
    创建与B具有相同字符集的数据库C。将数据从B拉到C(不进行任何转换),然后可以在将数据移动到A之前在C中进行操作。

    完全不同的替代方法。
    创建与B具有相同字符集的数据库C。将数据从B拉到C(不进行任何转换),然后您可以在将数据移动到A之前在C中进行操作。

    嗨,丹,谢谢回答。我无法直接访问B,防火墙问题:(嗨,丹,谢谢回答。我无法直接访问B,防火墙问题:(嗨,Gary,不,如果我使用客户端的函数(即使使用@dblinkname),我仍然会得到一个ORA-22992:(我认为通过dblinks处理LOB的唯一方法是插入/选择。远程系统上的文件很好:(我讨厌你必须为别人过去的错误决定付费(二进制文件作为CLOB…)。最后,我设法在远程端创建了一个视图。该视图将clob转换为仍在远程端的blob,然后我可以随时从本地数据库中使用insert/select。它对视图的想法起了作用!Tks。嗨,Gary,不,如果我使用客户端的函数(即使使用@dblinkname),我仍然会得到ORA-22992:(我认为使用数据库链接上的LOB可以做的唯一一件事是插入/选择。远程系统上的文件很好:(我讨厌过去你不得不为别人的错误决定付费(二进制文件作为CLOB…)。最后,我设法在远程端创建了一个视图。该视图将clob转换为仍在远程端的blob,然后我可以随时从本地数据库使用insert/select。它对视图的想法起到了作用!Tks。