1     说明

1.1       RECORD

定义记录数据类型。

它类似于C语言中的结构数据类型(STRUCTURE)。PL/SQL提供了将几个相关的、分离的、基本数据类型的变量组成一个总体的方法,即RECORD复合数据类型。在使用记录数据类型变量时,须要在声明部分先定义记录的组成、记录的变量,然后在运行部分引用该记录变量本身或当中的成员。

定义记录数据类型的语法例如以下:

TYPE RECORD_NAME IS RECORD(

V1 
DATA_TYPE1 [NOT NULL][:=DEFAULT_VALUE],

V2 
DATA_TYPE2 [NOT NULL][:=DEFAULT_VALUE],

VN 
DATA_TYPEN [NOT NULL][:=DEFAULT_VALUE]);

1.2       VARRAY

数组是具有同样数据类型的一组成员的集合。每一个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY(variable
array。就可以变数组)。

定义VARRAY数据类型的语法例如以下:

TYPE VARRAY_NAMEIS VARRAY(SIZE) OF ELEMENT_TYPE [NOT NULL];

当中,varray_name是VARRAY数据类型的名称。size是正整数。表示能够容纳的成员的最大数量,每一个成员的数据类型是element_typeo默认时。成员能够取空值,否则须要使用NOT
NULL加以限制。

1.3       TABLE

定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它能够处理多行记录,类似于C语言中的二维数组,使得能够在PL/SQL中模仿数据库中的表。

定义记录表类型的语法例如以下:

TYPE TABLE NAME IS TABLE OF ELEMENT_TYPE [NOT NULL]

INDEX BY [BINARY_INTEGER|PLS_INTEGER|VARRAY2];

keywordINDEX BY表示创建一个主键索引,以便引用记录表变量中的特定行。

BINARY_INTEGER的说明

如语句:TYPE NUMBERS  IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;其作用是,加了”INDEX
BYBINARY_INTEGER ”后。NUMBERS类型的下标就是自增长,NUMBERS类型在插入元素时,不须要初始化,不须要每次EXTEND添加一个空间。

而假设没有这句话“INDEXBY BINARY_INTEGER”,那就得要显示对初始化,且每插入一个元素到NUMBERS类型的TABLE中时,都须要先EXTEND。

2     举例

2.1       创建表结构以及数据准备

--组织机构结构表
CREATE TABLE SF_ORG
(
ORG_ID INT NOT NULL, --组织机构主键ID
ORG_NAME VARCHAR2(50),--组织机构名称
PARENT_ID INT--组织机构的父级
) --一级组织机构
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(1, '一级部门1',0); --二级部门 INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(2, '二级部门2',1);
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(3, '二级部门3',1);
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(4, '二级部门4',1);

2.2       RECORD的使用举例

先定义一个仅仅与SF_ORG表中某几个列的数据类型同样的记录数据类型TYPE_ORG_RECORD,然后声明一个该数据类型的记录变量V_ORG_RECORD,最后用替换变量&ORG_ID接受输入的雇员编码,查询并显示该雇员的这几列中的信息。

注意,在使用RECORD数据类型的变量时要用“.”运算符指定记录变量名限定词。

一个记录类型的变量仅仅能保存从数据库中查询出的一行记录,假设查询出了多行记录。就会出现错误。

DECLARE
TYPE TYPE_ORG_RECORD IS RECORD(
V_ORG_NAME SF_ORG.ORG_NAME%TYPE,
V_PARENT_ID SF_ORG.PARENT_ID%TYPE);
V_ORG_RECORD TYPE_ORG_RECORD;
BEGIN
SELECT ORG_NAME,PARENT_ID INTO V_ORG_RECORD
FROM SF_ORG SO
WHERE SO.ORG_ID=&ORG_ID;
DBMS_OUTPUT.PUT_LINE('部门名称:' || V_ORG_RECORD.V_ORG_NAME);
DBMS_OUTPUT.PUT_LINE('上级部门编码:' || TO_CHAR(V_ORG_RECORD.V_PARENT_ID));
END;

