金仓数据库KingbaseES PLSQL嵌套表
关键字:
集合类型、嵌套表、人大金仓
什么是嵌套表
在数据库中,嵌套表是一种可以不指定顺序来存储未指定数量的行的类型,它是表中之表,在某种意义上来说,它是在一个表中存储一对多关系的一种方法。
语法:
TYPE <plsql_table_type_name> IS TABLE OF <data_type> |
例如:
TYPE NESTTAB_TYPE IS TABLE OF VARCHAR2(15); |
嵌套表变量声明后,需要使用构造函数初始化才能使用,初始化的方式有两种,一种是初始化为空,例如上面的例子中:
fruits NESTTAB_TYPE := NESTTAB_TYPE(); |
由于嵌套表被初始化为空,需要通过fruits.extend(n)向集合中添加n个null元素。为集合中分配空间后才可以正常进行使用。
另一种是初始化时直接为嵌套表分配元素,如:
fruits NESTTAB_TYPE := NESTTAB_TYPE('Apple', 'Orange'); |
此时fruits(1)和fruits(2)的值分别是Apple和Orange。这时也可以直接为fruits(1)和fruits(2)赋值,如:
fruits(1) := 'Watermelon'; fruits(2) := 'banana'; |
但是如果想为第三个元素赋值,需要先执行fruits. Extend继续给嵌套表分配空间后,才可以正常进行。
嵌套表的使用示例
1.在PLSQL块中使用嵌套表
示例:
\set SQLTERM / DECLARE TYPE NESTTAB_TYPE IS TABLE OF VARCHAR2(15); -- 声明嵌套表 -- 使用构造器初始化嵌套表,给'Apple', 'Orange', 'Banana', 'PEAR'四个初始变量 fruits NESTTAB_TYPE := NESTTAB_TYPE('Apple', 'Orange', 'Banana', 'PEAR'); PROCEDURE show_fruits (heading VARCHAR2) IS BEGIN RAISE NOTICE '%', heading; FOR i IN fruits.FIRST .. fruits.LAST LOOP -- 遍历嵌套表的每一个元素 RAISE NOTICE '%', fruits(i); END LOOP; RAISE NOTICE '---'; END; BEGIN show_fruits('Initial Values:'); fruits(3) := 'Watermelon'; -- 修改第三个嵌套表中元素的值 show_fruits('Current Values:'); fruits := NESTTAB_TYPE('Strawberry', 'Pineapple'); -- 修改整个嵌套表中元素的值 show_fruits('Current Values:'); END; / \set SQLTERM ; |
执行结果:
NOTICE: Initial Values: NOTICE: Apple NOTICE: Orange NOTICE: Banana NOTICE: PEAR NOTICE: --- NOTICE: Current Values: NOTICE: Apple NOTICE: Orange NOTICE: Watermelon NOTICE: PEAR NOTICE: --- NOTICE: Current Values: NOTICE: Strawberry NOTICE: Pineapple NOTICE: --- |
2.独立的嵌套表类型
示例:
\set SQLTERM / CREATE OR REPLACE TYPE nest_type IS TABLE OF NUMBER; / \set SQLTERM / CREATE OR REPLACE PROCEDURE show_nesttype (nt nest_type) AUTHID DEFINER IS i NUMBER; BEGIN i := nt.FIRST; IF i IS NULL THEN RAISE NOTICE 'nest type is empty'; ELSE WHILE i IS NOT NULL LOOP RAISE NOTICE 'nt(%) = %', i, nt(i); i := nt.NEXT(i); END LOOP; END IF; RAISE NOTICE '---'; END show_nesttype; / \set SQLTERM / DECLARE nt nest_type := nest_type(); -- nested table variable initialized to empty BEGIN show_nesttype(nt); nt := nest_type(1,3,99,1001); show_nesttype(nt); END; / \set SQLTERM ; |
执行结果:
NOTICE: nest type is empty NOTICE: --- NOTICE: nt(1) = 1 NOTICE: nt(2) = 3 NOTICE: nt(3) = 99 NOTICE: nt(4) = 1001 NOTICE: --- |