Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2

ТЕМА: Oracle. Передача массива данных в процедуру

Oracle. Передача массива данных в процедуру 12 июль 2011 05:04 #1590

  • Sanyok
  • Sanyok аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 37
  • Спасибо получено: 0
С помощью ADO.NET передаю в PL/SQL процедуру параметром значение. Загвоздка в том что этих значений больше ста и следовательно процедуру приходиться вызывать такое же количество раз. Как можно решить эту проблему -возможно ли передать массив данных, для вызова процедуры 1 раз?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Передача массива данных в процедуру 12 июль 2011 05:41 #1591

  • Chlo
  • Chlo аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 43
  • Спасибо получено: 0
В Oracle есть коллекции, поэтому передать такую коллекцию как параметр процедуры вполне можно. Другое дело, как этот параметр используется внутри процедуры. И дружит ли с коллекциями ADO

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Передача массива данных в процедуру 12 июль 2011 05:44 #1592

  • Lex
  • Lex аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 1
Можно передавать параметры в строке, а потом уже переводить в коллекцию, например так
SQL>create or replace type number_array is table of number;
  2  /

Type created.

SQL>create or replace function str2tbl(p_str in varchar2, p_delim in varchar2 DEFAULT ',')
  2  return number_array
  3  as
  4    l_str  long default p_str || p_delim;
  5    l_n    number;
  6    l_data number_array := number_array();
  7  begin
  8    loop
  9      l_n := instr(l_str, p_delim);
 10      exit when(nvl(l_n, 0) = 0);
 11      l_data.extend;
 12      l_data(l_data.count) := ltrim(rtrim(substr(l_str, 1, l_n - 1)));
 13      l_str := substr(l_str, l_n + 1);
 14    end loop;
 15    return l_data;
 16  end;
 17  /

Function created.

SQL>var p_param varchar2(30 char);
SQL>exec :p_param:='1,2,3,4,5';

PL/SQL procedure successfully completed.

SQL>select * from table(str2tbl(:p_param,','));

COLUMN_VALUE
------------
           1
           2
           3
           4
           5

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Передача массива данных в процедуру 12 июль 2011 05:48 #1593

  • Sanyok
  • Sanyok аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 37
  • Спасибо получено: 0
Хм...
Chlo, в процедуре -- в цикле for <элемент> in <массив> loop
ВОт так

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Передача массива данных в процедуру 12 июль 2011 05:48 #1594

  • Chlo
  • Chlo аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 43
  • Спасибо получено: 0
Если передать табличный тип в ADO не удастся, можно передать в CLOB/BLOB XML и использовать в запросе через XMLTable/XMLSEQUENCE.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. Передача массива данных в процедуру 12 июль 2011 05:49 #1595

  • Lex
  • Lex аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 1
Попробуй
Sample Output
In sqlplus cut and paste the following command:
select * from testtable;

This is the sample output that you should see after running this code:

SQL> select * from testtable;

COL1
COL2(ATTR1, ATTR2)
1
MYTABLE(MYOBJECT(12, 'Jill'))

2
MYTABLE(MYOBJECT(3, 'THREE'), MYOBJECT(4, 'FOUR'))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2