PLOSCAR集合变量的声明和初始化¶
一旦我们创建好了集合类型,我们就可以根据这个集合类型声明该类型的一个实例了: 也就是真正的集合变量。
一个集合变量声明的通常格式如下:
语法:
说明:
collection_name是集合变量的名字,命名规则符合PL/SQL命名规则。
collection_type具有两层含义,第一个collection_type代表先前已经声明的集合类型的名字,第二个collection_type代表嵌套表或变长数组类型同名的构造函数。
构造函数的名字和类型的名字是相同的,并且接收一个用逗号分隔的元素列表作为参数。如果我们声明的是一个嵌套表变量或者变长数组变量,我们在使用这个变量之前必须要对这个变量进行初始化。
索引表类型变量不需要初始化操作。
集合变量的初始化方式有如下几种:
声明时初始化
声明嵌套表或变长数组变量时,可以通过调用其构造函数立即对这个集合进行初始化。
示例1:利用构造函数初始化¶
-- 清理环境
DECLARE
TYPE courselist IS TABLE OF VARCHAR2(16);
my_courses courselist := courselist(
'Art 1111', 'Hist 3100', 'Engl 2005' );
BEGIN
null;
END;
/
执行时初始化
我们也可以把嵌套表和变长数组的初始化工作放在执行单元去做
示例2:利用执行单元初始化¶
DECLARE
TYPE courselist IS TABLE OF VARCHAR2(16);
my_courses courselist;
BEGIN
my_courses := courselist(
'Econ 2010', 'Acct 3401', 'Mgmt 3100' );
END;
/
在上述两种调用构造函数对集合变量进行初始化时,如果不传递任何参数,就会得到一个空的集合,这种情况下,如果要向集合中写入数据则需要调用集合的EXTEND方法添加元素,如下实例
示例3:利用EXTEND方法初始化¶
DROP TABLE tab CASCADE;
create table tab(a varchar2(10));
insert into tab values('a');
DECLARE
TYPE clientele IS VARRAY(100) OF tab.a%type;
vips clientele := clientele();
BEGIN
null;
END;
/
--删除
DROP TABLE tab CASCADE;
直接赋值时的隐式初始化
只要两个集合变量是基于同一个集合类型(如果是两个不同的集合类型则不可以,即便是两个相同数据类型的集合类型也不能进行赋值操作),我们就可以把其中的一个实例的全部内容拷贝给另一个。当进行这样操作时,就相当于对集合变量进行了隐式初始化操作。
下面的实例演示了集合变量的赋值操作,执行后,左值my_courses2相当于进行了隐式初始化操作
示例4:利用集合变量初始化¶
DECLARE
TYPE courselist IS TABLE OF VARCHAR2(16);
my_courses courselist;
my_courses2 courselist;
BEGIN
my_courses := courselist('Econ 2010', 'Acct 3401', 'Mgmt 3100' );
my_courses2 := my_courses;
END;
/
批量操作时的隐式初始化
在使用FORALL或者BULK COLLECT批量操作时,可以对使用的集合变量进行隐式的初始化操作,相关批量操作的详细内容见批量绑定章节。