【问题标题】:How to access a Row Type within an Array Type in DB2 SQL PL如何在 DB2 SQL PL 中访问数组类型中的行类型
【发布时间】:2015-06-07 01:14:45
【问题描述】:

我有一个带有数据表的 java 前端。我们需要通过存储过程将这些数据保存到数据库中。如果传递的参数只是一个数组,我可以轻松访问内容。但是如果数组的内容也是一个行类型,那就是我遇到问题的部分。

我不知道如何访问数组的内容。

我正在使用 DB2 10.1

CREATE TABLE "TEST"."CHART_ACCT" (
    "ACCT_NO" VARCHAR(10) NOT NULL, 
    "ACCT_DESC" VARCHAR(40) NOT NULL
)
ORGANIZE BY ROW
DATA CAPTURE NONE 
IN "USERSPACE1"
COMPRESS YES ADAPTIVE
VALUE COMPRESSION@

CREATE OR REPLACE TYPE TEST.ACCT AS ROW ANCHOR ROW OF TEST.CHART_ACCT@

CREATE OR REPLACE TYPE TEST.ACCT_ARR AS TEST.ACCT ARRAY[]@

CREATE OR REPLACE PROCEDURE TEST.TEST_ARRAY (IN P_ACCT_ARR TEST.ACCT_ARR)
P1: BEGIN
-- #######################################################################
-- #
-- #######################################################################
DECLARE i INTEGER;
SET i = 1;
WHILE i < 10 DO
    CALL DBMS_OUTPUT.PUT_LINE(P_GLACCT_ARR[i]);
set i = i + 1;
END WHILE;
END P1@

【问题讨论】:

    标签: arrays stored-procedures types db2 row


    【解决方案1】:

    你需要声明一个行类型的临时变量,并循环分配数组元素给它:

    CREATE OR REPLACE PROCEDURE TEST_ARRAY (IN P_ACCT_ARR ACCT_ARR)
    P1: BEGIN
    DECLARE i INTEGER;
    DECLARE v_acct acct;
    SET i = 1;
    WHILE i < CARDINALITY(p_acct_arr) DO
        SET v_acct = p_acct_arr[i];
        CALL DBMS_OUTPUT.PUT_LINE('Account number = ' || v_acct.acct_no);
        set i = i + 1;
    END WHILE;
    END P1@
    

    不过,更简洁的方法是使用collection-derived table reference

    CREATE OR REPLACE PROCEDURE TEST_ARRAY (IN P_ACCT_ARR ACCT_ARR)
    P1: BEGIN
    FOR r AS (SELECT * FROM UNNEST(p_acct_arr) t ) DO
        CALL DBMS_OUTPUT.PUT_LINE('Account number = ' || r.acct_no);
    END FOR;
    END P1@
    

    【讨论】:

    • 像魅力一样工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多