1.%TYPE
允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联。语法如下:
variable_name table.column%TYPE
 
2.%ROWTYPE
允许用户定义单一的变量,该变量包含数据库表的每一列的多个变量。语法规则如下:
variable_name table%ROWTYPE
一旦定义了这种变量,就可以使用 如下的方式来访问各个列:
row_variable.column_name
 
另外:可以使用%ROWTYPE类型的变量向数据库表中插入或更新整个记录,方法如下:
EmpRec scott.emp%ROWTYPE;
insert into scott.emp values EmpRec;
 
3.FOR 游标,语法如下
FOR record_variable in cursor
Loop
//处理逻辑
END Loop;
借助于%ROWTYPE,record_variable自动定义为一个变量。该循环打开游标,再循环中为每个记录执行逻辑操作,当不再存在记录时终止循环并关闭游标。
 
4.隐式游标,为FOR游标的一种特殊形式,其通过直接使用SQL语句而不需要显示声明游标
FOR record_variable in (select 语句)
Loop
//处理逻辑
END Loop;
注意:select 语句一定要使用括号把它包起来
 
5.REF 游标
游标引用一个结果集。REF CURSOR允许PL/SQL程序单元之间传递一个游标引用。
也即是它允许用户创建一个变量,该变量接收一个游标并且能够访问其结果集。
使用方式:
  1. 声明一个TYPE: TYPE ref_cursor_name IS REF CURSOR [RETURN_TYPE];return_type子句是可省的,可以指定或不指定REF_CURSOR返回的数据类型。如果不指定,则游标是弱类型的。如果指定,则游标是强类型的。PL/SQL提供了一个预定义的称为SYS_REFCURSOR的弱REF CURSOR。
  2. 然后创建该类型的一个实例: cursor_variable ref_cursor_name ; sys_cursor SYS_REFCURSOR
 
注意:由于弱REF CURSOR容易导致在REF CURSOR返回的数据和应用程序所使用的变量之间的不匹配,因此更有可能产生bug。
 
在创建强类型的REF CURSOR时,既可以使用%ROWTYPE ,如
TYPE rc_employees HR.EMPLOYEES%ROWTYPE --声明rc_employees 类型
TYPE rc_emp IS REF CURSOR rc_employees%TYPE --声明REF CURSOR类型,并制定返回类型为rc_employees
 
 
也可以使用包含%TYPE的PL/SQL RECORD,如
TYPE jr_rec is RECORD (
employee_id JOB_HISTORY.EMPLOYEE%TYPE,
job_id JOB_HISTORY.JOB_ID%TYPE,
speed_of_promotion VARCHAR2(4)
);
type rc_jr is REF CURSOR jr_rec%TYPE;
 
6.RECORD
RECORD是一种复合数据类型--单个记录可以拥有多个分量。RECORD的典型用法是与%ROWTYPE一起配套使用,如:
record_name table%ROWTYPE
在这个声明之后, 可以使用record_name.column_name来访问单个列。
 
还可以显示的定义RECORD包含多个列,语法如下:
TYPE record_name IS RECORD(col_name dataType[,...]); --声明类型
rec record_name; --定义变量
 
当定义Record类型的变量后,可以
  1. 接收select语句的结果:select employee_id, employee_name from employee into rec;
  2. 向数据库表中insert:insert into employee values rec;
  3. 更新表记录update: update empee set row rec where employee_id = rec .employee_id;
  4. 可以在delete语句中使用: DELETE FROM HR.JOB_HISTORY WHERE DEPART_ID =1 RETURN TYPE EMPLOEE_ID,EMPLOEE_NAME into rec;

7.关联数组
关联数组是按照某个值索引的数据的集合,它类似于某些其他程序设计语言中的散列表。
语法如下:
TYPE array_name IS TABLE OF DATATYPE INDEX BY VALUE;
声明后,即可定义一个该类型的变量: v_arr array_name ;
 
使用循环为关联数组设值:
FOR temp in (select 语句 )
LOOP
v_arr[temp .key] = temp.value;
END LOOP;
 
从关联数组中索引值:
v_temp := v_arr(v_key);
 
8.嵌套表
嵌套表使用顺序整数作为集合的索引。尽管数组也使用整数索引数组的内容,但是用于索引数据的正式是顺序和连续的。
通过创建一种称为稀疏索引,嵌套表可以使用不连续的数字作为索引。
声明嵌套表的语法如下所示:
TYPE collection_name is TABLE OF datatype [NOT NULL];
这里 datatype可以是任务有效的PL/SQL数据类型,REF CURSOR除外。 NOT NULL关键字表名,该集合不能包含NULL值的元素。
 
