如果您想要更新集合的集合,则必须声明游标来访问外层的集合,然后声明嵌套的游标来 访问内层的集合。
例如,假设 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 语句。