金仓数据库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: ---