在集合中,内部组件始终具有相同的数据类型,并称为元素。您可以通过索引访问集合变量的每个元素,语法为:variable_name(index)
。
要创建集合变量,您可以定义集合类型,然后创建该类型的变量,或者使用%TYPE
。
在PL/oraSQL块中定义的集合类型是本地类型。它仅在块中可用,并且仅在块位于独立的或包子程序中时存储在数据库中。
在模式级别定义的集合类型是独立类型。您可以使用“CREATE TYPE语句”创建它。它存储在数据库中,直到您使用“DROP TYPE语句”将其删除。
在包规范中定义的集合类型是公共项。您可以通过使用包名称(package_name.type_name)来限定它从包外引用。它存储在数据库中,直到您删除包。
关联数组是一组键值对。每个键是唯一的索引,用于使用语法variable_name(index)
定位关联值。
索引的数据类型可以是字符串类型(VARCHAR 或 VARCHAR2)或INTEGER。索引按排序顺序存储,而不是创建顺序。
导出联合数组操作,当索引的数据类型是varchar2时,会被替换为varchar类型。导入联合数组操作,当索引的数据类型是varchar2时,会被替换为varchar类型。
PERFORM
不支持用于操作联合数组并且dbms_output.put_line
不支持用于打印关联数组的元素。
例如,定义了一个按integer索引的关联数组类型,声明了该类型的变量,将变量填充到三个元素,更改了一个元素的值,并打印了这些值(按排序顺序,而不是创建顺序)。
DECLARE -- Associative array indexed by integer: TYPE population IS TABLE OF varchar -- Associative array type INDEX BY integer; -- indexed by integer city_population population; -- Associative array variable i integer; BEGIN -- Add elements (key-value pairs) to associative array: city_population('2') := 'Smallville'; city_population('5') := 'Midland'; city_population('3') := 'Megalopolis'; FOR i IN 1..6 LOOP IF city_population.EXISTS(i) THEN dbms_output.put_line ('city_population(' || i || ')' || ' exists'); ELSE dbms_output.put_line ('city_population(' || i || ')' || ' does not exist'); END IF; END LOOP; END; /
例如,定义了一个按字符串索引的关联数组类型,声明了该类型的变量,将变量填充到三个元素,更改了一个元素的值,并打印了这些值。
DECLARE -- Associative array indexed by varchar2(64): TYPE population IS TABLE OF NUMERIC -- Associative array type INDEX BY VARCHAR2(64); -- indexed by varchar2(64) city_population population; -- Associative array variable BEGIN -- Add elements (key-value pairs) to associative array: city_population('Smallville') := 2000; city_population('Midland') := 750000; city_population('Megalopolis') := 1000000; raise info 'the count elements is %', city_population; city_population('Midland') := 50000; raise info 'the count elements is %', city_population; END; /dbms_output.put_line
不支持用于打印关联数组的元素,所以这里使用raise
打印元素。
在数据库中,嵌套表是一种列类型,它以没有特定顺序的方式存储未指定数量的行。
当您将数据库中的嵌套表值检索到PL/oraSQL嵌套表变量中时,PL/oraSQL会为行分配连续的索引,从1开始。使用这些索引,您可以访问嵌套表变量的各个行。 语法是variable_name(index)
。随着您将嵌套表从数据库中存储和检索,嵌套表的索引和行顺序可能不会保持稳定。
随着您添加或删除元素,嵌套表变量占用的内存量可以动态增加或减少。
示例:本地类型的嵌套表
DECLARE TYPE Roster IS TABLE OF VARCHAR(15); -- nested table type -- nested table variable initialized with constructor: names2 Roster := Roster('D Caruso', 'J Hamil', 'D Piro', 'R Singh'); BEGIN DBMS_OUTPUT.PUT_LINE('Initial Values:'); FOR i IN names2.FIRST .. names2.LAST LOOP -- For first to last element DBMS_OUTPUT.PUT_LINE(names2(i)); END LOOP; DBMS_OUTPUT.PUT_LINE('------------------'); names2(5) := 'P Perez'; -- add one element FOR i IN names2.FIRST .. names2.LAST LOOP -- For first to last element DBMS_OUTPUT.PUT_LINE(names2(i)); END LOOP; END; /
示例:独立类型的嵌套表
CREATE TYPE names2 IS TABLE OF VARCHAR(15); DECLARE nt names2 ; BEGIN nt(1) = 'D Caruso'; nt(2) = 'J Hamil'; nt(3) = 'R Singh'; DBMS_OUTPUT.PUT_LINE(nt(2)); END; /
示例:复杂类型的嵌套表
create table t(a int,b text); insert into t values(1,'1'); insert into t values(2,'2'); select dbms_output.serveroutput('t'); create or replace procedure p1 is TYPE array_table IS TABLE OF t%rowtype; a_table array_table := array_table(); BEGIN SELECT t.* BULK COLLECT INTO a_table FROM t; FOR i IN a_table.first..a_table.last LOOP a_table(i).a := 123; a_table(i).b := 'test'; dbms_output.put_line('a_table(i).a = '||a_table(i).a||', a_table(i).b = '||a_table(i).b); END LOOP; END; /
示例: 使用嵌套表元素作为插入操作数据源
create table t(a int,b float,c number); insert into t values(1,10,100); insert into t values(2,20,200); create or replace procedure p1 is TYPE array_table IS TABLE OF t%rowtype; a_table array_table := array_table(); BEGIN SELECT t.* BULK COLLECT INTO a_table FROM t; execute immediate 'truncate table t'; FOR i IN a_table.first..a_table.last LOOP a_table(i).a := a_table(i).a * 100; a_table(i).b := a_table(i).b * 100; a_table(i).c := a_table(i).c * 100; INSERT INTO t VALUES a_table(i); END LOOP; END; /
可变大小数组是一个数组,其元素数量可以从零(空)到声明的最大大小不等,在这里超过也支持。
要访问可变数组的元素,使用语法variable_name(index)
。在数据库中存储和检索可变数组时,其索引和元素顺序将保持稳定。
随着您添加或删除元素,可变数组变量占用的内存量可以动态增加或减少。
目前只支持本地类型的可变数组,不支持全局可变数组。
示例:本地类型的可变数组
DECLARE TYPE Roster IS VARRAY(10) OF VARCHAR(15); -- varray type -- varray variable initialized with constructor: names2 Roster := Roster('D Caruso', 'J Hamil', 'D Piro', 'R Singh'); BEGIN DBMS_OUTPUT.PUT_LINE('Initial Values:'); FOR i IN names2.FIRST .. names2.LAST LOOP -- For first to last element DBMS_OUTPUT.PUT_LINE(names2(i)); END LOOP; DBMS_OUTPUT.PUT_LINE('------------------'); names2.extend; names2(5) := 'P Perez'; -- add one element FOR i IN names2.FIRST .. names2.LAST LOOP -- For first to last element DBMS_OUTPUT.PUT_LINE(names2(i)); END LOOP; END; /
集合方法是一个PL/oraSQL子程序,可以是返回有关集合信息的函数,也可以是操作集合的过程。集合方法使集合易于使用,使您的应用程序易于维护。
Table 44.1显示了集合方法。
Table 44.1. 集合方法
方法 | 描述 |
---|---|
DELETE | 从集合中删除元素。 |
EXTEND | 将元素添加到嵌套表的末尾。 |
EXISTS | 如果嵌套表的指定元素存在,则返回TRUE。 |
FIRST | 返回集合中的第一个索引。 |
LAST | 返回集合中的最后一个索引。 |
COUNT | 返回集合中的元素数量。 |
集合方法调用的基本语法如下:
collection_name.method