`
log_cd
  • 浏览: 1089204 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

PL/SQL集合类型

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

    说明:从Oracle9i开始,索引表下标不仅允许使用数据类型BINARY_INTEGER、PLS_INTEGER,而且允许使用数据类型VARCHAR2。
    示例一:
declare
  type xm_table_type is table of drv_admin.drv_temp.xm%type
  index by binary_integer;
  xm_talbe xm_table_type;
begin
  select xm into xm_talbe(-1) from drv_admin.drv_temp
  where lsh='&lsh';
  dbms_output.put_line('姓名:'||xm_talbe(-1));
end;

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

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

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

2.在表列中使用嵌套表
  在表列中使用嵌套表类型,必须首先使用CREATE TYPE命令建立嵌套表类型。另外注意,必须要为嵌套表列指定专门的存储表。
  示例如下:
create type phone_type is table of varchar2(20);
/
create table employee(
  id number(4),name varchar2(10),sal number(6,2),phone phone_type
)nested table phone store as phone_table;


(1)在嵌套表中插入数据
  当定义嵌套表类型时,Oracle自动为该类型生成相应的构造方法。当为嵌套表列插入数据时,需要使用嵌套表的构造方法。
BEGIN
  INSERT INTO employee VALUES(1,'TOM',800,
    phone_type('028-90909800','13913001300')
  );
END;
/

(2)在嵌套表中检索数据
   需要定义嵌套表类型的变量接收其数据。
DECLARE
  phone_table phone_type;
BEGIN
  SELECT phone INTO phone_table
   FROM employee WHERE id=1;
  FOR i IN 1..phone_table.COUNT LOOP
   dbms_output.put_line('电话号码:'||phone_table(i));
  END LOOP;
END;

(3)在嵌套表中更新数据
  首先需要定义嵌套表变量,并使用构造方法初始化该变量,然后才可在执行部分使用UPDATE语句更新其数据。
DECLARE
  phone_table phone_type:=phone_type('028-10001000','139800900100');
BEGIN
  UPDATE employee SET phone=phone_table
    WHERE id=1;
END;
/

<三>、变长数组(VARRAY)
   可以作为表列的数据类型使用。其元素下标以1开始,并且元素的最大个数是有限制的。
   语法:
TYPE type_name IS VARRAY(size_limit) OF element_type [NOT NULL];
Identifier type_name;

   注意,当使用VARRAY元素时,必须要使用其构造方法初始化VARRAY元素。
1.在PL/SQL块中使用VARRAY
DECLARE
  TYPE xm_table_type IS VARRAY(20) OF drv_admin.drv_temp.xm%TYPE;
  xm_table xm_table_type:=xm_table_type(' ');
BEGIN
  SELECT xm INTO xm_table(1) FROM drv_admin.drv_temp
    WHERE lsh='&lsh';
  dbms_output.put_line('姓名:'||xm_table(1));
END;
/

2.在表列中使用VARRAY
CREATE TYPE phone_type IS VARRAY(20) OF VARCHAR2(20);
/
CREATE TABLE employee(
  id NUMBER(4), name VARCHAR2(10), sal NUMBER(6,2), phone phone_type
);

   注意,嵌套表列的元素个数没有限制,而VARRAY列的元素个数是有限制的。
<四>、PL/SQL记录表
  为了在PL/SQL块中处理多行多列数据,开发人员可以使用PL/SQL记录表。
DECLARE
  TYPE tmp_table_type IS TABLE OF drv_admin.drv_temp%ROWTYPE
    INDEX BY BINARY_INTEGER;
  
  tmp_table tmp_table_type;
BEGIN
  SELECT * INTO tmp_table(1) FROM drv_admin.drv_temp
    WHERE lsh='&lsh';
  dbms_output.put_line('姓名:'||tmp_table(1).xm);
  dbms_output.put_line('备注:'||tmp_table(1).bz);
END;
/

<五>、集合方法
   语法:
collection_name.method_name[(parameters)]

   注意,集合方法只能在PL/SQL语句中使用,而不能在SQL语句中调用。另外集全方法EXTEND和TRIM只适用于嵌套表和VARRAY,而不适用于索引表。
1.EXISTS:确定集合元素是否存在。
IF xm_table.EXISTS(1) THEN
   xm_table(1):='Tom';
ELSE
   dbms_output.put_line('必须初始化集合元素');
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之间的所有元素。
分享到:
评论
3 楼 log_cd 2010-08-21  
   PL/SQL表只有两列,其中第一列为索引列为Integer类型索引列,9i后可以支持字符索引。第二列为用户自定义列,声明用户可用列类型。
   通过索引列中的索引值来操作PL/SQL表中对应的用户自定义列。类似于键值对。确保索引值的唯一性。如果索引值重复不会报错,会覆盖前面的值。
    记录(Record)的单行多列和物理存储数据的表。
2 楼 nwpu053871 2010-08-20  
索引表和PL/SQL记录表有区别吗?
1 楼 nwpu053871 2010-08-20  
总结的很好很详细!

相关推荐

    PL/SQL 用户指南与参考

    第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包 第十章 PL/SQL对象类型 第十一章 本地动态SQL 第十二章 PL/SQL应用程序性能调优

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    精通Oracle 10g SQL和PL/SQL

    集合类型 对象类型等  本书不仅适合于pl/sql初学者 而且也适合于有经验的pl/sql编程人员 本书还可以作为oracle应用开发培训班的教材或者辅助材料 "&gt;sql是关系数据库的基本操作语言 它是应用程序与数据库进行交互...

    PL/SQL Developer 6.05注册版-1

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    PL/SQL Developer 7.1.5 注册版-3

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    PL/SQL经典介绍

    第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 PL-SQL子程序 第十章 PL-SQL包 第十一章 PL-SQL对象类型 第十二章 本地动态SQL 第十三章 PL...

    精通Oracle 10g PL/SQL编程

    通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的...pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...

    Oracle PL/SQL程序设计(第5版)(下册) 第一部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的...PL/SQL的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...

    Oracle PL/SQL语言初级教程

    PL/SQL集合 23 嵌套表 24 使用集合 25 集合的方法 28 关于集合之间的比较 29 3.PL/SQL单行函数和组函数详解 29 单行字符串函数 30 单行转换函数 37 SQL中的组函数 40 嵌套函数 42 4.Oracle数据库数据对象分析(上)...

    PL/SQL Developer

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    pl/sql developer 9 + 注册机

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的...pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...

    PL-SQL用户指南与参考

    · 第五章 PL/SQL集合与记录(2) 2008-04-08 · 第五章 PL/SQL集合与记录(1) 2008-04-08 · 第四章 PL/SQL的控制结构 2008-04-08 · 第三章 PL/SQL数据类型 2008-04-08 · 第二章 PL/SQL基础 2008-04...

    PL/SQL Developer8.04官网程序_keygen_汉化

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

    PL/SQL Developer v8.0.zip

    PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...

Global site tag (gtag.js) - Google Analytics