我正在尝试创建一个以数组作为参数的存储过程,并在WHILE循环中遍历此数组并将字符添加到表中。
例如,如果我有一个['a','b','c'数组',我想把它传递给我的存储过程,字符'a','b'和'c'是放在桌子上。
我的SP创建成功,但是当我尝试调用我的程序时遇到问题。任何人都能指出我如何传入数组?我的程序如下....
DROP PROCEDURE DB.LWRH_DYNAMIC_SP@
create type stringArray as VARCHAR(100) array[100]@
CREATE PROCEDURE DB.LWRH_SP
(
IN list stringArray
)
LANGUAGE SQL
BEGIN
DECLARE i, MAX INTEGER;
DECLARE c CHAR(1);
SET i = 0;
SET MAX = CARDINALITY(list);
WHILE i <= MAX DO
SET c = list[i];
INSERT INTO schema.test ("SERVICE TYPE")values (c);
END WHILE;
END@
CALL DB.LWRH_SP('')@
答案 0 :(得分:1)
使用DB2 array constructor调用具有数组类型输入参数的存储过程。
使用数组构造函数创建整数数组的示例:
ARRAY[1, 2, 3]
对于存储过程示例:
create type stringArray as VARCHAR(100) array[100]@
CREATE PROCEDURE DB.LWRH_SP
(
IN list stringArray
)
LANGUAGE SQL
BEGIN
DECLARE i, MAX INTEGER;
DECLARE c CHAR(1);
SET i = 0;
SET MAX = CARDINALITY(list);
WHILE i <= MAX DO
SET c = list[i];
INSERT INTO schema.test ("SERVICE TYPE")values (c);
END WHILE;
END@
您可以使用以下命令使用VARCHAR数组调用上述存储过程:
CALL DB.LWRH_SP(ARRAY['a', 'b', 'c'])@
注意:根据我的经验,一些SQL开发人员工具(例如DBArtisan)可能无法使用数组构造函数的上述存储的prodecure调用语法,但它肯定适用于Linux命令行db2工具又名。 DB2 UDB CLP
答案 1 :(得分:0)
您需要先定义数据类型,然后创建一个传递参数的变量。
>>-CREATE--+------------+--PROCEDURE--procedure-name------------>
'-OR REPLACE-'
>--+--------------------------------------------------------------------------------+-->
'-(--+----------------------------------------------------------------------+--)-'
| .-,----------------------------------------------------------------. |
| V .-IN----. | |
'---+-------+--parameter-name--| data-type |--+--------------------+-+-'
+-OUT---+ '-| default-clause |-'
'-INOUT-'
>--| option-list |--| SQL-procedure-body |---------------------><
data-type
|--+-| built-in-type |---------------+--------------------------|
+-| anchored-variable-data-type |-+
+-array-type-name-----------------+
+-cursor-type-name----------------+
+-distinct-type-name--------------+
'-row-type-name-------------------'
在这里,您可以看到一个接收数组作为参数的函数示例。请注意,数组类型是在函数之前定义的。存储过程也是必要的。
--#SET TERMINATOR @
create or replace type my_array_type as varchar(64) array[int]@
create or replace function card (in my_array my_array_type)
returns int
begin
declare card int;
set card = cardinality(my_array);
return card;
end@
create or replace procedure test ()
begin
declare size int;
declare my my_array_type;
set my [1] = 'uno';
set my [2] = 'dos';
set my [3] = 'tres';
set size = card(my);
CALL DBMS_OUTPUT.PUT('Cardinality = ');
CALL DBMS_OUTPUT.PUT_LINE(size);
end@
SET SERVEROUTPUT ON@
call test ()@
请记住,数组与字符串(CHAR)不同。数组是DB2中的内部对象,在使用它们之前需要将它们定义为变量。可以像你一样创建字符串:&#39;&#39;。但是,它们在DB2中是两个不同的东西。