`

PL/SQL块定义部分--LOB类型

 
阅读更多

在Oracle的早期版本中,使用LONG 和 LONG RAW 类型存放大数据。从8i版本开始,Oracle引入了LOB数据类型,并且Oracle建议开发人员尽量去使用LOB类型而不去使用 LONG 和 LONG RAW 。LOB类型和LONG、LONG RAW类型相比有几个不同的地方。如:
1、LOB(除了NCOLB)可以作为对象类型的一个属性,但LONG类型不可以。
2、LOB的最大值是4G,而LONG只有2G。
3、LOB支持随机访问数据,但LONG只支持顺序访问。
    LOB包括内部LOB和外部LOB,其中内部LOB(BLOB CLOB NLOB)的数据存放到数据库中,而外部LOB(BFILE)的数据存放在操作系统的文件中。具体说明如下:
BLOB:存放二进制格式的数据,如:图像、音频、视频等。
CLOB:存放数据库字符集格式的字符数据,如:大的文本数据。
NCLOB:存放Unicode字符集的字符数据。
BFILE:存放指向操作系统文件的指针,并且该文件即可以是文本文件,也可以是二进制文件。当我们访问该类型所表示的列时,只能读取数据,不能修改。
  
一、理解什么是LOB定位器和LOB数据
    LOB数据是我们存入到数据库中的值,而LOB 定位器 是操作这些值的指针。当我们想读取或者修改LOB数据时,我们必须先要获取LOB 定位器 ,然后通过LOB定位器才能读取或者修改LOB数据,下面的示例能够帮助我们更好的理解LOB数据和LOB定位器:
DECLARE
picLOB BLOB;
BEGIN
   --假定 picColumn列是BLOB类型
  SELECT picColumn INTO picLOB FROM myTable WHERE ID=10;
END;
    当SELECT INTO语句执行完之后, picLOB变量将被赋值,但是 picLOB变量的值不是LOB数据,而是LOB数据的定位器。要想获取LOB数据,我们必须对定位器进行操作,Oracle中DBMS_LOB包里的很多函数和过程都可以对定位器进行操作,如下:
APPEND(): 将源LOB中的内容加到目的LOB中
COPY() :从源LOB中复制数据到目的LOB
ERASE(): 删除LOB中全部或部分内容
TRIM(): 将LOB值减少到指定的长度
WRITE(): 向LOB 中写入数据
COMPARE(): 比较两个同种数据类型的LOB的部分或全部值是否相同
GETLENGTH(): 获取LOB的长度
READ(): 从LOB中读出数据

二、使用CLOB数据类型
示例1:创建带有CLOB数据类型的表,并插入数据
CREATE TABLE CLOB_TABLE
(
  id NUMBER(3) PRIMARY KEY,
  remark CLOB    --remark:备注
);
INSERT INTO CLOB_TABLE(id) VALUES(1);  --remark列没有定位器,并且没有数据
INSERT INTO CLOB_TABLE VALUES(2,'ID为2的备注信息');  --remark列有定位器,并且有数据
INSERT INTO CLOB_TABLE VALUES(3,empty_clob());--remark含有定位器,但是没有数据

检索定位器的值:
DECLARE
myLob CLOB;
BEGIN
  SELECT remark INTO myLob FROM CLOB_TABLE WHERE id=___ ;
  IF myLob IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('myLob IS NULL ');
  ELSE
    DBMS_OUTPUT.PUT_LINE(myLob );
  END IF;
END;
当下划线填入1时,结果如下:
myLob IS NULL
当下划线填入2时,结果如下:--打印出定位器所指向的数据
ID为2的备注信息
当下划线填入3时,没有打印出信息。

修改id为1的remark列,使其具有定位器:
UPDATE CLOB_TABLE SET remark=empty_clob() WHERE id=1;
这时再调用以上的代码块,这次没有打印出信息。

示例2:向CLOB列追加数据
DECLARE
myLob CLOB;
buffer VARCHAR2(20) := '这是第一次追加的内容';
amount INT;
offset INT;
BEGIN
  --要想能够修改LOB数据,必须指定FOR UPDATE子句
  SELECT remark INTO myLob FROM CLOB_TABLE WHERE id=2 FOR UPDATE ;
  amount:=LENGTH( buffer );  --获取追加文本的长度
  offset:=DBMS_LOB.GETLENGTH (myLob)+1;  --获取定位器引用的LOB数据的 长度
  DBMS_LOB.WRITE (myLob,amount,offset, buffer );-- 向CLOB列追加数据,每次最大追加32767字节。要注意必须先存在定位器才能追加数据,否则会出现invalid LOB locator specified: ORA-22275错误。
  --DBMS_LOB.WRITEAPPEND(myLob,amount, buffer );--使用这个函数不用考虑offset参数
END;

示例3:读取CLOB数据
DECLARE
myLob CLOB;
text VARCHAR2(40);
amount INT;
offset INT;
BEGIN
  SELECT remark INTO myLob FROM CLOB_TABLE WHERE id=2;
  amount:=15;
  offset:=3;
  --从LOB数据中的第三个字符开始读取共读取15个字符放入到text变量
  DBMS_LOB.READ(myLob,amount,offset,text);
  DBMS_OUTPUT.PUT_LINE(text);
END;

三、使用BFile数据类型
    BFile类型不存放文件实际数据,而是存放文件的指针,文件的数据存储在操作系统的文件系统上,并且我们只能通过BFile类型读取文件的数据,不能修改。
示例1:创建ScottDir目录,并授予scott用户读权限
CREATE DIRECTORY ScottDir AS 'E:\ScottDir'; --注意此语句并不会在操作系统上创建文件夹
GRANT READ ON DIRECTORY ScottDir TO scott;

示例2:创建含有BFile数据类型的列,并插入数据
CREATE TABLE BFILE_TABLE
(
   id NUMBER PRIMARY KEY,
   remark  BFILE
);
插入数据:
INSERT INTO BFILE_TABLE(id) VALUES(1);
UPDATE BFILE_TABLE SET remark=BFILENAME('SCOTTDIR ','1.txt') ;
INSERT INTO BFILE_TABLE(id,remark) VALUES(2,BFILENAME(' SCOTTDIR ','2.doc') );
注意:BFILE数据类型指向的文件,即可以是文本文件也可以是二进制文件。而且BFILE数据类型不能通过SELECT语句直接查看其内容。

示例3:将BFile文件的内容读取到CLOB列(前提是BFile文件是文本文件)
DECLARE
src   BFILE;
des   CLOB;
amount    INT;
src_offset INT :=1;
des_offset INT :=1;
csid INT :=850;
lc   INT :=0;
warning INT;
BEGIN
  SELECT remark INTO src FROM BFile_TABLE WHERE id=1;
  SELECT remark INTO des FROM CLOB_TABLE WHERE id=1 FOR UPDATE ;
  DBMS_LOB.FILEOPEN(src,DBMS_LOB.FILE_READONLY);
  amount:=DBMS_LOB.GETLENGTH(src);
  DBMS_OUTPUT.PUT_LINE(amount);
 DBMS_LOB.LOADCLOBFROMFILE (des,src,amount,des_offset,src_offset,csid,lc,warning);
  DBMS_LOB.CLOSE(src);
END;

四、使用BLOB数据类型
示例1:创建带有BLOB列的表并插入数据
 CREATE TABLE BLOB_TABLE
 (
   id NUMBER(3),
   remark BLOB
 );
INSERT INTO BLOB_TABLE VALUES(1,EMPTY_BLOB());
将文件内容插入到BLOB列:
DECLARE
src   BFILE;
des   BLOB;
amount    INT;
src_offset INT :=1;
des_offset INT :=1;
csid INT :=0;
lc   INT :=0;
warning INT;
BEGIN
  src:=BFILENAME('SCOTTDIR','1.txt');
  SELECT remark INTO des FROM BLOB_TABLE WHERE id=1 FOR UPDATE;
  DBMS_LOB.FILEOPEN(src,DBMS_LOB.FILE_READONLY);
  amount:=DBMS_LOB.GETLENGTH(src);
  DBMS_OUTPUT.PUT_LINE(amount);
  --DBMS_LOB.LOADBLOBFROMFILE (des,src,amount,des_offset,src_offset);
  DBMS_LOB.CLOSE(src);
END;

分享到:
评论

相关推荐

    PL/SQL 基础.doc

    PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...

    oracle .

    PL/SQL 块结构和组成元素 PL/SQL 处理流程 光标的使用 错误处理 存储过程和函数 创建包和使用包 触发器 外部存储过程 会话间通信 数据库作业和文件I/O 在PL/SQL 使用SQL语句 PL/SQL程序的测试和调试 性能及其它问题 ...

    精通Oracle.10g.PLSQL编程

    PUSQL基础 3.1 PL/SQL块简介 3.1.1 PL/SQL块结构 3.1.2 PL/SQL块分类 3.2 定义并使用变量 3.2.1 标量变量 3.2.2 复合变量 3.2.3 参照变量 3.2.4 LOB变量 3.2.5 非PL...

    PLSQL基础教程

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §...

    PLSQL程序设计

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 ...

    oracle学习资料

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 ...

    plsql_oracle 编程

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 ...

    plsql_oracle 8i 编程讲义

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 ...

    深入ORACLE变量的定义与使用的详解

    在编写PL/SQL程序时,可以使用标量(Scalar)类型、复合(Composite)类型、参照(Reference)类型和LOB(LargeObject)类型等四种类型。在PL/SQL中用的最多的就是标量变量,当定义标量变量时,必须要指定标题数据...

    数据库基础

    第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE...

    Oracle8i_9i数据库基础

    第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE...

    PLSQL高级编程资料

    7.2.3 执行 PL/SQL 块 第八章 显示数据 8.1 DBMS_OUTPUT 程序包 8.1.1 开启屏幕显示 8.1.2 关闭屏幕显示 8.1.3 其他函数 8.1.4 引发的异常 8.2 UTL_FILE 程序包 8.2.1 概述 8.2.2 函数描述 8.2.3 例程 8.3 TEXT_IO ...

    Oracle 10g 开发与管理

    7.3 PL/SQL 块中的SQL 语句 58 7.4 使用%TYPE和%ROWTYPE类型的变量 58 1.%Type 59 2.%RowType 59 7.5 复合变量 60 1.记录类型(“行”) 60 2.记录表类型(“表” ) 60 (1)使用的原因: 60 (2)定义记录表类型...

    Oracle 10g应用指导

    第3章SQL及PL/SQL的运行环境及其他开发工具。第4章 Oracle数据字典管理与数据类型。包括数据字典的分类、使用方法以及各种对象的具体查询等做了详细的介绍。第5章 数据库对象的创建与使用。主要包括各种类型的表创建...

    Oraclet中的触发器

    在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块,不过有一点不同的是,触发器是隐式调用的,并不能接收参数。 触发器优点 (1)触发器能够实施的检查和操作比主键和外键约束、...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    LOB数据类型 clob 1~4GB 只能存储字符数据 nclob 1~4GB 保存本地语言字符集数据 blob 1~4GB 以二进制信息保存数据 三、 DDL语言 1. Create table命令 用于创建表。在创建表时,经常会创建该表的主键、外键、唯一...

    北大青鸟Oracle教程集1

    存储, 输入,编辑,存储,检索和运行 SQL 命令 以及 PL/SQL 块的工具 iSQL*Plus 类似, 与 SQL 类似,但可以通过浏览器进行访问 PL/SQL SQL 的扩展 SQL 命令的类别 数据定义语言 数据操纵语言 事务处理控制语言 数据控制...

    北大青鸟Oracle教程集2

    存储, 输入,编辑,存储,检索和运行 SQL 命令 以及 PL/SQL 块的工具 iSQL*Plus 类似, 与 SQL 类似,但可以通过浏览器进行访问 PL/SQL SQL 的扩展 SQL 命令的类别 数据定义语言 数据操纵语言 事务处理控制语言 数据控制...

Global site tag (gtag.js) - Google Analytics