Разбор CSV (значения, разделенные запятыми) в Oracle - PullRequest
1 голос
/ 12 мая 2009

Я бы хотел передать набор идентификаторов записей в процедуру Oracle, используя строку через запятую. Я хочу поместить это во временную таблицу, а затем объединить это в дальнейшей обработке. Как бы я пошел по этому поводу?

Лучше было бы услышать о лучших подходах, чем о CSV. Я использую ODP.Net для доступа к данным.

Ответы [ 3 ]

2 голосов
/ 12 мая 2009

Я ничего не знаю об ODP.net, но зачем объединять все идентификаторы записей в строку CSV?

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

Вот пример использования типа массива и присоединения его к вашему запросу без использования временной таблицы (вы могли бы сделать нечто подобное со списком IN, но его сложнее связать):

create or replace type my_test_type as object (id integer);

create or replace type my_test_type_a as table of my_test_type;

create or replace procedure my_test_proc(i_ids in my_test_type_a)
is
begin

 for row in (
   select a.l from
   (
     select level l from dual connect by level <= 10
   ) a, table(i_ids) b
   where a.l = b.id 
 ) loop
   dbms_output.put_line(row.l);
 end loop;
end;
/

Обратите внимание, что в запросе в процедуре теста используется функция 'table', чтобы превратить переданный массив в таблицу в запросе, к которому вы можете фактически присоединить другие реальные таблицы.

Также не то, чтобы подзапрос 'a' использовал хитрость для создания поддельной тестовой таблицы, содержащей 10 строк со значениями от 1 до 10 (это просто тестовые данные, чтобы доказать, что это работает).

Используя следующий блок, мы можем проверить работоспособность кода:

declare
  v_id my_test_type;
  v_ids my_test_type_a;
begin
  v_id := my_test_type(1);
  v_ids := my_test_type_a();
  for i in 1.. 5 loop
    v_id := my_test_type(i);
    v_ids.extend;
    v_ids(i) := v_id; 
  end loop;
  my_test_proc(v_ids);
end;
/ 

Пока включен dbms_output, это должно вывести 1 - 5, так как таблица тестовых данных объединена с вашим массивом!

0 голосов
/ 13 мая 2009

SQL LOADER отлично подходит для этой задачи

http://download -east.oracle.com / Docs / кд / B10501_01 / server.920 / a96652 / ch03.htm # 1656

Вы можете указать несколько форматов для дат, и существует множество полезных опций для импорта данных в Oracle из CSV.

0 голосов
/ 12 мая 2009

Как насчет использования IN? Как в select ... where id IN (...list-of-ids-here...)?

Кроме этого, я бы предложил вставить значения в временную таблицу вручную перед вызовом процедуры или написать специальную процедуру, которая выполняет вставку для вас, чтобы вы могли вызвать исходную процедуру на втором этапе. Таким образом, вы будете намного более гибкими, чем когда вы складываете все в один метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...