oracle集合

ORACLE 的集合分为三类

1.index_by: 类似于 C 语言中的数组

  语法格式 :

  TYPE tabletype

IS

TABLE OF TYPE INDEX BY BINARU_INTEGER

说明 :

tabletype 表示所定义的新类型的类型名 ,type 是要定义的 index_by 表的类型 .

:

TYPE xs_name                 -- 类型名

IS

TABLE OF XS.XM%TYPE

INDEX BY BINARU_INTEGER;/*INDEX 的类型只能是 BINARU_INTEGER*/

v_name xs_name;                      -- 声明变量

在声明了类型和变量后 , 就可以用下列语句使用 index_by 表中的单个元素 .

v_name(index);

说明 :

index 是指表中第几个元素

注意 :

index 的数据类型属于 BINARU_INTEGER

1) 元素赋值

可以用下面的语句给表中的元素赋值

BEGIN

     v_name(1):=’qnma’;

     v_name(2):=’cjh’;

     v_name(-2):=’huiwen’;-- 合法

END;

注意 :

index_by 表中的元素不是按特定的顺序排序的 . 这与 C 语言不同 .index_by 表元素个数只受 BINARU_INTEGER 类型的限制 ,index 的范围是 -214483647~~+214483647.index 只要在此范围内就是合法的 .

2) 调用不存在的元素

调用任何元素前 , 必须首先给该元素赋值 . 如下所示 :

DECLARE

TYPE studytab

IS TABLE OF VARCHAR2(20) INDEX BY BINARU_INTEGER ;

v_studytab studytab ;

BEGIN

FOR v_count IN 1..5 LOOP

v_studytab(v_count):= v_count*10;

END LOOP;

FOR v_count IN 1..5 LOOP

DBMS_OUTPUT.PUT_LINE(v_studytab(v_count));

END LOOP;

END;

2. 嵌套表 : 嵌套表与 index_by 非常相似 , 唯一不同的就是没有 INDEX BY BINARU_INTEGER

  1) 嵌套表的初始化与 index_by 表完全不同 . 在声明了类型之后 , 再声明一个 index_by 表变量类型 . 如果没有给表赋值 , 那么此表就是一个空的 index_by. 但是以后可以往 index_by 表中加入元素 ; 而声明了嵌套表变量类型时 , 如果嵌套表中没有任何元素 , 那么它就会自动初始化为 NULL, 并且是只读的 . 如果还想往嵌套表里加入元素 , 系统就会报错 .

  :

DELARE

TYPE studytab

IS

TABLE OF VARCHAR(20);

v_studytab studytab:=studytab(‘Tom’,’jack’,’ROSE’);

BEGIN

FOR v_count IN 1..3 LOOP

DBMS_OUTPUT.PUT_LINE(v_studytab(v_count);

END LOOP;

END;

2) 元素序列 :index_by 表中的元素是无序的 , 而嵌套表中的元素是有序的 . 嵌套表元素的 index 是从 1 开始依次递增的 .

3. 可变数组

语法格式 :

DECLARE type_name

IS

VARRAY |VARRAY ARRAY

(maximun _size)OF element_type [NOT NULL]

说明 :

type_name 是可变数组的名称 ,maxmun_size 是指可变数组元素个数的最大值 .element_type 是数组元素的数据类型 .

可变数组的可变指的是定义了数组的最大上限后 , 数组元素的个数可以在这个最大上限内变化 , 但是不得超过最大上限 . 当数组元素的个数超过了最大上限后 , 系统就会报错 . 以下定义了一个可变数组 :

 

DECLARE

TYPE dates

IS VARCHAY(7) OF VARCHAR2(10);

TYPE months

IS VARRAY(12) OF VARCHAR2(10);               

与嵌套表一样 , 可变数组也需要初始化 . 初始化需要注意的是 : 赋值的数量必须保证不大于可变数组的最大上限 . 以下是完整实例 :

DECLARE

TYPE dates

IS VARCHAY(7) OF VARCHAR2(10);

TYPE months

IS VARRAY(12) OF VARCHAR2(10);

v_dates dates:=dates(‘Monday’,’Tuesday’,’Wednesday’) ;

BEGIN

  DBMS_OUTPUT.PUT_LINE(v_dates(1));

DBMS_OUTPUT.PUT_LINE(v_dates(2));

DBMS_OUTPUT.PUT_LINE(v_dates(3));

END;

 

有关集合中的方法 :

index_by, 嵌套表 , 可变数组本身都是对象 , 因此它们都有自己的属性和方法 . 集合的属性和方法的调用同其他对象调用一样 :Object.AttributeObject.Method.

