http://log-cd.iteye.com/blog/521177

PL/SQL集合类型是类似于高级语言数组的一种复合数据类型,集合类型包括索引表(PL/SQL表)、嵌套表(Nested Table)和变长数组(VARRAY)三种类型。
<一>、索引表
    索引表也称为PL/SQL表,它是Oracle早期版本用于处理PL/SQL数组的数据类型。索引表的元素个数没有限制,并且下标可以为负值。注意,索引表只能作为PL/SQL复合数据类型使用,而不能作为表列的数据类型使用。
    语法:

Sql代码 

  1. TYPE type_name IS TABLE OF element_type
  2. [NOT NULL] INDEX BY key_type;
  3. identifier type_name;

说明:从Oracle9i开始,索引表下标不仅允许使用数据类型BINARY_INTEGER、PLS_INTEGER,而且允许使用数据类型VARCHAR2。
    示例一:

Sql代码 

  1. declare
  2. type xm_table_type is table of drv_admin.drv_temp.xm%type
  3. index by binary_integer;
  4. xm_talbe xm_table_type;
  5. begin
  6. select xm into xm_talbe(-1) from drv_admin.drv_temp
  7. where lsh='&lsh';
  8. dbms_output.put_line('姓名:'||xm_talbe(-1));
  9. end;

示例二:

Sql代码 

  1. declare
  2. type area_table_type is table of number
  3. index by varchar2(10);
  4. area_table area_table_type;
  5. begin
  6. area_table('北京'):=1;
  7. area_table('上海'):=2;
  8. area_table('天津'):=3;
  9. dbms_output.put_line('第一个元素:'||area_table.first);--第一个元素下标
  10. dbms_output.put_line('最后一个元素:'||area_table.last);--最后一个元素下标
  11. end;

<二>、嵌套表
   嵌套表的元素下标从1开始,并且元素个数没有限制。嵌套表数组元素值可以是稀疏的。
   注意:索引表类型不能作为表列的数据类型使用,但嵌套表类型可以作为表列的数据类型。
   语法:

Sql代码 

  1. type type_name is table of element_type;
  2. identifier type_name;

1.在PL/SQL块中使用嵌套表

Sql代码 

  1. declare
  2. type xm_table_type is table of drv_admin.drv_temp.xm%type;
  3. xm_table xm_table_type;
  4. begin
  5. xm_table:=xm_table_type(' ',' ',' ');--这里必须使用构造方法初始化嵌套表变量。
  6. select xm into xm_table(2) from drv_admin.drv_temp
  7. where lsh='&lsh';
  8. dbms_output.put_line('姓名:'||xm_table(2));
  9. end;

2.在表列中使用嵌套表
  在表列中使用嵌套表类型,必须首先使用CREATE TYPE命令建立嵌套表类型。另外注意,必须要为嵌套表列指定专门的存储表。
  示例如下:

Sql代码 

  1. create type phone_type is table of varchar2(20);
  2. /
  3. create table employee(
  4. id number(4),name varchar2(10),sal number(6,2),phone phone_type
  5. )nested table phone store as phone_table;

(1)在嵌套表中插入数据
  当定义嵌套表类型时,Oracle自动为该类型生成相应的构造方法。当为嵌套表列插入数据时,需要使用嵌套表的构造方法。

Sql代码 

  1. BEGIN
  2. INSERT INTO employee VALUES(1,'TOM',800,
  3. phone_type('028-90909800','13913001300')
  4. );
  5. END;
  6. /

(2)在嵌套表中检索数据
   需要定义嵌套表类型的变量接收其数据。

Sql代码 

  1. DECLARE
  2. phone_table phone_type;
  3. BEGIN
  4. SELECT phone INTO phone_table
  5. FROM employee WHERE id=1;
  6. FOR i IN 1..phone_table.COUNT LOOP
  7. dbms_output.put_line('电话号码:'||phone_table(i));
  8. END LOOP;
  9. END;

(3)在嵌套表中更新数据
  首先需要定义嵌套表变量,并使用构造方法初始化该变量,然后才可在执行部分使用UPDATE语句更新其数据。

