将Array作为DB2存储过程中的参数传递

时间:2014-12-02 10:04:45

标签: sql stored-procedures db2

我正在尝试创建一个以数组作为参数的存储过程,并在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('')@ 

2 个答案:

答案 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中是两个不同的东西。