Как передать массив в хранимую процедуру SQL

Я пытаюсь передать массивы в хранимую процедуру DB2, и у меня возникают проблемы.

Вот несколько фрагментов кода:

create type intArrayType as integer array[];

CREATE OR REPLACE PROCEDURE
array_trial (IN integer_array INTARRAYTYPE)

BEGIN
  SELECT UNNEST(integer_array) FROM sysibm.sysdummy1;
END 

Он компилируется, но когда я пытаюсь вызвать:

CALL array_trial(ARRAY[1,2,3]);

Я получаю ошибку -104.

Когда я пытаюсь вызвать из RPGLE, я не могу скомпилировать, потому что ему не нравится массив

Любые идеи?


person jgriffin    schedule 25.08.2015    source источник


Ответы (1)


UNNEST используется в предложении from, поскольку создает временную таблицу...

CREATE OR REPLACE PROCEDURE
array_trial (IN integer_array INTARRAYTYPE)

BEGIN
  declare c1 cursor with return to client for 
     SELECT * FROM UNNEST(integer_array) as rs;
  open c1;
END;

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

CALL array_trial(ARRAY[1,2,3]);

Он возвращает следующее сообщение:

SQL State: 428H2
Vendor Code: -20441
Message: [SQ20441] Array type not valid where specified. 
Cause . . . . . :   An array type was used but is not allowed in the 
specified context.  Array types can only be used: -- As an argument of an 
SQL or JAVA procedure. -- For an SQL variable declared in an SQL procedure.
-- In a CAST specification in an SQL procedure. 
Recovery  . . . :   Remove the reference to the array type. Try the request again.

Вы можете создать хранимую процедуру драйвера:

create or replace procedure mysp
begin
  declare myarray intArrayType;
  set myarray = ARRAY[1,2,3];
  call array_trial(myarray);
end;

И назовите это

call mysp;

Из того, что мне удалось найти до сих пор, SP с параметром массива может быть вызван непосредственно из другой процедуры SQL или Java... но не из RPGLE.

person Charles    schedule 26.08.2015