借助对象类型可以将嵌套表保存在某个数据列中,而且可以访问这种被存储的表中的单个元素。
 
9.可变数组
可变数组又称为VARRAY。这种稽核采用整数索引,而且可以保存在数据库中的某列中。
VARRAY的定义又包含了一个特定的索引上边界。
定义VARRAY的语法如下所示:
TYPE collection_name IS VARRAY(size) OF dataType [NOT NULL];
其中 size是VARRAY大小的上限。
 
10.使用集合
PLSQL中的集合是包含单一数据块或由单个变量构成的复合数据的多个实例。
集合的类型:关联数组、嵌套表和可变数组
 
可以按照两种方式给稽核赋值。对于嵌套表和可变数组,可以在单一的语句中赋所有的值:
TYPE number_array IS TABLE OF NUMBER;
number_collection number_array := (1,2,3,4,5,6,7,8,9);
使用索引值,一次只能附一个值:number_collection(1) := 1;
 
还可以使用一个集合给另一个集合赋值,只要这两个集合拥有相同的数据类型。
集合可以用于两种类型的逻辑比较:
判断两个集合是否相等: IF collection1 = collection2
判断集合是否为空: IF collection1 IS NULL;
 
集合操作:
操作 含义 语法
EXISTS 检查集合中是否存在某个元素 collection.EXISTS(index)
COUNT 返回集合中元素的个数 collection.COUNT
LIMIT 返回VARRAY中的最大条目数 collection.LIMIT
FIRST 返回集合中的第一个元素 collection.FIRST
LAST 返回集合中最后一个元素 collection.LAST
NEXT 返回集合中下一个元素 collection.NEXT
PRIOR 返回集合中的上一个元素,如果不存在,则返回NULL collection.PRIOR
EXTEND 扩展集合中元素的个数。不能用于关联数组或其他未被
初始化的集合
collection.EXTEND(给集合增加单个元素)
collection.EXTEND(n) :给集合增加n个元素
collection.EXTEND(n,I):通过复制下标I的值,给集合增加n个元素
TRIM 从集合结尾处删除元素 collection.TRIM;从结尾处删除单个元素
collection.TRIM(n):从集合结尾处删除n个元素
DELETE 从集合中删除元素 collection.DELETE:从集合中删除所有元素
collection.DELETE(n):从集合中删除下标为n的元素
collection.DELETE(m,n):从集合中删除下标值位于m,n之间的元素
 
集合使用注意事项:
  • EXTEND、TRIM和DELETE以外其他操作都返回值
  • 根据环境所定义的语言,包含VARCHAR2下标的关联数组按字母顺序排列
  • 如果集合为空(NULL),则FIRST和LAST返回NULL,它不包含于任何元素
  • 如果集合中不存在下一个或上一个元素,则NEXT和PRIOR返回NULL
  • EXTEND 和 TRIM 不能用于关联数组
  • LIMIT可以用于限制添加至集合的值的个数,通常的语法是l select... into
 
集合的适用性:集合类之间存在的差异
  关联数组 嵌套表 VARRAY
下标类型 数字或字符串 数字 数字
声明为固定大小
允许稀疏下标
在数据库中存储
访问存储在集合中的各个元素 N/A
11.BULK COLLECT
使用BULK COLLECT和关联数组的结合,可以进行批处理操作,如下所示:
TYPE REC IS RECORD(...,...);
定义关联数组类型:TYPE rec_table is TABLE OF rec index by PLS_INTEGER;
声明变量:rec_table_array rec_table;
 
OPEN cursor;
fetch cursor bucket into rec_table_array;
close cursor;
FOR counter in rec_table_array.FIRST ... rec_table_array.LAST
LOOP
//处理逻辑
END LOOP;
 
12.FORALL
FORALL结构允许执行写操作时获得与BULK COLLECT所提供的相同效率,这个结构封装多个写语句,并且在单一的消息中将它们发送给ORACLE数据库,从而提高该操作的总体性能。
 
FORALL结构的语法如下:
FORALL index_name in lower_bound ... upper_bound
sqlstatment
 
其中index_name是一个为在该FORALL循环中使用而隐士声明的变量。
lower_bound和upper_bound限制该集合的范围,这个循环是针对集合的。
例如:如果想要使用FORALL插入位于集合中的所有所有记录:
FORALL jh_index in jh.FIRST .. jh.LAST
INSERT INTO HR.JOB_HISTORY VALUES jh(jh_index);
 