Sql代码 

  1. DECLARE
  2. phone_table phone_type:=phone_type('028-10001000','139800900100');
  3. BEGIN
  4. UPDATE employee SET phone=phone_table
  5. WHERE id=1;
  6. END;
  7. /

<三>、变长数组(VARRAY)
   可以作为表列的数据类型使用。其元素下标以1开始,并且元素的最大个数是有限制的。
   语法:

Sql代码 

  1. TYPE type_name IS VARRAY(size_limit) OF element_type [NOT NULL];
  2. Identifier type_name;

注意,当使用VARRAY元素时,必须要使用其构造方法初始化VARRAY元素。
1.在PL/SQL块中使用VARRAY

Sql代码 

  1. DECLARE
  2. TYPE xm_table_type IS VARRAY(20) OF drv_admin.drv_temp.xm%TYPE;
  3. xm_table xm_table_type:=xm_table_type(' ');
  4. BEGIN
  5. SELECT xm INTO xm_table(1) FROM drv_admin.drv_temp
  6. WHERE lsh='&lsh';
  7. dbms_output.put_line('姓名:'||xm_table(1));
  8. END;
  9. /

2.在表列中使用VARRAY

Sql代码 

  1. CREATE TYPE phone_type IS VARRAY(20) OF VARCHAR2(20);
  2. /
  3. CREATE TABLE employee(
  4. id NUMBER(4), name VARCHAR2(10), sal NUMBER(6,2), phone phone_type
  5. );

注意,嵌套表列的元素个数没有限制,而VARRAY列的元素个数是有限制的。
<四>、PL/SQL记录表
  为了在PL/SQL块中处理多行多列数据,开发人员可以使用PL/SQL记录表。

Sql代码 

  1. DECLARE
  2. TYPE tmp_table_type IS TABLE OF drv_admin.drv_temp%ROWTYPE
  3. INDEX BY BINARY_INTEGER;
  4. tmp_table tmp_table_type;
  5. BEGIN
  6. SELECT * INTO tmp_table(1) FROM drv_admin.drv_temp
  7. WHERE lsh='&lsh';
  8. dbms_output.put_line('姓名:'||tmp_table(1).xm);
  9. dbms_output.put_line('备注:'||tmp_table(1).bz);
  10. END;
  11. /

<五>、集合方法
   语法:

Sql代码 

  1. collection_name.method_name[(parameters)]

注意,集合方法只能在PL/SQL语句中使用,而不能在SQL语句中调用。另外集全方法EXTEND和TRIM只适用于嵌套表和VARRAY,而不适用于索引表。
1.EXISTS:确定集合元素是否存在。

Sql代码 

  1. IF xm_table.EXISTS(1) THEN
  2. xm_table(1):='Tom';
  3. ELSE
  4. dbms_output.put_line('必须初始化集合元素');
  5. END IF;

2.COUNT:返回当前集合变量中的无素总个数。
3.LIMIT:返回集合元素的最大个数。VARRAY返回所允许的最大元素个数,其它返回NULL。
4.FIRST和LAST:返回集合变量第一个和最后一个元素的下标。
5.PRIOR和NEXT:返回当前元素的前一个和后一下元素下标。
6.EXTEND
  用于扩展集合变量的尺寸,并为它们增加元素。注意,该方法只适用于嵌套表和VARRAY。EXTEND用于为集合变量添加一个null元素,EXTEND(n)用于为集合变量添加n个null元素,EXTEND(N,I)用于为集合变量添加n个元素(元素值与第i个元素相同)。
7.TRIM
  用于从集合尾部删除元素,它有TRIM和TRIM(n)两种调用格式。TRIM用于从集合尾部删除一个元素;TRIM(n)则用于从集合尾部删除n个元素。注意,该方法只适用于嵌套格和VARRAY。
8.DELETE
  用于删除元素,但该方法只适用于嵌套格和索引表,而不适用于VARRAY。DELETE用于删除集合变量的所有元素;DELETE(n)用于删除集合变量的第n个元素;而DELETE(m,n)则用于删除集合变量中从m到n之间的所有元素。