2.3       VARRAY的使用举例

先定义一个能保存5个VARCHAR2(25)数据类型的成员的VARRAY数据类型ORG_VARRAY_TYPE,然后声明一个该数据类型的VARRAY变量V_ORG_VARRAY,最后用与ORG_VARRAY_TYPE数据类型同名的构造函数语法给V_ORG_VARRAY变量赋予初值并显示赋值结果。

注意。在引用数组中的成员时.须要在一对括号里使用顺序下标,下标从1開始而不是从0開始。

DECLARE
TYPE ORG_VARRAY_TYPE IS VARRAY(5) OF VARCHAR2(25);
V_ORG_VARRAY ORG_VARRAY_TYPE;
BEGIN
V_ORG_VARRAY := ORG_VARRAY_TYPE('1','2','3','4','5');
DBMS_OUTPUT.PUT_LINE('输出1:' || V_ORG_VARRAY(1) || '、'|| V_ORG_VARRAY(2) || '、'|| V_ORG_VARRAY(3) || '、'|| V_ORG_VARRAY(4));
DBMS_OUTPUT.PUT_LINE('输出2:' || V_ORG_VARRAY(5));
V_ORG_VARRAY(5) := '5001';
DBMS_OUTPUT.PUT_LINE('输出3:' || V_ORG_VARRAY(5));
END;

2.4       TABLE使用举例

2.4.1      存储单列多行

这个和VARRAY类似。可是赋值方式略微有点不同,不能使用同名的构造函数进行赋值。详细的例如以下:

DECLARE
TYPE ORG_TABLE_TYPE IS TABLE OF VARCHAR2(25)
INDEX BY BINARY_INTEGER;
V_ORG_TABLE ORG_TABLE_TYPE;
BEGIN
V_ORG_TABLE(1) := '1';
V_ORG_TABLE(2) := '2';
V_ORG_TABLE(3) := '3';
V_ORG_TABLE(4) := '4';
V_ORG_TABLE(5) := '5';
DBMS_OUTPUT.PUT_LINE('输出1:' || V_ORG_TABLE(1) || '、'|| V_ORG_TABLE(2) || '、'|| V_ORG_TABLE(3) || '、'|| V_ORG_TABLE(4));
DBMS_OUTPUT.PUT_LINE('输出2:' || V_ORG_TABLE(5));
END;

2.4.2      存储多列多行和ROWTYPE结合使用

採用bulkcollect能够将查询结果一次性地载入到collections中。而不是通过cursor一条一条地处理。

DECLARE
TYPE T_TYPE IS TABLE OF SF_ORG%ROWTYPE;
V_TYPE T_TYPE;
BEGIN
SELECT ORG_ID,ORG_NAME,PARENT_ID BULK COLLECT INTO V_TYPE
FROM SF_ORG
WHERE SF_ORG.ORG_ID <= 3; FOR V_INDEX IN V_TYPE.FIRST .. V_TYPE.LAST LOOP
DBMS_OUTPUT.PUT_LINE(V_TYPE(V_INDEX).C1 || ' ' || V_TYPE(V_INDEX).C2);
END LOOP;
END;

2.4.3      存储多列多行和RECORD结合使用

採用bulkcollect能够将查询结果一次性地载入到collections中。

而不是通过cursor一条一条地处理。

DECLARE
TYPE TEST_EMP IS RECORD
(
C1 SF_ORG.ORG_NAME%TYPE,
C2 SF_ORG.PARENT_ID%TYPE
);
TYPE T_TYPE IS TABLE OF TEST_EMP;
V_TYPE T_TYPE;
BEGIN
SELECT ORG_NAME, PARENT_ID BULK COLLECT INTO V_TYPE
FROM SF_ORG
WHERE SF_ORG.ORG_ID <= 3; FOR V_INDEX IN V_TYPE.FIRST .. V_TYPE.LAST LOOP
DBMS_OUTPUT.PUT_LINE(V_TYPE(V_INDEX).C1 || ' ' || V_TYPE(V_INDEX).C2);
END LOOP;
END;

