oracle的包和大对象学习笔记

代码
包的概念 
包是存储在一起的相关对象组成的P L 
/ S Q L结构
包有两个独立的部分,即说明部分和包体,这两部分独立地存储在数据字典中 
包的类型:
自定义包:
oracle内置包:
自定义包:
包的规格说明部分: 
CREATE [OR REPLACE] PACKAGE 
IS|AS
-- 公有类型声明
< Public Subprogram specifications> -- 公有子程序声明
END ; 
程序包主体部分 : 
CREATE [OR REPLACE] PACKAGE BODY 
IS|AS
-- 私有类型声明
< Private Subprogram bodies> -- 私有子程序体
< Private cursor define> -- 私有游标定义
< putblic Subprogram bodies> -- 公有子程序体
< putblic cursor define> -- 私有游标定义
END ; 
ORACLE9i内置包 
扩展数据库的功能
为 PL
/SQL 提供对 SQL 功能的访问
用户 SYS 拥有所有程序包
可以由任何用户访问
DBMS_ALERT支持数据库事件的异步通知
DBMS_STANDARD提供语言工具
DBMS_DDL某些DDL命令的PL
/SQL等效项
CALENDAR提供日历维护功能
DBMS_LOB操纵ORACLE的LOB数据
DBMS_OUTPUT在SQL
*PLUS或服务管理器中提供屏幕输出
DBMS_PIPE会话间异步通信
DBMS_ROWID允许从ROWID获得信息
DBMS_SESSIONALTER SESSION的PL
/SQL等效项
DBMS_SQL动态PL
/SQL和SQL
内置包"DBMS_OUTPUT" 
DBMS_OUTPUT是一个拥有几个入口点(API)的程序包,使用最多的是以下几个:
PUT
----在输出缓冲区中放置一个字符串,NUMBER或DATE,而不填加新换行符;
PUT_LINE----在输出缓冲区中放置一个STRING,NUMBER或DATE字符串,并加换行符;
NEW_LINE----在输出流中放置一个新换行符;
ENABLE/DISABLE----启用或禁用程序包中的数据缓冲区,有效地从程序上打开和关闭DBMS_OUTPUT。 
内置包“DBMS_STANDARD” 和"DBMS_LOB" 
“DBMS_STANDARD”程序包提供帮助应用程序与ORACLE进行交互的语言工具 
DBMS_LOB数据包提供了访问BLOB、CLOB、NCLOB和BFILE的例程
可以使用DBMS_LOB访问和操作完整的或部分的LOB
DBMS_LOB可以读取也可以修改BLOB、CLOB和NCLOB,而且还提供了对BFILE的只读操作
大型对象类型简介 

在Oracle9i中,还可以使用附加的数据类型来存储大型数据
LOB数据类型 描述
BLOB 二进制LOB,为二进制数据,最长可达4GB,存储在数据库中
CLOB 字符LOB,字符数据,最大可达4GB,存储在数据库中
BFILE 二进制文件,存储在数据库之外的只读型二进制数据,最大长度由操作系统限制
NCLOB 支持多字节字符集合的一个CLOB类型

LOB(大型数据对象)由两个部分组成
--数据和定位器
LOB数据:存储的实际数据
LOB定位器:指定数据库中对象的位置指示器
在大对象字段中插入值 
初始化值
当在包含有LOB的表中插入一个记录时,可以使用DBMS_LOB包中的函数告诉Oracle对于内部存储的LOB列,生成一个空的定位器。
一个空的定位器与一个NULL值不同。如果一个内部存储的LOB列的值为NULL,则在把它更新为一个非NULL值之前,必须先把它设置为一个空的定
位器。 
LOB数据类型 空定位器函数
BLOB EMPTY_BLOB()
CLOB EMPTY_CLOB()
NCLOB EMPTY_NCLOB()
在数据库中要创建一个DIRECTORY对象来引用目录
语法:
CREATE DIRECTORY AS 
directory:Oracle中的目录对象名
disk_path:磁盘路径

更新大对象字段 
在对一个LOB数据值修改之前,必须要锁定被更新的行
通常情况下,行锁定发生在后台,由Oracle自动加锁和解锁。
如果是在更新包含有LOB数据的行,则在执行UPDATE命令之前,需要锁定该行,否则就不能更新无效。
在SELECT语句后加上FOR UPDATE子句,就可以实行对行的加锁。 
显示大对象中的数据
无法通过SELECT语句显示LOB中的数据, CLOB和NCLOB数据类型除外
使用DBMS_LOB数据包操作大对象 
过程或函数 描述
READ 用来读入一段LOB值的过程
SUBSTR 用来在LOB值上执行SQL SUBSTR函数的函数
INSTR 用来在LOB值上执行SQL INSTR函数的函数
GETLENGTH 用来在LOB值上执行SQL LENGTH函数的函数
COMPARE 用来比较两个LOB值的函数
WRITE 用来在一个LOB值中的指定点写入数据到此LOB值的过程
APPEND 用来在一个LOB值中的内容添加到另一个LOB值的过程
ERASE 用来删除全部或部分LOB值的过程
TRIM 用来减少一个LOB值的大小尺寸,是从值的结尾处开始删除字符或字节
COPY 用来把全部或部分的LOB值从一个LOB列复制到另一个LOB列的过程

