更新嵌套的集合

如果您想要更新集合的集合,则必须声明游标来访问外层的集合,然后声明嵌套的游标来访问内层的集合。

例如,假设 manager 表有一附加的列 scores,它包含一其元素类型为整数的 MULTISET 的 LIST,如下图所示。

图: 更新集合的集合。

scores         LIST(MULTISET(INT NOT NULL) NOT NULL);
要更新 MULTISET 中的值,请声明在 LIST 中每一值间移动的游标,以及在 MULTISET 中 每一值间移动的嵌套的游标,如下图所示。

图: 更新 MULTISET 中的值。

CREATE FUNCTION check_scores ( mgr VARCHAR(30) )
            SPECIFIC NAME nested;
            RETURNING INT;
            
            DEFINE l LIST( MULTISET( INT NOT NULL ) NOT NULL );
            DEFINE m MULTISET( INT NOT NULL );
            DEFINE n INT;
            DEFINE c INT;
            
            SELECT scores INTO l FROM manager
            WHERE mgr_name = mgr;
            
            FOREACH list_cursor FOR
            SELECT * FROM TABLE(l) INTO m;
            
            FOREACH set_cursor FOR
            SELECT * FROM TABLE(m) INTO n;
            IF (n == 0) THEN
            DELETE FROM TABLE(m)
            WHERE CURRENT OF set_cursor;
            ENDIF;
            END FOREACH;
            LET c = CARDINALITY(m);
            RETURN c WITH RESUME;
            END FOREACH
            
            END FUNCTION
            WITH LISTING IN '/tmp/nested.out';
该 SPL 函数将 scores 列中的每一 MULTISET 选择至 l 内,然后将 MULTISET 中的每一值选择至 m 内。如果 m 中的值为 0,则函数从 MULTISET 删除它。在删除 0 的值之后,该函数统计每一 MULTISET 中剩余的元素数,并返回一整数。
提示: 由于此函数为 LIST 中每一 MULTISET 返回一值,因此,当您执行该函数时,您必须使用游标来括起 EXECUTE FUNCTION 语句。