3     问题

VARRAY和TABLE集合不能直接对其进行查询。仅仅能对其进行遍历。

ORACLE中RECORD、VARRAY、TABLE的使用具体解释的更多相关文章

  1. ORACLE中RECORD、VARRAY、TABLE的使用详解(转)

    原文地址:ORACLE中RECORD.VARRAY.TABLE的使用详解

  2. ORACLE中RECORD、VARRAY、TABLE、IS REF CURSOR 的使用及实例详解

    ORACLE中RECORD.VARRAY.TAB.IS REF CURSOR LE的使用及实例详解 create or replaceprocedure PRO_RECORD_ROW_TAB_EXAM ...

  3. Oracle 中UNDO与REDO的差别具体解释

    一 为了更清楚的看出2者差别,请看下表:                                               UNDO                             ...

  4. Oracle性能优化之oracle中常见的执行计划及其简单解释

    一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...

  5. Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

    转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: ...

  6. oracle中的存储过程例子

    用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获. . 建立一个存储过程 ...

  7. Oracle中特殊的变量类型

    1.%TYPE 允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联.语法如下: variable_name table.column%TYPE   2.%ROWTYPE 允许用户定义 ...

  8. oracle中的数组

    Oracle中的数组分为固定数组和可变数组. 一.固定数组固定数组:在定义的时候预定义了数组的大小,在初始化数组时如果超出这个大小,会提示ORA-06532:超出小标超出限制!语法:        T ...

  9. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

随机推荐

  1. Atitit.linq java的原理与实现 解释器模式

    Atitit.linq java的原理与实现 解释器模式 1. Linq  from  where 的实现1 2. Where expr 的实现1 3. Attilax的一点变化2 4. 解释器模式的 ...

  2. Atitit.异常机制的设计原理

    Atitit.异常机制的设计原理 缺陷 关键是只要知晓有一个异常表的存在,try 的范围就是体现在异常表行记录的起点和终点.JVM 在 try 住的代码区间内如有异常抛出的话,就会在当前栈桢的异常表中 ...

  3. 树莓派学习笔记——apt方式安装opencv

    0.前言     本文介绍怎样在树莓派中通过apt方式安装opencv.并通过一个简单的样例说明怎样使用opencv. 相比于源码方式安装opencv,通过apt方式安装过程步骤简单些,消耗的时间也少 ...

  4. 不同的Linux之间copy文件常用方法

    第一种就是ftp,也就是其中一台Linux安装ftp Server,另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是采用samba服务,类似Windows文件copy 的方式 ...

  5. 【Python + ATX基于uiaotumator2】之Android—APP自动化简易例子

    上代码: import uiautomator2 as u2 from time import sleep d = u2.connect_usb('608ad0fe') #打开小卖 # d(text= ...

  6. shiro配置数据库连接池总结

    在项目中要使用shiro做权限认证和登录许可等,现在总结一份,以备以后使用 ms sql版本 [main]ds=com.mchange.v2.c3p0.ComboPooledDataSourceds. ...

  7. TLS,SSL,HTTPS with Python(转)

    From: 扫盲 HTTPS 和 SSL/TLS 协议[0]:引子 需要了解的背景知识: 术语 HTTPS,SSL,TLS 长连接与短连接的关系 了解 CA 证书 基本流程 一.术语扫盲 1.什么是S ...

  8. python django -4 模板

    模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...

  9. 目标检测之线段检测---lsd line segment detector

    (1)线段检测应用背景 (2)线段检测原理简介 (3)线段检测实例 a line segment detector (4)hough 变换和 lsd 的区别 --------------------- ...

  10. 机器学习算法-Adaboost

    本章内容 组合类似的分类器来提高分类性能 应用AdaBoost算法 处理非均衡分类问题 主题:利用AdaBoost元算法提高分类性能 1.基于数据集多重抽样的分类器 - AdaBoost 长处 泛化错 ...