DBMS_LOB.READ过程
过程READ读入一个LOB值中的一部分数据。过程READ有4个参数,它们按照以下的顺序来指定:
1.LOB定位器
2.欲读入的字节或字符数
3.从LOB数据起点开始的位移(即读入开始的位置)
4.从READ过程输出的数据。该参数是一个输出参数。
如果在指定的字节读入之前,遇到此LOB数据的结尾,则READ过程将返回一个错误。
需要选取检索LOB定位器数值,并把它作为参数提供给READ过程,最后通过DBMS_OUTPUT显示读入的文本书。
举例:对于WORK_TYPE表中,读取CRITERION字段的前8个字符

DBMS_LOB.SUBSTR函数 
包DBMS_LOB中的SUBSTR函数在一个LOB数据值上执行SQL SUBSTR函数。
此函数具有三个输入参数,且必须按照下面的顺序来指定:
1.LOB定位器
2.欲读入的字节或字符个数
3.从此LOB数据值开始处计算的位移(即读入的开始位置)
由于SUBSTR是一个函数,所以与READ过程不同,将不会有输出变量值,直接从SUBSTR中返回。

DBMS_LOB.INSTR函数 
INSTR函数在一个LOB数据值上执行函数SQL INSTR。函数INSTR有四个参数,且必须按照如下顺序指定:
1.LOB定位器
2.对应LOB数据值的测试模式(对于BLOB为RAW字节, CLOB为字符串)
3.从此LOB数据值起始处开始的位移(读入操作的起点)
4.在此LOB数据值中出现的某个模式
INSTR函数搜索LOB数据以寻找由字节或字符构成的特定模式,函数返回的是在被检索的字符串中此模式的起始位置。
例如:INSTR(’ABCABC’,’A’,
11)。
GETLENGTH函数返回某个LOB数据值的长度。这个函数只需要一个参数,就是LOB定位器。
 
DBMS_LOB.COMPARE函数
COMPARE函数对两个LOB的值作比较。如果这两个LOB的值相同,则COMPARE函数返回一个值0;否则它将返回1个非0的整数(通常为1或
-1)。
为了执行COMPARE函数,DBMS_LOB包必须执行两个READ函数并比较其结果。所以,对于每个欲被比较的LOB数据值,需要分别提供其定位器的值
或位移(offset)值;而对于这两个LOB数据值来说,要比较字节或字符串个数是相同的。
COMPARE函数只能比较相同数据类型的LOB。
COMPARE函数有5个参数,它们必须按照下面的顺序指定:
1.对应第一个LOB定位器
2.对应第二个LOB定位器
3.总数变量(即需要比较的字节或字符个数)
4.从第一个LOB值起始处算起的位移(即读操作的起始点)
5.从第二个LOB值起始处算起的位移(即读操作的起始点)
由于被比较的两个LOB具有不同的位移值,所以能够将一个LOB值中的某一部分与另外一个不同的LOB值中的另外不同的部分作比较。
 
DBMS_LOB.WRITE过程
WRITE过程允许在LOB中指定的位置写入数据。例如,可以在一个BLOB列的某一部分中写入二进制数据,并覆盖掉已有的数据。也可以使用WRITE
过程写入字符数据到CLOB中。此过程有4个输入参数,并且必须按照下面的顺序指定:
1.此LOB的定位器
2.总数变量(即要写入的字节或字符个数)
3.从LOB值的起始处算起的位移(即写操作的起始点)
4.分配被写入的字符串或二进制数据的缓冲区变量
由于WRITE过程会更新LOB的值,所以必须用SELECT 
FOR UPDATE命令来锁定行数据。 

DBMS_LOB.APPEND过程
APPEND过程把1个LOB中的数据添加到第2个LOB中。由于需要对1个LOB值进行更新操作,所以在执行APPEND过程前,被更新的记录必须要锁定。
这个过程需要两个参数,并且必须按照下面的顺序指定:
1.目的LOB的定位器
2.源LOB的定位器
如果这两个参数都是NULL值,APPEND过程将返回1个错误。
 
DBMS_LOB.ERASE过程 
ERASE过程来删除一个LOB中任何位置的字符(串)或字节。可以使用ERASE来删除整个LOB值,也可以指定此LOB中哪个部分被删除。在功能上
ERASE与WRITE很相似。如果删除一个BLOB值中的数据,则代之以空格填充此CLOB。由于对一个LOB值执行了更新,所以应该遵从LOB更新的标准
过程—即锁定数据行和当过程结束时提交记录。此ERASE过程有3个参数,顺序为:
1.LOB的定位器
2.总数变量(即要删除的字节或字符个数)
3.从此LOB值开始计数的位移(即删除的开始处) 

DBMS_LOB.TRIM过程
TRIM过程来减少一个LOB值的大小尺寸,是从值的结尾处开始删除字符或字节(与SQL RTRIM函数类似)。该过程更新LOB列,所以需要锁定和解
锁。TRIM过程需要2个参数,顺序如下:
1.LOB的定位器
2.此LOB的新长度

DBMS_LOB.COPY过程 
COPY可以把一个LOB中的某一部分数据拷贝到另一个LOB中。与APPEND过程不同,并不需要把一个LOB的全部数据拷贝到另一个LOB中。在COPY过
程中,可以指定读出和写入操作的位移。COPY过程需要5个参数,依次为:
1.目的LOB的定位器
2.源LOB的定位器
3.总数(即要拷贝的字节或字符个数)
4.在目的LOB值中欲开始写入数据的位移
5.在源LOB值中开始读入的位移
COPY是READ和WRITE能力的结合。与WRITE过程相同,COPY过程改变了LOB值。所以必须首先被锁定,并且在执行完成后要用一条COMMIT命令解锁
原文地址:https://www.cnblogs.com/ding0910/p/1675720.html