PLOSCAR集合变量的声明和初始化

一旦我们创建好了集合类型,我们就可以根据这个集合类型声明该类型的一个实例了: 也就是真正的集合变量。

一个集合变量声明的通常格式如下:

语法:

collection_variable_dec ::=

说明:

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批量操作时,可以对使用的集合变量进行隐式的初始化操作,相关批量操作的详细内容见批量绑定章节。