Oracle预定义了4种大对象类型,它们是BEILE、BLOB、CLOB、NCLOB。
BFILE:我们可以把大的二进制对象存储在数据之外,BFILE存放在数据库中,存放的是文件指针(file locator),该指针指向数据之外的操作系统文件,数据实际存放在操作系统中,bfile是只读的,不能修改,不参与数据库的事务。
BLOB用于存储非结构化的二进制数据,最长可达128TB,数据存储在数据库中。
CLOB存放数据库字符集(database
character set
data)格式的字符数据,最大长度可达128TB,数据存储在数据库中。clob数据类型通过LOB定位器存储在表列中,实际的CLOB数据存储在独立的表空间中。
NCLOB功能和CLOB一样,只是NCLOB用于存放统一编码国家字符集(Unicode
National Character Set)数据。
LOB 定位器(LOB
Locators)就是指向LOB数据的指针。
处理LOB数据的方法有很多种,通常通过DBMS_LOB包来检索或操作LOB数据。
open()
打开LOB,close() 关闭LOB,append()
将源LOB中的内容追加到目标LOB,copy()从源LOB中的一部分或者全部数据复制到目标LOB,erase()删除LOB中全部或部分内容,trim()
将LOB值减少到指定的长度,read()从LOB中读取数据,write()写入数据, compare
()比较两个同种数据类型的LOB的部分或全部值是否相同,getlength()
获取LOB的长度,fileopen()打开文件,fileclose()关闭文件,fileexits()检查文件的存在性。
一个例子:
--建立学生论文表:
create table student_paper (
student_name varchar2(20),
paper
CLOB
);
insert into student_paper (student_name,paper)
values ('王晶',EMPTY_CLOB( )
);
commit;
-- EMPTY_CLOB()是oracle内置的函数,创建一个空的LOB定位器
---PL/SQL块:实现的功能是,向lob定位器中写入数据missunderstand。
DECLARE
v_clob CLOB;
BEGIN
select paper
into
v_clob
from student_paper
where student_name
='王晶'
for update;
dbms_lob.OPEN(v_clob,dbms_lob.lob_readwrite);
dbms_lob.WRITE(v_clob,3,1,'mis');
dbms_lob.WRITEAPPEND(v_clob,20,'understandfssddseshhhhh');—wirteappend() 在后面附加写入数据
dbms_lob.CLOSE(v_clob);
COMMIT;
EXCEPTION
when others then
dbms_output.put_line('FAILED');
ROLLBACK;
END;
--读取LOB数据
DECLARE
vclob2 CLOB;
v_out varchar2(1000);
V_read_length NUMBER;
BEGIN
select paper
into
vclob2
from student_paper
where student_name
='王晶';
V_read_length :=13;
DBMS_LOB.READ(vclob2,V_read_length,1,v_out);
DBMS_OUTPUT.PUT_LINE(v_out);
DBMS_OUTPUT.PUT_LINE(length(v_out));
DBMS_OUTPUT.PUT_LINE('HI,I am
PL/SQL');
END;
-- 函数解释:
procedure read( 要读取的定位器, 要读取的字节数, 开始读取操作的偏移量,
存储读操作结果的缓冲区);
procedure
write(要写入的lob定位器,写入lob中的字节数,指定开始操作的偏移量,指定写操作的缓冲区)