注意:挡在FORALL 循环中包含SAVE EXCEPTIONS关键字时,该循环不再对个别SQL语句中的错误报告异常。
相反,如果在FORALL循环的处理过程中出现任何异常,则在该处理过程结束时报告错误代号为-24381的一个异常。
 
 
FORALL的改进
1.INDICES OF
这是一种对稀疏集合处理的改进。该集合的记录并非连续分布---他们连续地分布在集合的整个范围内。
FORALL INDICES OF collection_name [between lower_bound... upper_bound]
sql_statement
 
以上语句告诉FORALL读下一个下标值而不是下一个连接的值。使用 INDICES OF 子句可以让FORALL结构适用于稀疏集合。
通过指定集合的上、下边界, INDICES OF 子句还允许只选择处理整个集合的一部分。
 
2.VALUES OF
这种改进使得FORALL结构的应用更具灵活性。
VALUES OF 子句允许使用另一种集合, 确定哪些记录作为FORALL结构的目标。
 
FORALL index_values VALUES OF driver_collection
使用这个子句的唯一要求是该驱动集合必须是嵌套表或关联数组。用于这种结构的关联数组的下标和元素都必须是BINARY_INTEGER或PLS_INTEGER

Oracle中特殊的变量类型的更多相关文章

  1. Oracle中Blob和Clob类型的区别与操作

    Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...

  2. CG中的数据变量类型

    CG 中的数据变量类型有三: float:高精度浮点值,通常是32位. half:中精度浮点值.通常是16位,范围是-60000至+60000,它适合存储UV坐标,颜色值等. fixed:低精度浮点值 ...

  3. 问题:oracle CLOB类型;结果:oracle中Blob和Clob类型的区别

    BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的的,或者可以直接用LOB字段代替这两个.但是为了更好的管理ORACLE数据库,通常像图 ...

  4. Oracle的pl/sql变量类型

    pl/sql定义 sql是结构化查询语言.sql是不是一个编程语言?编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言.我们在实际的开发中,有这种需要,把s ...

  5. Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题

    近期的项目中,需要将hadoop运行完成的结果(存在于hdfs上)导入到oracle中,但是在用sqoop导入hdfs中的日期字段'2016-03-01'时,sqoop报错,说date类型必须为'yy ...

  6. oracle中数据类型对应java类型

    地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm ...

  7. Python中的高级变量类型

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...

  8. SQL SERVER中LIKE使用变量类型不同输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  9. SQL SERVER中LIKE使用变量类型输出结果不同

    前言:Sql Server中LIKE里面使用不同的变量类型导致查询结果不一致的问题,其实看似有点让人不解的现象背后实质跟数据类型的实现有关. 一.我们先来创建示例演示具体操作 CREATE TABLE ...

随机推荐

  1. 恢复oracle 11g 的System及sys用户的密码

    进入E:\app\orcl\product\11.2.0\dbhome_1\database目录下找到PWDorcl.ora备份后删除文件,orcl是数据库的实例名 以管理员身份打开cmd,执行 or ...

  2. [原创]如果软件在网络磁盘中或移动磁盘中运行时需要解决 exception C0000006 异常问题

    //如果软件在网络磁盘中或移动磁盘中运行时需要利用下面这句命令来解决 exception C0000006 异常问题 {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FRO ...

  3. SpringBoot之基础

    简介 背景 J2EE笨重的开发 / 繁多的配置 / 低下的开发效率 / 复杂的部署流程 / 第三方技术集成难度大 特点 ① 快速创建独立运行的spring项目以及主流框架集成 ② 使用嵌入式的Serv ...

  4. jQuery中删除方法empty(),remove()和detach()的区别

    empty():清空匹配的元素集合中所有的子节点,自身节点和事件都未被删除. remove():这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.但除了这个元素本身 ...

  5. Jenkins Maven Selenium TestNG踩坑记

    1)Maven TestNG什么的都配置好了,在本地用eclipse->Run AS->MAVEN INSTALL运行正常 2) Jenkins安装了插件,也建立了MAVEN项目.MAVE ...

  6. 解题(GoUpstairs -- 上楼梯)

    题目描述 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶.请实现一个方法,计算小孩有多少种上楼的方式.为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n, ...

  7. HAProxy 的acl应用

    非常好的博文推荐:http://blog.51cto.com/1992tao/1875563 官方文档:https://cbonte.github.io/haproxy-dconv/1.9/confi ...

  8. appium 版本更新后的方法变化更新收集 ---持续更新

    在高版本的android手机(例如android 7.0 , 8.0等等),必须使用高版本的appium, 以及对应的selenium版本,那么很多的appium或者selenium方法会变得无法直接 ...

  9. 返回 字符串的 form和js组合让页面跳转

    router.get("/wy/jhy").handler(ctx->{ ctx.request().response().setChunked(true); System. ...

  10. TZOJ 2569 Wooden Fence(凸包求周长)

    描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...