`
Copperfield
  • 浏览: 261017 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25213
社区版块
存档分类

PL/SQL -复合数据类型

SQL 
阅读更多
复合类型 复合类型可以存储多个值,包括记录和集合。集合是一维的,但是可以在集合中放入其它集合,变成多维集合。集合又分为索引表、嵌套表和变长数组三种。要使用集合,我们首先要创建集合类型,然后声明该类型的变量。我们可以在任何PL/SQL块、子程序或包的声明部分使用TABLE和VARRAY关键字来声明集合类型。集合的作用域和同其他类型变量一样,在一个块或子程序中,当程序进入块或子程序时有效,退出时失效。在包中,集合在我们第一次引用包的时候有效,直至会话终止时才失效。
一、记录   
记录可以包括多个成员,从而可以保存多个值。记录中的成员的数据类型可以不同。记录在使用时必须先声明记录类型,然后定义记录变量,最后才能在PL/SQL中使用。
实例1:
DECLARE
TYPE MyRecord IS RECORD(
  no    NUMBER(2),
  name  VARCHAR2(14),
  city  scott.dept.loc%TYPE
);
deptRecord MyRecord ;
BEGIN
--SELECT 语句后列的数目与记录中的变量数目相同
SELECT deptno,dname,loc into deptRecord FROM DEPT WHERE DEPTNO=30;
DBMS_OUTPUT.PUT_LINE(deptRecord.no||':'||deptRecord.name||':'||deptRecord.city);
END;
示例2:
DECLARE
--特殊定义记录方式,记录中变量的类型与dept表行的类型相同
deptRecord dept%ROWTYPE;
BEGIN
SELECT * INTO deptRecord FROM DEPT WHERE DEPTNO=30;
DBMS_OUTPUT.PUT_LINE(deptRecord.deptNo||':'||deptRecord.dname||':'||deptRecord.loc);
END;
二、索引表(关联数组)
索引表就是键值集合,键是唯一的,用于查找对应的值。键可以是整数或字符串。第一次使用键来指派一个对应的值就是添加元素,而后续这样的操作就是更新元素。
DECLARE
TYPE MyTableTypeName IS TABLE OF ElementType [NOT NULL]
INDEX BY Key_Type;
myName MyTableTypeName;
其中:MyTableTypeName是表类型的名称,ElementType是元素的数据类型,NOT NULL表示不允许引用NULL值,Key_Type是下标的数据类型,BINARY_INTEGER PLS_INTEGER或VARCHAR2(Oracle9i及以后版本可用)。myName是表类型变量名。
示例1
DECLARE
TYPE MyTabelType IS TABLE OF dept.dname%TYPE
NOT NULL INDEX BY BINARY_INTEGER;
my MyTabelType;
BEGIN
SELECT DNAME INTO my(-3) FROM DEPT WHERE  deptno=20;
SELECT DNAME INTO my(-1) FROM DEPT WHERE  deptno=40;
DBMS_OUTPUT.PUT_LINE('my(-3):'||my(-3));
DBMS_OUTPUT.PUT_LINE('my(-1):'||my(-1));
END;
示例2:
DECLARE
TYPE MyTableType IS TABLE OF NUMBER
NOT NULL INDEX BY VARCHAR2(20);
my MyTableType;
BEGIN
  my('China'):=1;
  my('Japan'):=2;
  my('USA'):=3;
  DBMS_OUTPUT.PUT_LINE(my.first);
  DBMS_OUTPUT.PUT_LINE(my.last);
  DBMS_OUTPUT.PUT_LINE(my('China'));
 DBMS_OUTPUT.PUT_LINE(my(my.last));
END;
三、嵌套表
   要使用嵌套表,首先要创建嵌套表类型,其次声明嵌套表类型变量,然后初始化嵌套表变量,最后引用嵌套表变量元素值。
1、定义嵌套表类型  
TYPE MyNestedTableType IS TABLE OF ElementType [NOT NULL];
MyNestedTableType是嵌套表类型的名称。ElementType是嵌套表元素的类型,它是可以除了REF CURSOR类型之外的任何PL/SQL类型,但是对于全局嵌套表(CREATE TYPE创建)来说,以下类型也是不允许的:BINARY_INTEGER  PLS_INTEGER  BOOLEAN  LONG  LONG RAW  NATURAL   NATURALN POSITIVE  POSITIVEN  REF CURSOR  SIGNTYPE  STRING 。NOT NULL表示元素值不能为NULL。
示例:
DECLARE
--定义记录
TYPE DeptRecord IS RECORD(
  no    NUMBER(2),
  name  VARCHAR2(14),
  city  scott.dept.loc%TYPE
);
--定义游标
CURSOR  DeptCursor IS SELECT * FROM DEPT;
--定义嵌套表元素类型时使用%TYPE
TYPE DNameList IS TABLE OF dept.dname%TYPE;
--定义嵌套表元素类型时使用表的%ROWTYPE
TYPE DeptList1  IS TABLE OF DEPT%ROWTYPE;
--定义嵌套表元素类型时使用游标的%ROWTYPE
TYPE DeptList2  IS TABLE OF DeptCursor%ROWTYPE;
--定义嵌套表元素类型时使用记录类型
TYPE DeptList3  IS TABLE OF DeptRecord ;
--在SQL语句中定义嵌套表类型
CREATE TYPE PhoneList IS TABLE OF VARCHAR2(10);
2、声明嵌套表类型变量
示例:
DECLARE
TYPE DNameList IS TABLE OF dept.dname%TYPE;
nameList1 DNameList; 
nameList2 nameList1%TYPE;   --使用%TYPE声明嵌套表类型变量
--在存储过程参数中定义嵌套表类型变量
CREATE OR REPLACE PROCEDURE proc_name(nameList  IN DNameList)
注意:不能将嵌套表类型和嵌套表类型变量同名,大小写不同也不可,因PL/SQL不区分大小写
3、初始化嵌套表类型变量
嵌套表必须先通过构造方法初始化(索引表不需要通过构造方法进行初始化),否则嵌套表变量为NULL,在初始化中元素个数没有限制。
示例:
DECLARE
TYPE DNameList IS TABLE OF dept.dname%TYPE;
my DNameList ;
BEGIN
my:=DNameList('CORESUN','CORESUN','CORESUN'); 
注意:my变量在初始化时传入了3个参数,那么嵌套表长度就是3,以后使用时长度不够,必须通过extend函数进行扩展长度。如果在构造方法中没有传入任何参数,则嵌套表长度为0。也可以在声明声明嵌套表类型变量的同时进行初始化,如:
my DNameList:=DNameList('CORESUN','CORESUN','CORESUN');
如果定义元素类型时没有指定NOT NULL,在构造方法中也可以传入NULL,如:
my:=DNameList('CORESUN',NULL,'CORESUN');
4、引用嵌套表类型变量
通过嵌套表变量和圆括号里的索引值来引用嵌套表中的元素,嵌套表的下标是从1开始编号,最大至231 ,下标可以是一个整数,也可以是整数表达式。
四、嵌套表应用示例
示例1:创建记录类型的嵌套表
DECLARE
TYPE DeptRecord IS RECORD(
  no    NUMBER(2),
  name  VARCHAR2(14),
  city  scott.dept.loc%TYPE
);
TYPE DeptRecordList IS TABLE OF DeptRecord;
示例2:嵌套表用在另一个表的内部
1、创建全局嵌套表类型
--当嵌套表作为表列的类型时,要先创建,这样的嵌套表我们称为全局嵌套表
CREATE OR REPLACE TYPE PHONE_TYPE IS TABLE OF VARCHAR2(20);
/
CREATE TABLE person
(
  id NUMBER,
  name VARCHAR2(10),
  sal NUMBER(6,2),
  phone PHONE_TYPE
) NESTED TABLE phone STORE AS PHONE_TABLE;
2、向person表插入数据:
INSERT INTO person VALUES(1,'SCOTT',800,PHONE_TYPE('13256789876','031198765432'));
INSERT INTO PERSON VALUES(20,'CORESUN',2000,PHONE_TYPE('13999999999','13098765345','01064890987'));
3、查询嵌套表列的数据:
示例:
DECLARE
TYPE DNameList IS TABLE OF dept.dname%TYPE;
my DNameList ;
BEGIN
my:=DNameList(NULL,'CORESUN','CORESUN'); 
SELECT DNAME INTO my(2) FROM dept where deptno=20;
my(1):='CORESUN';
--my(4):='CORESUN';
DBMS_OUTPUT.PUT_LINE(my(1));
DBMS_OUTPUT.PUT_LINE(my(2));
END;
  查询全部的列信息
SELECT * FROM PERSON;
  在isql*plus中结果如下:

  通过嵌套表变量显示信息
DECLARE
pTable PHONE_TYPE;
BEGIN
SELECT phone into pTable FROM person WHERE name='SCOTT';
FOR   i   IN 1..pTable.COUNT LOOP
  DBMS_OUTPUT.PUT_LINE('号码'||i||':'||pTable(i));
END LOOP;
  结果如下:
  号码1:13256789876
  号码2:031198765432
  4、更新嵌套表数据:
DECLARE
pTable PHONE_TYPE:=PHONE_TYPE('034223455432','13888888888');
BEGIN
UPDATE person SET phone=pTable WHERE name='SCOTT';
END;
  四、可变数组(VARRAY数组)
VARRAY数组是一种集合数据类型,也可以作为表的列来使用,该集合的下标从1开始,并且元素个数是有限制的。语法如下:
DECLARE
TYPE MyArrayTypeName IS VARRAY(size) OF ELEMENT_TYPE [NOT NULL];
my MyArrayTypeName
  其中MyArrayTypeName 是数组类型的名字,size表示数组最多存储多少个元素,ELEMENT_TYPE是元素的类型,NOT NULL不允许使用NULL值,my是数组变量的名称。
  示例1:
DECLARE
TYPE MyVArrayType IS VARRAY(10) OF dept.dname%TYPE NOT NULL;
  --构造方法中最多可以有10(size)个元素
  --既是没有定义NOT NULL,也不会自动为4-10元素赋NULL值
nameArray MyVArrayType:=MyVArrayType('1','2','3');
BEGIN
SELECT dname into nameArray(1) from dept where deptno=20;
SELECT dname into nameArray(2) from dept where deptno=30;
DBMS_OUTPUT.PUT_LINE(nameArray(1));
DBMS_OUTPUT.PUT_LINE(nameArray(2));
DBMS_OUTPUT.PUT_LINE(nameArray(3));
END;
  结果如下: RESEARCH
SALES
3



分享到:
评论

相关推荐

    pl/sql最新中文手册

    6. **复合类型**:PL/SQL支持数组、集合和记录等复合类型,这些使得处理复杂数据结构变得可能。手册会详细介绍这些类型的创建和使用。 7. **包(Packages)**:包是将相关的过程、函数和变量封装在一起的一种方式,...

    Oracle资料学习PL/SQL必备

    2. **数据类型**:PL/SQL支持多种数据类型,包括数值类型(如NUMBER)、字符串类型(如VARCHAR2、CHAR)、日期时间类型(如DATE)、布尔类型(BOOLEAN)以及复合数据类型(如记录和数组)。 3. **变量声明和赋值**...

    Oracle PL/SQL实战(待续)

    同时,PL/SQL支持多种数据类型,包括数值类型(NUMBER)、字符类型(VARCHAR2, CHAR)、日期类型(DATE)等,以及复合类型如记录(RECORD)和表类型(TABLE)。 此外,PL/SQL的包(PACKAGE)概念是将相关的过程和...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    2. **复合数据类型**:介绍PL/TABLE、记录类型(%ROWTYPE)以及集合类型(VARRAY和NESTED TABLE),这些都是处理大量数据或构建复杂数据结构的关键工具。 3. **游标**:讲解如何使用显式和隐式游标进行查询和遍历...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    2. **变量和数据类型**:PL/SQL支持多种数据类型,包括数值型(NUMBER、BINARY_INTEGER、PLS_INTEGER)、字符型(VARCHAR2、CHAR)、日期型(DATE)、布尔型(BOOLEAN)以及复合数据类型如记录和数组。 3. **控制...

    pl/sql 学习资料

    4. **复合数据类型**: - 数组:声明和操作PL/SQL索引数组和关联数组。 - 表类型:使用PL/SQL表类型进行集合操作。 -记录类型:定义和使用记录类型,类似于结构或对象。 5. **程序单元**: - 包(PACKAGE):...

    最容易上手的PL/SQL学习教程-有经过测试的丰富案例

    我们学习了PL/SQL的变量类型,包括基本类型(如NUMBER、VARCHAR2等)、复合类型(如记录类型、数组类型)、%ROWTYPE(用于创建与表列结构对应的变量)以及LOB(Large Object)类型,后者用于存储大量非结构化数据,...

    oracle_oracle_oraclepl/sql_

    2. **变量和数据类型**:PL/SQL支持多种数据类型,包括数值型(如NUMBER)、字符型(VARCHAR2和CHAR)、日期型(DATE)、布尔型(BOOLEAN)以及复合和对象类型。 3. **流程控制**:PL/SQL提供了IF-THEN-ELSIF-ELSE...

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

    探讨了数据类型、条件控制语句和顺序控制语句、循环、异常处理、安全特性、全球化和本地化问题, 以及PL/SQL架构。 ? 通过使用过程、函数、触发器和包,建立模块化的PL/SQL应用。 内容推荐 《Oracle PL/SQL程序...

    PL/SQL免安装版

    6. **变量和类型**:PL/SQL有丰富的内置数据类型,如NUMBER、VARCHAR2、DATE等,同时允许用户自定义复合类型,如记录和表类型。 7. **包(PACKAGE)**:包是将相关的过程、函数和类型组织在一起的命名空间,有助于...

    PL/SQL学习笔记

    在PL/SQL中,数据类型分为标量类型、复合类型、参考类型和LOB类型。标量类型包括数字类型、字符类型、日期类型和布尔类型等。复合类型包括记录类型和集合类型,其中集合类型又包括数组和表。参考类型是记录的引用,...

    pl/sql精通

    2. 数据类型:PL/SQL支持多种数据类型,包括数值类型(如NUMBER、INTEGER)、字符类型(VARCHAR2、CHAR)、日期时间类型(DATE)、布尔类型(BOOLEAN)、以及复合和引用类型(如记录、表类型、指针等)。 3. 变量与...

    PL/SQL学习课件

    这些复合数据类型使得存储和处理复杂数据结构成为可能,对于提高代码效率和灵活性有很大帮助。 第五章“游标”讨论了如何在PL/SQL中使用游标来遍历查询结果集,这在处理多行数据时非常有用,尤其是在进行迭代或逐行...

    Oracle PL/SQL编程及最佳实践

    PL/SQL 提供了多种数据类型,例如数字、字符、日期等。数字类型包括整数、浮点数等。字符类型包括字符、字符串等。日期类型包括日期、时间等。 十、基本类型(系统预定义类型) PL/SQL 提供了多种基本类型,例如...

    PL/SQL学习资料

    1. **变量和数据类型**:在PL/SQL中,我们有多种数据类型,包括数值型(NUMBER、BINARY_INTEGER、INTEGER)、字符型(VARCHAR2、CHAR)、日期型(DATE)、布尔型(BOOLEAN)等,以及PL/SQL特有的对象类型和复合类型...

    PL/SQL简介-快速入门

    建表时,需要指定列名、数据类型以及约束条件;删表时,需要注意是否有依赖关系,防止因删除导致的数据丢失。增加或修改表列涉及到更改表结构,这可能会影响到已有的数据,因此操作前应谨慎评估。表空间迁移则涉及...

    pl/sql使用软件

    2. **数据类型**:PL/SQL有多种内置数据类型,如NUMBER(数字)、VARCHAR2(可变长度字符串)、DATE(日期时间)、BOOLEAN(布尔值)等。此外,还可以定义对象类型和复合类型。 3. **流程控制**:包括条件语句(IF-...

    ORACLE PL/SQL 程序设计(第五版)

    3. **数据类型**:了解PL/SQL的数据类型,如NUMBER、VARCHAR2、DATE、BOOLEAN等,以及如何声明和初始化它们。 4. **SQL语句的嵌入**:PL/SQL允许在程序中直接嵌入SQL语句,进行数据查询、插入、更新和删除操作。 5...

    Oracle PL/SQL programming(5th Edition)

    - **数据类型**:介绍了PL/SQL支持的各种数据类型,包括基本数据类型和复合数据类型等。 - **控制结构**:如循环、条件语句等。 - **异常处理**:如何处理程序运行时可能出现的各种异常情况。 2. **高级编程技术*...

Global site tag (gtag.js) - Google Analytics