Как заполнить массив в хранимой процедуре оракула? - PullRequest
0 голосов
/ 21 октября 2010

Как использовать массив (Varray) в процедуре хранения. На самом деле, я сделал хранимую процедуру, из которой я получаю список элементов.

Например:

create or replace procedure GetTargetFields ( fileformat  in varchar2,
                                              filefields out Varray(4) )
IS

BEGIN

 SELECT id 
   INTO filefields  
   FROM tablename;

END;

Ответы [ 3 ]

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

использование BULK COLLECT INTO:

SQL> CREATE OR REPLACE TYPE vrray_4 AS VARRAY(4) OF VARCHAR2(10);
  2  /

Type created
SQL> CREATE OR REPLACE PROCEDURE GetTargetFields(fileformat IN VARCHAR2,
  2                                              filefields OUT vrray_4) IS
  3  BEGIN
  4     SELECT dummy BULK COLLECT INTO filefields FROM dual;
  5  END;
  6  /

Procedure created
SQL> DECLARE
  2     x vrray_4;
  3  BEGIN
  4     GetTargetFields(NULL, x);
  5  END;
  6  /

PL/SQL procedure successfully completed

Также убедитесь, что ваш запрос не возвращает более 4 строк (для VARRAY(4)), иначе вы столкнетесь с ORA-22165

2 голосов
/ 22 октября 2010

Niraj. Вам следует использовать принципы, предоставленные Винсентом, но я предлагаю вам использовать вложенный тип таблицы вместо varray, если вам не нужен точно тип varray в вашей логике. Это избавит вас от ошибки ORA-22165, если запрос вернет более 4 строк - вложенная таблица будет автоматически расширена до необходимого размера. Вы определяете тип вложенной таблицы следующим образом:

declare
  type TStrTab is table of varchar2(10);
  fStrTab TStrTab := TStrTab();
begin
  select ... bulk collect into fStrTab from...
end;

Дополнительную информацию о типах коллекций PL / SQL можно найти в официальном руководстве пользователя Oracle PL-SQL и справочнике Глава 5 .

1 голос
/ 21 октября 2010

Две вещи:

Вам необходимо объявить именованный тип - вы не можете использовать VARRAY непосредственно в объявлении параметра. (Если это не изменилось в 11g.)

Вам нужно использовать BULK COLLECT, чтобы использовать один запрос для заполнения коллекции.

Пример:

CREATE TYPE fieldlist AS VARRAY(4) OF NUMBER;
CREATE PROCEDURE GetTargetFields( filefields OUT fieldlist )
  AS
  BEGIN
    SELECT id BULK COLLECT INTO filefields FROM tablename;
  END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...