Анализ CSV (значения, разделенные запятыми) в Oracle

StackOverflow https://stackoverflow.com/questions/852828

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Я ничего не знаю об 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, поскольку таблица тестовых данных объединена с вашим массивом!

Другие советы

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

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

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

http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96652/ch03.htm#1656

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top