【问题标题】:Pass Array as parameter in DB2 Stored Procedure在 DB2 存储过程中将数组作为参数传递
【发布时间】:2014-12-02 10:04:44
【问题描述】:

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

【问题讨论】:

  • @ChestNoot - 这是 DB2,它是一个完全不同的产品。诸如对数组参数的支持之类的东西参差不齐。
  • @ChestNoot 我正在使用 DB2,我只想使用 SQL 调用该过程。我不涉及 C、Java 或任何其他语言。所以,我不认为这是重复的。
  • 我已经设法找到解决这个问题的方法。我使用 VARCHAR 作为输入参数并遍历每个 CHAR。但是,仍然会感谢您的回答。谢谢。

标签: sql stored-procedures db2


【解决方案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)可能无法使用上述使用数组构造函数的存储过程调用语法,但它绝对适用于 Linux 命令行 db2工具又名。 DB2 UDB CLP.

【讨论】:

    【解决方案2】:

    你需要先定义数据类型,然后创建一个变量来传递like参数。

    >>-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 中的一个内部对象,在使用它们之前需要将它们定义为变量。可以像您一样创建字符串:''。但是,它们在 DB2 中是两个不同的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 2021-10-03
      • 1970-01-01
      • 2010-11-07
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多