如何将Array传递给SQL存储过程

时间:2015-08-25 16:15:26

标签: sql arrays db2-400 rpgle

我正在尝试将数组传递给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调用时,我无法编译,因为它不喜欢数组

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

UNNEST用于from子句,因为它创建了temporary table ...

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构造函数目前相当有限。 documentation明确指出只能在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;

到目前为止,我能够找到一个带有数组parm的SP可以直接从另一个SQL过程或Java调用......但不是RPGLE。