我正在尝试将数组传递给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调用时,我无法编译,因为它不喜欢数组
有什么想法吗?
答案 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。