Как читать файлы в существующие строки LOB-столбцов в Oracle?

Мне нужно перенести данные из одной базы данных в другую. В качестве подготовки мы уже извлекли данные CLOB и BLOB в отдельные файлы, расположенные на сервере Oracle. База данных содержит несколько столбцов CLOB и BLOB в разных таблицах, которые были инициализированы значениями NULL для всех этих строк.

Как мне загрузить содержимое файла в столбец CLOB или BLOB существующей строки. Я знаю точный набор ключей первичного идентификатора и имен файлов ... но я не нашел рабочего способа прочитать эти файлы в таблицах.

SQL Loader, например, кажется, может только добавлять строки или заменять всю таблицу. Но я хочу обновить только отдельные столбцы. При необходимости мы можем использовать загрузчик SQL или простые сценарии PL / SQL - все, что работает.

Спасибо за вашу помощь.


person Daniel Bleisteiner    schedule 30.08.2010    source источник
comment
Обе базы данных Oracle? Если да, можете ли вы использовать ссылку на базу данных или экспортировать / импортировать таблицу вместо файлов?   -  person Jon Heller    schedule 31.08.2010
comment
Нет, мы говорим о разных системах, которые нельзя связать. Они оба являются Oracle, но совсем не связаны общей сетью.   -  person Daniel Bleisteiner    schedule 31.08.2010


Ответы (1)


Что-то вроде следующих строк должно сработать. Вы хотели бы параметризовать его и сделать отдельную версию для данных BLOB. Не уверен, есть ли у вас проблемы с набором символов.

declare
    l_bfile   bfile := bfilename('DATA_PUMP_DIR','cpy.log');
    l_data    clob;
    l_soffset NUMBER := 1;
    l_doffset NUMBER := 1;
    l_lang    NUMBER := 0;
    l_warn    NUMBER;
begin
    DBMS_LOB.createtemporary (lob_loc => l_data,cache => TRUE, 
                                 dur => DBMS_LOB.call);
    dbms_lob.fileopen( l_bfile, DBMS_LOB.file_readonly );
    DBMS_LOB.loadclobfromfile(l_data, l_bfile, DBMS_LOB.LOBMAXSIZE, 
           l_soffset, l_doffset, 0, l_lang, l_warn  );
    dbms_lob.fileclose(l_bfile);
    update f_lob set value = l_data where id = 1;
end;
/
person Gary Myers    schedule 30.08.2010
comment
Это выглядит многообещающе ... Я попробую сегодня. - person Daniel Bleisteiner; 31.08.2010
comment
Спасибо, это помогло! Хотя мне не удалось использовать его в цикле с динамически считываемыми именами файлов и другими параметрами ... но я просто объединил более 1000 этих блоков и на данный момент преуспел в заполнении больших объектов. - person Daniel Bleisteiner; 31.08.2010