Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Передача массива данных в процедуру параметром  [new]
romichshos
Member

Откуда:
Сообщений: 220
С помощью ADO.NET передаю в PL/SQL процедуру параметром значение. Загвоздка в том что этих значений больше сотни и следовательно процедуру приходиться вызывать такое же количество раз. Как можно решить эту проблему -возможно ли передать массив данных, для вызова проедуры один раз? БД-Oracle.
12 июл 11, 09:51    [10959823]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
tru55
Member

Откуда: СПб
Сообщений: 19731
В Oracle есть коллекции, поэтому передать такую коллекцию как параметр процедуры вполне можно. Другое дело, как этот параметр используется внутри процедуры. И дружит ли с коллекциями ADO
12 июл 11, 10:08    [10959933]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
paveloder
Member

Откуда:
Сообщений: 59
romichshos,
Можно передавать параметры в строке, а потом уже переводить в коллекцию, например так

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
12 июл 11, 10:32    [10960111]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
romichshos
Member

Откуда:
Сообщений: 220
tru55,
В процедуре --в цикле for <элемент> in <массив> loop
12 июл 11, 10:41    [10960188]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4113
romichshos,

Если передать табличный тип в ADO не удастся, можно передать в CLOB/BLOB XML и использовать в запросе через XMLTable/XMLSEQUENCE.
12 июл 11, 10:46    [10960217]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7863

On 12.07.2011 10:51, romichshos wrote:

> С помощью ADO.NET передаю в PL/SQL процедуру параметром значение. Загвоздка в том что этих значений больше сотни и
> следовательно процедуру приходиться вызывать такое же количество раз. Как можно решить эту проблему -возможно ли
> передать массив данных, для вызова проедуры один раз? БД-Oracle.

Что-то подобное?

http://forums.oracle.com/forums/thread.jspa?messageID=479744

Posted via ActualForum NNTP Server 1.4

12 июл 11, 11:11    [10960362]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
romichshos
Member

Откуда:
Сообщений: 220
paveloder,

Огромное спасибо! Все работает.
12 июл 11, 11:41    [10960535]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
rifle
Member

Откуда: Kiev
Сообщений: 123
Вот тут недавно проскакивало красиво решение на regexp
select
  regexp_substr('1,2,3,4,5','[^,]',level)
from dual
connect by regexp_substr('1,2,3,4,5','[^,]',1,level) is not null
12 июл 11, 13:24    [10961224]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Передача массива данных в процедуру параметром  [new]
stix1992
Member

Откуда:
Сообщений: 1
rifle
Вот тут недавно проскакивало красиво решение на regexp
select
  regexp_substr('1,2,3,4,5','[^,]',level)
from dual
connect by regexp_substr('1,2,3,4,5','[^,]',1,level) is not null


чтобы корректно работало с подстроками длиннее 1 символа:
select
  regexp_substr('1024,2,3,4,5','[^,]+',level)
from dual
connect by regexp_substr('1024,2,3,4,5','[^,]+',1,level) is not null
19 авг 16, 07:38    [19561297]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Передача массива данных в процедуру параметром  [new]
tosick4
Member

Откуда:
Сообщений: 92
Уважаемые ораклойды, подскажите реализацию такого механизма. Из клиентского приложения необходим в процедуру на сервер Oracle передать множество ID-ек которые будут использоваться в запросе Select ...WHERE... AND ID in (<ID>) что бы получить курсор который передается обратно в клиентское приложение для вывода отчета. Именно множество, а не по одной. Проблема в передаче массива этих ID-к. Пробовал строкой через разделитель а потом преобразовывал в коллекцию, но SELECT ругается Invalid Number или пусто.

Сообщение было отредактировано: 31 окт 19, 15:13
31 окт 19, 15:03    [22007249]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
-2-
Member

Откуда:
Сообщений: 14998
tosick4
Проблема в передачи массива
Не проблема, но решение.
31 окт 19, 15:08    [22007258]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
tosick4
Member

Откуда:
Сообщений: 92
-2-,

Каким образом?
31 окт 19, 16:35    [22007355]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
tosick4
Member

Откуда:
Сообщений: 92
tosick4,

Oracle 10g, с клиента отправляю через компонент OraStoredProc.ExecProc . Подскажите пожалуйста
1 ноя 19, 09:01    [22007724]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
tosick4
Member

Откуда:
Сообщений: 92
Попробую переформулировать. На клиенте в компоненте cxGrid мышкой выбираю строки которые должны попасть в отчет. Циклом перебираю выделенные строки и получаю список ID-ек которые надо передать в процедуру Oracle возвращающую курсор который отправлю клиенту для вывода отчета. Вопрос: как передать с клиента в Oracle список Id-ек? В oracle входной параметр (NT_NAME) объявил как Nested Table коллекцию
TYPE NT_TYPE_NUM IS TABLE OF INTEGER;
NT_NAME NT_TYPE_NUM := NT_TYPE_NUM();

и буду использовать в проце как:
... AND id MEMBER OF NT_NAME
15 ноя 19, 13:53    [22017157]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива данных в процедуру параметром  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1360
Для поиска:

oracle nested table example
oracle collection example

Коллекция nested table - что-то уже масло масляное. Это если параметр - не массив, а матрица.
В строке можно передавать, как выше написали.

Сообщение было отредактировано: 15 ноя 19, 14:08
15 ноя 19, 14:06    [22017189]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить