通常情况下,在PL/SQL中,处理单行单列的数据可以使用标量变量,而处理单行多列的数据则使用PL/SQL记录是不错的选择。单列多行数据
则由联合数组或嵌套表来完成,其特点是类似于单列数据库表。在Oracle 9i 之前称为PL/SQL索引表,9i 之后称之为联合数组。嵌套表也是集合
类型中的一种,下面分别介绍这两种集合数据类型的使用方法。
一、联合数组
1、联合数组的特性 类似于一张简单的SQL表,按照主键进行检索数据 其数据行并不是按照预定义的顺序存储。当使用变量来检索其数据时,每行数据会分配一个连续的下标且从1开始。 下标可以为负值,且下标的数据类型支持binary_integer,pls_integer,varchar2 其数据元素个数无限制 不能作为表列的数据类型使用,即只能作为PL/SQL复合数据类型使用 存放的数据类型是临时数据,故不支持insert,select into 等SQL语句,等同于SQL server中的表变量 2、语法 TYPE type_name IS TABLE OF element_type [NOT NULL] -->element_type为联合数组元数据指定数据类型(先使用TYPE声明表结构) INDEX BY key_type; -->元素下标的数据类型 table_name TYPE_NAME; -->再使用声明的TYPE类型声明实际数组名 3、示例--使用PLS_INTEGE类型联合数组scott@CNMMBO> DECLARE -->定义游标 2 CURSOR name_cur IS 3 SELECT dname 4 FROM dept 5 WHERE deptno < 40; 6 7 TYPE name_type IS TABLE OF dept.dname%TYPE -->定义一个联合数组类型,且其下标的数据类型为PLS_INTEGER 8 INDEX BY PLS_INTEGER; 9 10 dname_tab name_type; -->声明类型为name_type的联合数组dname_tab 11 v_counter INTEGER := 0; 12 BEGIN 13 FOR name_rec IN name_cur 14 LOOP 15 v_counter := 16 v_counter 17 + 1; 18 dname_tab( v_counter ) := name_rec.dname; -->对联合数据进行循环赋值 19 DBMS_OUTPUT.put_line( 'Dname is(' 20 || v_counter 21 || '):' 22 || dname_tab( v_counter ) ); -->输出联合数组中的所有元素 23 END LOOP; 24 END; 25 /Dname is(1):ACCOUNTINGDname is(2):RESEARCHDname is(3):SALESPL/SQL procedure successfully completed.--使用VARCHAR2类型联合数组scott@CNMMBO> DECLARE 2 TYPE score_type IS TABLE OF NUMBER