Oracle定义了一个联合数组并使用了技巧。
重要的是要注意与数组有关的一些关键问题是非常重要的,这些问题需要我们在介绍它们的用法时采取一些特殊的方法:
关联数组不需要初始化,也不需要构造函数语法,在分配给它们之前,不需要专门为它们分配存储空间,也不需要使用集合API的扩展方法。
在Oracle 10g中,在Oracle 10g的早期版本中,可以使用数字索引联合数组。此外,在Oracle 10g中,还可以使用具有唯一性的可变长度字符串作为联合数组的索引。
任何整数都可以用作关联数组的索引,这意味着联合数组的索引可以是正的、负的或0个。
等效%ROWTYPE,记录类型和对象类型的返回值可以是显式的转换为一个联邦阵列结构。
结合阵列是使用FORALL语句或散装收集条款的关键,后者允许数据库转换程序设计单位批量转换。
在使用全局设置的数据库,如nls_comp或nls_sort初始化参数,我们需要做特殊处理,当我们使用字符串作为联合数组索引。
1。定义一个联合数组和一个程序结构,用作
有两种语法用于定义联合数组,这是:
创建或替换型type_name
作为element_type {不空表}
指数{ pls_integer binary_integer | | VARCHAR2(大小)};
积极的,消极的,或0值可作为关联数组索引。在Oracle 10g的pls_integer binary_integer类型是不受限制的数据类型。这两个数据类型映射到C / C++调用规范,C和java #。
可变长度字符串的最大长度为4000个字符。
定义联合数组的另一个语法是:
创建或替换型type_name
作为element_type {不空表}
指数key_type;
的key_type允许我们使用VARCHAR2,字符串,或长型。使用VARCHAR2和字符串时,您需要定义的大小。使用长型的时候,你不需要定义的大小,因为它是通过定义VARCHAR(32760)定义。
联合数组不需要初始化,也没有构造函数语法。这是一个地方,从收集的其他两种本质上不同的(VARRAY和嵌套表)。
如果你建立一个联合数组,这样,就会造成pls-00222例外。
复制代码代码如下所示:
-定义字符串的关联数组。
型card_table是表字段(5个字符)
指数binary_integer;
并试图构造一个关联数组。
卡card_table:= card_table(A,B,C);
开始
无效的;
结束;
在前面的介绍,我们知道一个对象的构造函数可以作为一个功能完全的。其他集合类型,如VARRAY和嵌套表是对象明确定义构造函数的类型,数组只是一个结构,不是一个对象的类型。因此,它不能显式创建一个构造函数,也可以调用构造函数。
2。联合数组的初始化
我们已经说过,我们可以构造一个数或一个独特的特征为指标的变长字符串的联合数组。例如一个数字指标,是一个整数,它可以是一个正整数,负整数,和一个0值,可变长度的字符串是唯一一个空的字符串数据类型,或长。
1)使用数字作为关联数组的索引。
下面的示例给出了将元素分配到具有数字索引的联合数组的过程。这个例子演示了将动态数组内容联盟阵列的过程。
复制代码代码如下所示:
定义一个动态数组十二串。
型months_varray是动态数组(12)字符串(9个字符);
-定义字符串的关联数组。
型calendar_table是表字段(9个字符)
指数binary_integer;
构建一个动态数组。
月months_varray:=
months_varray('january ','february ','march)
四月,‘愿',6月
七月,'august '、'九月'
十月,'november ','december);
关联数组变量。
日历calendar_table;
开始
-检查日历是否没有元素。
如果calendar.count = 0
-打印标题
dbms_output.put_line('assignment回路:');
dbms_output.put_line(' ----------------);
通过所有的动态数组元素循环。
我在月。第一month.last环..
-初始化空关联数组元素。
日历(i):=;
-从关联数组中打印索引元素。
dbms_output.put_line(
指数{| |我| |}是{| |日历(我)| |});
指定数字索引值动态数组元素
-等于指数值关联数组元素。
日历(i):=月(i);
结束循环;
-打印标题
dbms_output.put(CHR(10));
dbms_output.put_line('post-assignment回路:');
dbms_output.put_line(' ---------------------);
遍历所有关联数组元素。
我在日历第一.. calendar.last回路。
-从关联数组中打印索引元素。
dbms_output.put_line(
指数{| |我| |}是{| |日历(我)| |});
结束循环;
最后如果;
结束;
/
在第一for-loop环空值分配给具有相等的动态数组类型的月指数指标值的联合数组类型的历变。这是一个联合数组分配空间的唯一途径。
2)使用唯一字符串作为索引索引。
如下面的例子所示:
复制代码代码如下所示:
定义一个动态数组十二可变长度字符串。
型months_varray是动态数组(12)字符串(9个字符);
-定义一个可变长度字符串的关联数组。
型calendar_table是表字段(9个字符)
指数VARCHAR2(9个字符);
构建一个动态数组。
月months_varray:=
months_varray('january ','february ','march)
四月,‘愿',6月
七月,'august '、'九月'
十月,'november ','december);
关联数组变量。
日历calendar_table;
开始
-检查日历是否没有元素。
如果calendar.count = 0
-打印标题
dbms_output.put_line('assignment回路:');
dbms_output.put_line(' ----------------);
通过所有的动态数组元素循环。
我在月。第一month.last环..
指定数字索引值动态数组元素
-等于指数值关联数组元素。
日历(月(一)):=;
-从关联数组中打印索引元素。
dbms_output.put_line(
指数{| |月(我)| |}是{| |我| |});
结束循环;
-打印标题
dbms_output.put(CHR(10));
dbms_output.put_line('post-assignment回路:');
dbms_output.put_line(' ---------------------);
遍历所有关联数组元素。
我在日历第一.. calendar.last回路。
-从关联数组中打印索引元素。
dbms_output.put_line(
指数{| |我| |}是{| |日历(我)| |});
结束循环;
最后如果;
结束;
这将运行上面的代码错误。ora-06502:PL / SQL:数值或数值错误:字符数字转换错误。没有问题在初始化在第一for-loop.in二for-loop环,然而,程序试图通过非数字值的计数器变量在程序上。计数器变量,即数据类型的计数器变量被定义为pls_integer型。因此,整个长字符串的索引值不能被分配给一个整数变量,因为变量长度的字符串不是一个整数。当然,类型转换错误ora-06502是由自然原因引起的,例如原因是,计数器变量转换为VARCHAR2类型初始化时的联盟l当工会成员,并读取数组,反式转换为整数型。
这实际上给了我们一个新的问题:非数字索引值要求我们知道索引的初始值和索引的增加方法。
如下面的例子所示:
复制代码代码如下所示:
-定义变量以遍历关联数组
为索引值使用可变长度字符串。
目前VARCHAR2(9个字符);
元整;
定义一个动态数组十二可变长度字符串。
型months_varray是动态数组(12)字符串(9个字符);
-定义一个可变长度字符串的关联数组。
型calendar_table是表字段(9个字符)
指数VARCHAR2(9个字符);
构建一个动态数组。
月months_varray:=
months_varray('january ','february ','march)
四月,‘愿',6月
七月,'august '、'九月'
十月,'november ','december);
关联数组变量。
日历calendar_table;
开始
-检查日历是否没有元素。
如果calendar.count = 0
-打印标题
dbms_output.put_line('assignment回路:');
dbms_output.put_line(' ----------------);
通过所有的动态数组元素循环。
我在月。第一month.last环..
指定数字索引值动态数组元素
-等于指数值关联数组元素。
日历(月(我)):= to_char(我);
-从关联数组中打印索引元素。
dbms_output.put_line(
指数{| |月(我)| |}是{| |我| |});
结束循环;
-打印标题
dbms_output.put(CHR(10));
dbms_output.put_line('post-assignment回路:');
dbms_output.put_line(' ---------------------);
遍历所有关联数组元素。
我在1 calendar.count环..
-检查循环中的第一个元素。
如果我= 1然后
-将第一个字符索引分配给变量。
电流:= calendar.first;
使用派生索引查找下一个索引。
元素:=日历(当前);
其他的
-检查下一个索引值是否存在。
如果calendar.next(电流)不为空,则
将字符索引分配给变量。
电流:= calendar.next(电流);
使用派生索引查找下一个索引。
元素:=日历(当前);
其他的
-自上次索引值读取后退出循环。
出口;
最后如果;
最后如果;
-从关联数组中打印索引元素。
dbms_output.put_line(
指数{| |电流| |}是{| |元| |});
结束循环;
最后如果;
结束;
三.使用组合阵列与散装收集所有
使用散装收集所有胃我们打开消除线路电平处理门。使用散装收集得到一个记录集存储在联合数组和嵌套表。使用所有可以在batch.forall DML语句可以插入、更新和删除数据。这些方法减少次数切换上下文环境来回的PL / SQL引擎和SQL引擎。没有这些方法,会有太多的解析或数值。
你应该记住,线级别的处理实际上是使用%ROWTYPE %统前可以直接映射到记录type.bulk收集可以分配的一套%ROWTYPE或%型值作为集合的联合数组和嵌套table.forall提供了一种方法来转移的联合数组的内容或嵌套表对数据库对象。
和嵌套表的集合类型的组合可以用于批量收集所有组合。使用嵌套表的时候,你需要构建嵌套表作为一套空elements.bulk收集明确指定嵌套表的存储空间,不需要构建一个全局数组,只要批量赋值可用。以同样的方式,两者的联合数组和嵌套表可以作为SQL命令所有源结构。
如下面的示例所示:
复制代码代码如下所示:
-为示例创建一个表。
创建表bulk_numbers
(number_id数不为空
number_id_pk主键约束(number_id));
-定义一个整数的关联数组。
型number_table是表bulk_numbers number_id分型。
指数binary_integer;
-定义关联数组类型的变量。
number_list number_table;
开始
循环从1到一百万和增量关联数组。
对于我在1….. 10000圈
-赋值数值。
number_list(I):=我;
结束循环;
-循环通过所有来执行批量插入。
就我number_list.count 1 ..
插入
为bulk_numbers
值(number_list(我));
-提交记录。
承诺;
结束;
使用批量收集将表检索到
-关联数组。
-定义一个整数的关联数组。
型number_table是表bulk_numbers number_id分型。
指数binary_integer;
-定义关联数组类型的变量。
number_list number_table;
开始
-检查日历是否没有元素。
选择number_id
散装收集
为number_list
从bulk_numbers;
-打印标题
dbms_output.put_line('bulk收集的);
dbms_output.put_line(' ---------------);
循环打印元素。
-只打印前两个和最后两个记录
我在number_list第一.. number_list.last回路。
只打印第一个和最后两个。
如果我= 9999然后
-从关联数组中打印索引元素。
dbms_output.put_line(若干{| | number_list(我)| |});
最后如果;
结束循环;
结束;
在批量收集子句中,订单用于确保结果按升序排列。如果没有对元素进行排序,则发现它们是按随机顺序而不是按数字顺序获得的。