存储过程——如何在DB2 SQL PL中访问数组类型中的行类型



我有一个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@

您需要声明一个行类型的临时变量,并在循环中为其分配数组元素:

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@
然而,更简洁的方法是使用集合派生的表引用:
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@

最新更新