人大金仓数据库KingbaseES PLSQL嵌套表

本文介绍了金仓数据库KingbaseES中PL/SQL的嵌套表概念、语法以及使用示例,包括如何声明、初始化和操作这种表类型,展示了在PLSQL块中和创建独立嵌套表类型的例子。
摘要由CSDN通过智能技术生成

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

参考资料

《KingbaseES产品手册》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值