本文转自hcy's workbench博客园博客,原文链接:http://www.cnblogs.com/alterhu/archive/2012/03/22/2411821.html,如需转载请自行联系原作者。

PL/SQL集合类型的整理学习相关推荐

  1. 第十章 PL/SQL对象类型

    第十章 PL/SQL对象类型 一.抽象的角色 抽象是对一个真实世界实体的高级描述或建模.它能排除掉无关的细节内容,使我们的日常生活更有条理.例如,驾驶一辆汽车时,我们是不需要知道它的发 动机是如何工作 ...

  2. 第十章 PL/SQL对象类型 ( 1 )

    第十章 PL/SQL对象类型 一.抽象的角色 抽象是对一个真实世界实体的高级描述或建模.它能排除掉无关的细节内容,使我们的日常生活更有条理.例如,驾驶一辆汽车时,我们是不需要知道它的发动机是如何工作的 ...

  3. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  4. pl/sql 中关于exception的学习笔记

    1.异常的优点 如果没有异常,在程序中,应当检查每个命令的成功还是失败,如 BEGIN SELECT ... -- check for 'no data found' error SELECT ... ...

  5. 《Oracle PL/SQL实例精讲》学习笔记1——数据准备

    前言: 古人言,"业精于勤荒于嬉,行成于思毁于随".对于自己所从事的工作,若使理论知识和实践经验相辅相成,则可使自己的业务能力日益增长,事半功倍.反之,亦然. 前几天,接到一个需求 ...

  6. PL/SQL第三课(学习笔记)

    TRIGGER触发器 1.TRIGGER与过程/函数类似     都是带有名字的执行块     都有声明,执行体和异常处理部分 2.TRIGGER与过程/函数的差别     TRIGGER必须存储在数 ...

  7. PL/SQL三种集合类型的比较

    PL/SQL三种集合类型的比较<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  8. Oracle PL/SQL存储过程对象类型Object type详解 create type obj_type as object, create table tab_name of obj_type

    原 oracle 对象类型 object type 置顶 2011年06月13日 18:00:00 oypj2010 阅读数:3453 /* 对象类型属于用户自定义的一种复合类型,它封装了数据结构和拥 ...

  9. PL/SQL详细介绍

    PL/SQL笔记 PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DD ...

最新文章

  1. mp4格式解析、分割
  2. 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )
  3. Python3 打印九九乘法表
  4. python3--htmltestrunner 日志显示_实时日志:Serverless Python 运行时支持日志实时输出...
  5. JAVA——Unicode编码格式工具类
  6. 作业1#python用列表实现多用户登录,并有三次机会
  7. 【HYSBZ - 1088 】扫雷Mine (简单dp)
  8. 代码合并工具_分享几款比较常用的代码比较工具
  9. T-SQL查询-逻辑查询处理
  10. O2O、C2C、B2B、B2C的区别
  11. feign使用_【微服务】165:Feign的最佳使用方式
  12. MyEclipse使用经验归纳
  13. 在 Android 中调用二进制可执行程序(native executable )
  14. copy constructor和copy assignment operator的区别
  15. 浅谈地下污水处理厂电气特点和能效管理系统的实际应用
  16. iPhone之手势切换图片
  17. 【微信小程序】video视频组件问题
  18. 强智教务php,强智科技教务处模拟登录
  19. 人工智能传奇——关于AI起源与发展的故事
  20. 计算机社团活动效果取得成绩,电脑社团工作总结

热门文章

  1. SQL Date 函数
  2. This is A PostXing Test
  3. Varnish Cache 3.0.0安装
  4. FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(新接口)
  5. 如何发布ActiveX 控件
  6. 【SQL】sql语句LEFT JOIN(拼接表)详解
  7. 【Qt】通过QtCreator源码学习Qt(二):跨平台编程
  8. python数据库gui_从python数据库在gui上打印数据
  9. 计算机网络Rip例题,计算机网络技术习题
  10. π型滤波频率计算_滤波电路的总结