更新 row 类型的集合

要更新 ROW 类型的集合,您可采用这些步骤:
  1. 声明集合变量,其字段数据类型与该集合中的那些 ROW 类型相匹配。
  2. 将集合变量的个别字段设置为 ROW 类型的正确数据值。
  3. 对于每一 ROW 类型,请使用集合变量更新集合派生的表的全部行。
图 2 中的 manager 表有一名为 projects 的列,包含在下图展示其定义的 ROW 类型的 LIST。

图: ROW 类型的 LIST 定义。

projects   LIST( ROW( pro_name VARCHAR(15),
          pro_members SET(VARCHAR(20) NOT NULL) ) NOT NULL)
要访问 LIST 中的 ROW 类型,请声明游标,并将该 LIST 选择至集合变量内。然而,在您检索 projects 列中每一 ROW 类型值之后,您不可个别地更新 pro_namepro_members 字段。相反,对于需要在集合中更新的每一 ROW 值,您必须将整个 ROW 替换为来自包括新字段值的集合变量的值,如下图所示。

图: 访问 LIST 中的 ROW 类型。

CREATE PROCEDURE update_pro( mgr VARCHAR(30),
            pro VARCHAR(15) )
            
            DEFINE p LIST(ROW(a VARCHAR(15), b SET(VARCHAR(20) 
            NOT NULL) ) NOT NULL);
            DEFINE r ROW(p_name VARCHAR(15), p_member SET(VARCHAR(20) NOT NULL) );
            LET r = ROW("project", "SET{'member'}");
            
            SELECT projects INTO p FROM manager
            WHERE mgr_name = mgr;
            
            FOREACH cursor1 FOR
            SELECT * INTO r FROM TABLE(p)
            IF (r.p_name == 'Zephyr') THEN
            LET r.p_name = pro;
            UPDATE TABLE(p)(x) SET x = r
            WHERE CURRENT OF cursor1;
            EXIT FOREACH;
            END IF;
            END FOREACH
            
            UPDATE manager SET projects = p
            WHERE mgr_name = mgr;
            
            END PROCEDURE;
在您可在 SPL 程序中使用 row 类型变量之前,您必须使用 LSET 语句或 SELECT INTO 语句来初始化该行变量。前图的 FOREACH 循环中嵌套的 UPDATE 语句将 row 类型的 pro_name 字段设置为变量 pro 中提供的值。
提示: 要更新 ROW 类型的 pro_members 字段中 SET 中的值,请声明游标,并使用带有派生的列的 UPDATE 语句,如 更新集合元素 说明的那样。