下面是集合类常用的属性和方法 :

1.COUNT 属性 : 返回集合中的数组元素个数

DECLARE

TYPE name IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;

TYPE pwd IS TABLE OF VARCHAR2(20);

TYPE dates VARRAY(7) OF VARCHAR2(20);-- 容量为 7

v_name name;

v_pwd pwd:=pwd(‘10000’,’12345’,’22’,’yes’,’no’);

v_dates dates :=dates(‘Monday’,’Sunday’);

BEEGIN

v_name(1):=’Tom’;

v_name(-1):=’Jack;

v_name(4):=’Rose;

DBMS_OUTPUT.PUT_LINE(‘The index_by count is :’||v_name.count);

DBMS_OUTPUT.PUT_LINE(‘The nested count is :’||v_pwd.count);

DBMS_OUTPUT.PUT_LINE(‘The varray count is :’||v_dates.count);-- 返回的是可变数组的实际元素个数

END;

执行结果为 :

The index_by count is:3

The nested count is:5

The varray count is:2

2.DELETE 方法

DELETE 可以删除集合中的一个或多个元素 , 需要注意的是 , 由于 DELETE 方法执行的删除操作的大小固定 , 所以对于可变数组来说没有 DELETE 方法 .DELETE 方法有 3 种方式

1)DELETE : 不带参数的 DELETE 方法 , 表示将整个集合删除

2)DELETE(x): 将集合中第 x 个位置的元素删除 .index 起始位置从 1 开始 .

3)DELETE(x,y): 将集合中从第 x 个元素到第 y 个元素之间的所有元素删除 .

注意 : 执行 DELETE 方法后 , 集合的 COUNT 值将会立刻发生变化 , 而且当删除的元素不存在时 , 系统不会报错 , 而是跳过此元素 , 继续执行下一步操作 .

 

3.EXISTS 属性 : 用于判断集合中的元素是否存在 . 语法格式为 :

EXISTS(X)                   -- 判断位于 X 位置的元素是否存在 , 存在返回 TRUE, 否则返回 FALSE

注意 :

即使是该位置是 NULL, 也会返回 TRUE

4.EXTEND 方法 : 用于将元素加到集合的末端 . 具体有以下 3 种方式 :

1)EXTEND: 不带参数的 EXTEND 是将一个 NULL 元素加入到集合的末端

2)EXTEND(x):xNULL 元素加入到集合的末端

3)EXTEND(x,y):xy 的元素加入到集合到末端 .

注意 : 由于 index_by 表的随意性 , 因此 EXTEND 方法只针对嵌套表和可变数组有效 .

5.FIRSTLAST 属性 :FIRST 用来返回集合的第一个元素 ,LAST 用于返回集合中的最后一个元素 .

6.LIMIT:LIMIT 用来返回集合的最大元素个数 , 由于嵌套表没有有限 , 所以嵌套表使用 LIMIT, 总是返回 NULL

注意 :COUNT 是返回集合中的实际个数 ,LIMIT 是返回集合中的容量 .

7.NEXTPRIOR 属性 :

使用 NEXT,PRIOR, 它的后面都会跟一个参数

语法格式 :

NEXT(X): 表示的返回位置为 X 处的元素后面的那个元素 , 也就是返回位置为 X 的下一个元素

PRIOR(X): 同上一个相反 , 返回的是位置为 X 的前一个元素 .

通常使用 NEXTPRIORFIRSTLAST 一起使用 , 用来处理循环 .

:

DECLARE

TYPE pwd IS TABLE OF VARCHAR2(20);

v_pwd:=pwd(‘10000’,’12345’,’22’,’yes’,’no’,’ok’,’all’,’hello’,’right’,’left’,’football’);

v_count integer;

BEGIN

v_count:=v_pwd.FIRST;

WHILE v_count<=v_pwd.LAST LOOP

DBMS_OUTPUT.PUT_LINE(v_pwd(v_count));

v_count:=v_pwd.NEXT(v_count);

END LOOP;

LOOP;

执行结果为 :

10000

12345

22

yes

no

ok

all

hello

right

left

football

8.TRIM 方法 : 用于删除集合末端的元素 , 其具体形式如下

1)TRIM: 不带参数的 TRIM 从集合中末端删除一个元素

2)TRIM(X) 是从集合的末端删除 X 个元素 , 其中 X 要小于集合的 COUNT

注意 :EXTEND 一样 , 由于 index_by 表中元素的随意性 , 因此 TRIM 方法只对嵌套表和可变数组有效 .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值