Как читать данные CSV из столбца Clob в Oracle, используя PL / SQL - PullRequest
0 голосов
/ 21 октября 2011

Я получаю clob как параметр из процедуры, и он содержит файл CSV.Мне нужно прочитать эти данные и загрузить их в другую таблицу Oracle.

Может кто-нибудь объяснить, как это сделать.

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

AFAIK У Oracle нет готовых вкусностей для этого. Одним из многообещающих кандидатов является DBMS_UTILITY.COMMA_TO_TABLE , но сильно ограничено для особой задачи, что делает его невозможным Таким образом, вы должны закатать рукава и сделать свой собственный.

Ваша спецификация немного расплывчата, но одним из вариантов является функция SPLIT:

create table so18t (
  id number,
  csv clob
);

insert all
into so18t values(1,'1,2,3'||chr(10)||
                    '40,5,6'||chr(10)||
                    '700,80,9'||chr(10))
into so18t values(2,'aaa,bbb,ccc'||chr(10)||
                    'ddd,eee,fff'||chr(10)||
                    'ggg,hhh,iii'||chr(10))
select 1 from dual;

declare
  v_lines jh_util.stringlist_t;
  v_values jh_util.stringlist_t;
begin
  for rec in (select * from so18t order by id) loop
    v_lines := jh_util.split(rec.csv, chr(10));
    for i in v_lines.first .. v_lines.last loop
      dbms_output.put_line('line ' || i || ':');
      v_values := jh_util.split(v_lines(i));
      /* Do what you want with the values - I just print them */
      for j in v_values.first .. v_values.last loop
        dbms_output.put_line('v_values(' || j || ') = ' || v_values(j));
      end loop;
    end loop;
  end loop;
end;
/
show errors

Печать:

line 1:
v_values(1) = 1
v_values(2) = 2
v_values(3) = 3
line 2:
v_values(1) = 40
v_values(2) = 5
v_values(3) = 6
line 3:
v_values(1) = 700
v_values(2) = 80
v_values(3) = 9
line 1:
v_values(1) = aaa
v_values(2) = bbb
v_values(3) = ccc
line 2:
v_values(1) = ddd
v_values(2) = eee
v_values(3) = fff
line 3:
v_values(1) = ggg
v_values(2) = hhh
v_values(3) = iii

PL/SQL procedure successfully completed.

Конечно, Oracle не обеспечивает разделение, но ТАК помогает . В приведенном выше примере я использовал свой собственный.

Другие интересные ресурсы:

2 голосов
/ 21 октября 2011

Не экспортируйте данные в файл.

Вам нужно будет преобразовать сгусток во что-то полезное, проанализировать его и записать в другую таблицу.Вот шаги, которые вам нужно сделать:

  1. Конвертировать Clob из Clob в нечто полезное.CLOB.getCharacterStream () кажется полезным.
  2. Анализирует данные CSV из преобразованного объекта Clob.CSVReader reader = new CSVReader(the_reader_from_getCharacterStream); ftw
  3. Сохраните нужные данные в другой таблице.

Объект Oracle CLOB предоставляет несколько полезных методов.CSVReader от Открыть CSV .

0 голосов
/ 21 октября 2011

Я не знаю, как можно немедленно проанализировать сгусток как CSV, но Oracle предоставляет ряд инструментов для работы с файлами CSV , такими как Внешние таблицы и SQL * Loader .

Таким образом, подход может быть следующим:

  1. Экспорт сгустка в виде файла с использованием DBMS_LOB и UTL_FILE
  2. Загрузите файл с помощью одного из перечисленных выше инструментов CSV.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...