本站不再更新,欢迎光临 java开发技术网
随笔-230  评论-230  文章-8  trackbacks-0
Oracle 9i支持三种集合数据类型:index-by 表,Varrays(可变数组)和嵌套表

Varrays 由其元素的最大数目限定的单维有限数组,可以改变varrays数组的上界.可以使用varrays按一定顺序存储固定数目的元素.元素插入到Varrays数组时,是从位置1开始的,可以一直增加到数组长度的上限,varrays元素的最大数目为2G

1、定义VARRAY类型
      Type  type_name is {varray|varraying array}(max size) of data_type [not null]

下面是一个定义例子:
type num_varray is varray(5) if number;
在指定data_type时,以专守以下规则: 
    可以使用%TYPE和%ROWTYPE
    data_type不能是BOOLEAN、NCHAR、NVARCHAR2、REF CURSOR、NCLOB类型

下面是一个可变数组的例程
procedure varrays_demo
is
 num_varray  num_varray_type;
begin
 num_varray:
=num_varray_type(1,2,3,4,5,6,7,8,9,10);
 dbms_output.put_line(num_varray(
1));
 
for idx in 1..10 loop
     dbms_output.put_line(num_varray(idx));
 
end loop;
 
 
if num_varray is null then
    dbms_output.put_line(
'num_varray is null');
 
else
    dbms_output.put_line(
'num_varray is  not null');
 
end if;
end varrays_demo;
end test;

嵌套表
        嵌套表是数据元素可以无限大而且无序的一个一维数据,所有元素的数据类型都相同。除了定义它时不能使用index by binary_integer子句外,与index-by表非常相似,嵌套表数组中没有最大数目限制。(实际上也是一个一维数组)。
1、定义TABLE类型
     其语法如下
      type table_name is table of data_type [not null]
      如:
      type num_table is table of number
     该语句声明了一个元素数目无限大的数字型嵌套表
      定义data_type时,要专守以下规划:
      A、可以使用%TYPE和%ROWTYPE
      B、可以是另一个oracle 9i的varray或table类型
      C、不能是BOOLEAN、NCHAR、NVARCHAR2、NCLOB、REF CURSOR类型,下面是一个例程:

procedure table_demo
is 
   type num_table 
is table of number;
   v_numtable num_table;
   vcount 
number;
begin
   
if v_numtable is null then
      dbms_output.put_line(
'v_numtable is null');
   
end if ;
   v_numtable :
=num_table(); --不带参数构造一个空表
   if v_numtable is null then
      dbms_output.put_line(
'构造一个空v_numtable is null');
   
else 
      dbms_output.put_line(
'构造一个空表时,v_numtable 不等于null');
   
end if ;
  
-- if v_numtable(1) is null then  --这样的话,编译虽通过,执行时出错
  --    dbms_output.put_line('a');
  --end if;
   v_numtable:=num_table(1,2,50,20);
   vcount:
=v_numtable.count();
   
for idx in 1..vcount loop
       dbms_output.put_line(v_numtable(idx));
   
end loop;
end table_demo;
end test;

集合方法
pl/sql预定义了在varray 和嵌套表实例上进行调用的方法。这些方法能在集合上执行一定的功能。

EXISTS

该函数返回集合中第一个元素的索引,如果集合为空,返回NULL

Collection.EXISTS(index)

COUNT

该函数集合元素的数目

Collection.COUNT

DELETE

该过程从嵌套表中删除一个或多个或合部元素

Table_name.DELETE 删除所有元素

Table_name.delete(index)删除指定索引的记录

Table_name.delete(start_index,end_index)删除区间内元素

FIRST

返回集合第一个元素索引,如果集合为空,返回NULL

Collection.FIRST

LAST

返回集合中最后一个元素索引,如果集合为空,返回NULL

Collection. LAST

NEXT

返回集合当前元素的下一个元素的索引,如果它不存在就返回NULL

Collection. NEXT

PRIOR

返回集合当前元素的上一个元素的索引,如果它不存在就返回NULL

Collection. PRIOR

LIMIT

返回varray中创建元素的最大个数

Collection. LIMIT

EXTENDS

该过程在集合的末尾添加新的元素

Collection.EXTEND添加一个NULL元素;Collection.extends(n)添加NNULL元素,Collection.extend(n,index)添加由index指定位置上元素的n个副表

TRIM

从集合末尾处删除元素

Collection.TRIM 删除最后一个元素

Collection.TRIM(n)删除最后N个元素

 

数据加中的集合
与index-by表不同,varray和嵌套表可以作为对象-关系表中的珍存储在数据库中。它们也可以作为对象关系表中的列使用。为了表示出作为数据库列的数据类型,集合类型必须是在pl/sql和sql中可见。这需要使用create or replace type 语句定义而不能仅在pl/sql块中进行局部定义。语法如下:
create of  replace type table_name is table of data_type

     
posted on 2007-01-22 14:34 有猫相伴的日子 阅读(1081) 评论(1)  编辑  收藏 所属分类: pl/sql

评论:
# 有个问题请教 2007-04-26 13:37 | s
有个问题请教你,给集合附值(添加元素),可以是相同的值吗?按照集合的定义,应该是不同的,但是我在尝试的时候发现可以是相同的,怎么办?
请给我一些帮助,我的邮箱:heyan.zjsx@gmail.com,谢谢。
create or replace procedure test
is
type Jh is
varray(15) of number;

Ac jh:=Jh(1,2,3,4,5,6,7,8,9,10,11,12,13,14,14);
i number;
begin
for i in 1..15 loop
ac(i):=111;
end loop;

dbms_output.put_line('共有:'||ac.count);
dbms_output.put_line(ac.first);
dbms_output.put_line('第二个元素:'||ac.next(ac.first));

end test;
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
本站不再更新,欢迎光临 java开发技术网