2010-08-03 5 views
1

Вот сценарий:Oracle CLOB над DBLink с разной кодировкой

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

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

Oracle < - DBLink -> Oracle B

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

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

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

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

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

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

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

ответ

1

Вы пробовали использовать [email protected] (....)

Но вы, вероятно, хотите, чтобы получить какую-то контрольную сумму удаленного CLOB, чтобы увидеть, являются ли они получить преобразование CharacterSet когда они вставляются/обновляются из любого исходного внешнего источника. То есть, если набор символов клиента, когда вставка выполнена, отличается от набора символов базы данных, проблема может возникнуть прежде, чем вы сделаете свой выбор.


Отредактировано для добавления.

Ближайший я могу найти с некоторыми объектами на другом конце ссылки. Во-первых, функция, которая выполняет преобразование на удаленном конце. Во-вторых, представление, представляющее представление «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 [email protected] 
+0

Привет, Гэри, Нет, если я использую функцию от моего клиента (даже с @dblinkname), я все равно получаю ORA-22992 :( Я думаю, что единственное, что вы может делать с LOBS над dblinks - это вставка/выбор. Файлы удалены в удаленной системе :( Ненавижу, когда вам приходится платить за чужое плохое решение в прошлом (двоичные файлы как клобы ...). – andrecarlucci

+0

Наконец, мне удалось получить представление, созданное с удаленной стороны. Это представление преобразует clob в blob по-прежнему на удаленной стороне, а затем я могу использовать insert/select из локальной базы данных в любое время, когда захочу. Это сработало! Tks для идеи представления. – andrecarlucci

0

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

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

Привет, Dan, спасибо за ответ. Я не могу получить доступ к B напрямую, проблемы с брандмауэром :( – andrecarlucci

0

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

Смежные вопросы