Oracle的特殊数据类型

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

时间: 2024-10-13 01:30:45

Oracle的特殊数据类型的相关文章

Oracle存储过程-自定义数据类型,集合,遍历取值

摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇到数据处理,假如我们目前的功能在一个Packages中 Packages封装了多个不同功能的Procedure,我们在一个Procedure里面进行统计 在另外一个Procedure进行计算 这就需要一个存放结果集的地方 以前的解决方案是:建立了一个临时表,数据统计出来后,放入临时表中 在另外一个P

MyBatis JdbcType 与Oracle、MySql数据类型对应关系详解

1. Mybatis JdbcType与Oracle.MySql数据类型对应列表 Mybatis JdbcType Oracle MySql JdbcType ARRAY     JdbcType BIGINT   BIGINT JdbcType BINARY     JdbcType BIT   BIT JdbcType BLOB BLOB BLOB JdbcType BOOLEAN     JdbcType CHAR CHAR CHAR JdbcType CLOB CLOB CLOB–>修改

Oracle VS DB2 数据类型

=========================Oracle VS DB2==================================== 本文转自:http://www.bitscn.com/oracle/install/200604/16541.html首先,通过下表介绍ORACLE与DB2/400数据类型之间的对应关系,是一对多的关系,具体采用哪种对应关系,应具体问题具体分析. Oracle DB2/400 Oracle数据类型 注意事项 DB2 UDB数据类型 注意事项 DAT

Oracle权限和数据类型

oracle创建用户: CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] [注]LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁定的用户无法正常的登陆进行数据库操作. 比如创建一个用户tom,密码是aaa,默认为非锁定,格式是: SQL>CREATE USER tom 2  IDENTIFIED BY aaa 3  ACCOUNT UNLOCK; [注]Oracle在SQL*Plus中的命令以分号结尾,代表命令完毕并执行,系

【转】oracle数据库NUMBER数据类型

原文:http://www.jb51.net/article/37633.htm NUMBER ( precision, scale)a)  precision表示数字中的有效位;如果没有指定precision的话,Oracle将使用38作为精度.b)  如果scale大于零,表示数字精确到小数点右边的位数:scale默认设置为0:如果scale小于零,Oracle将把该数字取舍到小数点左边的指定位数.c)  Precision的取值范围为[1---38]:Scale的取值范围为[-84---1

oracle中RAW数据类型

近日在研究v$latch视图时,发现一个从未见过的数据类型.v$latch 中ADDR属性的数据类型为RAW(4|8)  同时也发现v$process中的ADDR属性的数据类型也为RAW(4|8).于是查了一下oracle 的SQL Language Reference文档,文档如下描述: The RAW and LONG RAW data types store data that is notto be explicitly converted by Oracle Database when

Mybatis JdbcType与Oracle、MySql数据类型对应列表

Mybatis JdbcType Oracle MySql JdbcType ARRAY     JdbcType BIGINT   BIGINT JdbcType BINARY     JdbcType BIT   BIT JdbcType BLOB BLOB BLOB JdbcType BOOLEAN     JdbcType CHAR CHAR CHAR JdbcType CLOB CLOB CLOB JdbcType CURSOR     JdbcType DATE DATE DATE

oracle数据库的数据类型

一.字符类型 (1)固定长度的字符串 CHAR(字节长度是1~2000之间) CHAR(8)可以存储4个双字节的字符,8个单字节的字符,不足8字节剩余的部分用空格占据 (2)可变长度字符串 VARCHAR2(字节长度是1~4000之间) VARCHAR2(8) 存储的数据大小如上,不足8字节剩余的空间释放 (3)可变长文本数据   LONG(最多存储2GB数据) 二.数字类型 存储整数.浮点.实数.最高精度38位NUMBER NUMBER(10,5)表示总位数10 小数部分5(5位整数,5位小数

oracle中anyData数据类型的使用实例

---创建waterfallcreate or replace type waterfall is object(name varchar2(30),height number); --创建rivercreate or replace type rivertest is object(name varchar2(30),length number); create or replace procedure anydataTest /* *该实例演示了一种在参数传递时可以在集合中传递多个不同数据类