集合
两个表通常使用外键建立数据之间的关联,相对于这样的方式访问数据库,存储在集合中的数据可以更快的被访问。常用的集合类型:@H_403_4@
index-by表@H_403_4@
嵌套表@H_403_4@
可变数组@H_403_4@
index-by表@H_403_4@
index-by表类似C语言中的数组,但是元素顺序并没有按照特定的顺序排列。元素的个数只受到BINARY_INTEGER的下标大小限制。@H_403_4@
type@H_403_4@ tabletype @H_403_4@IS@H_403_4@ @H_403_4@table@H_403_4@ @H_403_4@of@H_403_4@ @H_403_4@INDEX@H_403_4@ @H_403_4@BY@H_403_4@ binaru_interger;@H_403_4@@H_403_4@ --typetable:@H_403_4@定义的新类型类型名@H_403_4@@H_403_4@ --type@H_403_4@:定义@H_403_4@index-by@H_403_4@表的类型@H_403_4@@H_403_4@ type@H_403_4@ Country_Name @H_403_4@IS@H_403_4@ @H_403_4@table@H_403_4@ @H_403_4@of@H_403_4@ COUNTRIES.COUNTRIES_NAME%@H_403_4@TYPE@H_403_4@@H_403_4@ --@H_403_4@声明使用类型@H_403_4@@H_403_4@ INDEX@H_403_4@ @H_403_4@by@H_403_4@ @H_403_4@binary_integer@H_403_4@;@H_403_4@@H_403_4@ --@H_403_4@声明变量@H_403_4@@H_403_4@ v_Name Country_Name;@H_403_4@@H_403_4@ --@H_403_4@赋值操作@H_403_4@@H_403_4@ v_Name(@H_403_4@1@H_403_4@):=@H_403_4@'China'@H_403_4@;@H_403_4@@H_403_4@ v_Name(@H_403_4@2@H_403_4@):=@H_403_4@'AnHui'@H_403_4@;@H_403_4@@H_403_4@ v_Name(@H_403_4@3@H_403_4@):=@H_403_4@'HeFei'@H_403_4@;@H_403_4@@H_403_4@ v_Name(-@H_403_4@2@H_403_4@):=@H_403_4@'SuZhou'@H_403_4@;@H_403_4@@H_403_4@ v_Name(@H_403_4@6@H_403_4@):=@H_403_4@'SiXian'@H_403_4@;@H_403_4@@H_403_4@ |
@H_403_4@
type@H_403_4@ StudyTab @H_403_4@IS@H_403_4@ @H_403_4@table@H_403_4@ @H_403_4@of@H_403_4@ @H_403_4@varchar@H_403_4@(@H_403_4@20@H_403_4@) @H_403_4@index@H_403_4@ @H_403_4@by@H_403_4@ @H_403_4@binary_integer@H_403_4@;@H_403_4@@H_403_4@ v_StudyTab StudyTab;@H_403_4@@H_403_4@ @H_403_4@--@H_403_4@使用循环赋值@H_403_4@@H_403_4@ @H_403_4@for@H_403_4@ v_Count @H_403_4@IN@H_403_4@ @H_403_4@1@H_403_4@..5 @H_403_4@Loop@H_403_4@@H_403_4@ v_StudyTab(v_Count):=v_Count*@H_403_4@100@H_403_4@;@H_403_4@@H_403_4@ @H_403_4@end@H_403_4@ @H_403_4@loop@H_403_4@;@H_403_4@@H_403_4@ @H_403_4@--@H_403_4@使用循环取值@H_403_4@@H_403_4@ @H_403_4@for@H_403_4@ v_Count @H_403_4@in@H_403_4@ @H_403_4@1@H_403_4@..6 @H_403_4@loop@H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(v_StudyTab(v_Count));@H_403_4@@H_403_4@ @H_403_4@end@H_403_4@ @H_403_4@loop@H_403_4@;@H_403_4@@H_403_4@ end@H_403_4@;@H_403_4@@H_403_4@ --@H_403_4@上面赋值的时候只赋了@H_403_4@5@H_403_4@个值,但是取值的时候取了@H_403_4@6@H_403_4@个值,报错@H_403_4@@H_403_4@ |
嵌套表@H_403_4@
嵌套表和index-by表相比少了index@H_403_4@ @H_403_4@by@H_403_4@ @H_403_4@binary_integer@H_403_4@子句。这也是区分两种表的区别。@H_403_4@
--@H_403_4@嵌套表声明语法@H_403_4@@H_403_4@ type@H_403_4@ table_name @H_403_4@IS@H_403_4@ @H_403_4@table@H_403_4@ @H_403_4@of@H_403_4@ table_type[@H_403_4@not@H_403_4@ @H_403_4@null@H_403_4@];@H_403_4@@H_403_4@ --@H_403_4@嵌套表的初始化@H_403_4@@H_403_4@ type@H_403_4@ StudyTab @H_403_4@IS@H_403_4@ @H_403_4@table@H_403_4@ @H_403_4@of@H_403_4@ @H_403_4@varchar@H_403_4@(@H_403_4@20@H_403_4@);@H_403_4@@H_403_4@ v_StudyTab StudyTab:=StudyTab(@H_403_4@'Tom'@H_403_4@,@H_403_4@'Jack'@H_403_4@,@H_403_4@'Rose'@H_403_4@);@H_403_4@@H_403_4@ @H_403_4@for@H_403_4@ v_Count @H_403_4@IN@H_403_4@ @H_403_4@1@H_403_4@..3 @H_403_4@loop@H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(v_StudyTab(v_Count));@H_403_4@@H_403_4@ @H_403_4@end@H_403_4@ @H_403_4@loop@H_403_4@;@H_403_4@@H_403_4@ |
² index-by表:如果声明类型之后,再声明一个index-by表变量类型,如果没有给@H_403_4@
该表赋值,那么这个表就是空的,后面可以继续添加@H_403_4@
² 嵌套表:声明嵌套表变量类型时,如果表中没有任何元素,会初始化为null,并且@H_403_4@
@H_403_4@
初始化为@H_403_4@null@H_403_4@后添加元素:引用未初始化的收集@H_403_4@@H_403_4@
初始化赋值后添加元素:下标超出数量@H_403_4@@H_403_4@
嵌套表和index-by表很相似,但是嵌套表在结构上是有序的,index-by表是无序的,给嵌套表赋值,下标从1开始,而且依次递增。@H_403_4@
type@H_403_4@ NumTab @H_403_4@is@H_403_4@ @H_403_4@Table@H_403_4@ @H_403_4@of@H_403_4@ Numer(@H_403_4@4@H_403_4@);@H_403_4@@H_403_4@ v_Num NumTab:=NumTab(@H_403_4@1@H_403_4@,@H_403_4@2@H_403_4@,@H_403_4@4@H_403_4@,@H_403_4@5@H_403_4@,@H_403_4@7@H_403_4@,@H_403_4@9@H_403_4@);@H_403_4@@H_403_4@ @H_403_4@for@H_403_4@ v_Count @H_403_4@IN@H_403_4@ @H_403_4@1@H_403_4@..6 @H_403_4@loop@H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(@H_403_4@'v_Num('@H_403_4@||v_Count||@H_403_4@')='@H_403_4@||v_Num(v_Count));@H_403_4@@H_403_4@ |
上面赋值后的下标依次是:1,2,3,4,5,6@H_403_4@
可变数组@H_403_4@
可变数组声明@H_403_4@
---@H_403_4@数组声明语法@H_403_4@---@H_403_4@@H_403_4@ type@H_403_4@ type_name @H_403_4@IS@H_403_4@ {@H_403_4@varray@H_403_4@|@H_403_4@varying@H_403_4@ @H_403_4@array@H_403_4@}(maxinum_size)@H_403_4@@H_403_4@ @H_403_4@OF@H_403_4@ element_type[@H_403_4@not@H_403_4@ @H_403_4@null@H_403_4@];@H_403_4@@H_403_4@ --type_name:@H_403_4@可变数组的类型名@H_403_4@@H_403_4@ --maxinum_size@H_403_4@:可变数组元素个数的最大值@H_403_4@@H_403_4@ --element_type:@H_403_4@数组元素的类型@H_403_4@@H_403_4@ ---@H_403_4@创建一个数组@H_403_4@---@H_403_4@@H_403_4@ --@H_403_4@包含星期数组@H_403_4@@H_403_4@ type@H_403_4@ Dates @H_403_4@IS@H_403_4@ @H_403_4@varray@H_403_4@(@H_403_4@7@H_403_4@) @H_403_4@OF@H_403_4@ @H_403_4@varchar2@H_403_4@(@H_403_4@10@H_403_4@);@H_403_4@@H_403_4@ --@H_403_4@包含月份数组@H_403_4@@H_403_4@ type@H_403_4@ @H_403_4@Months@H_403_4@ @H_403_4@IS@H_403_4@ @H_403_4@varray@H_403_4@(@H_403_4@12@H_403_4@) @H_403_4@OF@H_403_4@ @H_403_4@varchar2@H_403_4@(@H_403_4@10@H_403_4@);@H_403_4@@H_403_4@
---@H_403_4@数组的初始化@H_403_4@---@H_403_4@@H_403_4@ type@H_403_4@ Dates @H_403_4@IS@H_403_4@ @H_403_4@varray@H_403_4@(@H_403_4@7@H_403_4@) @H_403_4@OF@H_403_4@ @H_403_4@varchar2@H_403_4@(@H_403_4@10@H_403_4@);@H_403_4@@H_403_4@ v_Dates Dates:=Dates(@H_403_4@'Monday'@H_403_4@,@H_403_4@'Tuesday'@H_403_4@,@H_403_4@'Wednesday'@H_403_4@);@H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(v_Dates(@H_403_4@1@H_403_4@)); @H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(v_Dates(@H_403_4@2@H_403_4@)); @H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(v_Dates(@H_403_4@3@H_403_4@));@H_403_4@@H_403_4@ |
集合的属性和方法@H_403_4@
index-by表,嵌套表,可变数组是对象类型,本身具有属性和方法。@H_403_4@
1.count:返回集合中数组元素的个数@H_403_4@
2.delete:删除集合中一个或多个元素@H_403_4@
delete(x,y)—删除两个位置之间的元素@H_403_4@
3.extist:判断集合中元素是否存在@H_403_4@
extists(x)—判断x位置的元素是否存在@H_403_4@
extend把一个null元素添加到集合中@H_403_4@
extend(x)—将x个null元素添加到集合的末端@H_403_4@
extend(x,y)—将x个位于y的元素添加到集合的末端@H_403_4@
5.first和last:first返回集合的第一个元素位置,last返回集合的最后一个元素位置@H_403_4@
6.limit:返回集合中最大元素的个数,嵌套表没有上限,返回null@H_403_4@
7.next(x),prior(x):返回x处元素的前后的元素@H_403_4@
trim(x)—从几个末端删除x个元素,x小于集合的count总数@H_403_4@
type@H_403_4@ Dates @H_403_4@IS@H_403_4@ @H_403_4@varray@H_403_4@(@H_403_4@7@H_403_4@) @H_403_4@OF@H_403_4@ @H_403_4@varchar2@H_403_4@(@H_403_4@10@H_403_4@);@H_403_4@@H_403_4@ v_Dates Dates:=Dates(@H_403_4@'Monday'@H_403_4@,@H_403_4@'Wednesday'@H_403_4@);@H_403_4@@H_403_4@ DBMS_OUTPUT.put_line(v_Dates.Count);@H_403_4@@H_403_4@ |