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中的字节数,指定开始操作的偏移量,指定写操作的缓冲区)