oracle的包和大对象学习笔记
jfonwerin
|
1#
jfonwerin 发表于 2007-11-12 00:00
oracle的包和大对象学习笔记
包的概念
包是存储在一起的相关对象组成的P L / S Q L结构 包有两个独立的部分,即说明部分和包体,这两部分独立地存储在数据字典中 包的类型: 自定义包: oracle内置包: 自定义包: 包的规格说明部分: CREATE [OR REPLACE] PACKAGE <package_name> IS|AS <Public type and item declarations> -- 公有类型声明 < Public Subprogram specifications> -- 公有子程序声明 END <package_name>; 程序包主体部分 : CREATE [OR REPLACE] PACKAGE BODY <package_name> IS|AS <Private type and item declarations> -- 私有类型声明 < Private Subprogram bodies> -- 私有子程序体 < Private cursor define> -- 私有游标定义 < putblic Subprogram bodies> -- 公有子程序体 < putblic cursor define> -- 私有游标定义 END <package_name>; 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 <directory> AS <disk_path> 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’,1,1)。 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命令解锁 |