Oracle сгущается по dblink с другой кодировкой - PullRequest
1 голос
/ 03 августа 2010

Вот сценарий:

Oracle A: кодировка WE8ISO8859P1

Oracle B: кодировка WE8MSWIN1252

Oracle A <- dblink -> Oracle B

Я не могу получить доступ к Oracle B напрямую, проблемы с брандмауэром: (

Мне нужно получить некоторые двоичные файлы из OracleB, и эти файлы находятся в столбце типа CLOB (не спрашивайте меня, почему, и я не могу перейти на BLOB).

Я использую "select insert", чтобы получить файлы из B в A, и они преобразуют их в двоичный файл, используя найденную функцию clob_to_blob здесь .

Я получаю несколько поврежденных файлов, и я полагаю, что это потому, что Oracle автоматически конвертирует WE8MSWIN1252 в WE8ISO8859P1 по dblink (ну, столбец CLOB, так что это текст, верно?).

Я никак не могу изменить кодировки баз данных.

Есть ли обходной путь для этого?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 04 августа 2010

Вы пытались использовать 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
0 голосов
/ 06 августа 2010

Совершенно другая альтернатива. Создайте базу данных C с тем же набором символов, что и B. Перетащите данные из B в C (без какого-либо преобразования), затем вы можете выполнить манипуляции в C, прежде чем перемещать данные в A.

0 голосов
/ 03 августа 2010

Мое лучшее предложение - не использовать ссылку на БД, а вместо этого:

  1. Получите клиентскую программу, автономную или собственную, для извлечения CLOB из Oracle B и записи данных в виде «текстового» файла, который содержит правильные двоичные данные.
  2. Импортируйте этот файл в Oracle A как двоичный файл в BLOB.
...