在oracle中,有4個大對象(lobs)類型可用,分别是blob,clob,bfile,nclob。
下面是對lob資料類型的簡單介紹。
l blob:二進制lob,為二進制資料,最長可達4GB,存貯在資料庫中。
l clob:字元lob,字元資料,最長可以達到4GB,存貯在資料庫中。
l bfile:二進制檔案;存貯在資料庫之外的隻讀型二進制資料,最大長度由作業系統限制。
l nclob:支援對位元組字元集合(nultibyte characterset)的一個clob列。
對于如何檢索和操作這些lob資料一直是oracle資料庫開發者經常碰到的問題。下面我将在oracle對lob資料處理的一些方法和技巧,介紹給讀者,希望能夠對讀者以後的開發有所幫助。
oracle中可以用多種方法來檢索或操作lob資料。通常的處理方法是通過dbms_lob包。
一、在oracle開發環境中我們可以用dbms_lob包來處理!dbms_lob包功能強大,簡單應用。既可以用來讀取内部的lob對象,也可以用來處理bfile對象。但處理兩者之間,還有一點差别。處理内部lob對象(blob,clob)時,可以進行讀和寫,但處理外部lob對象bfile時,隻能進行讀操作,寫的操作可以用pl/sql處理。另外用sql也可以處理lob,但要注意sql僅可以處理整個lob,不能操作lob的資料片。
在dbms_lob包中内建了read(),append,write(),erase(),copy(),getlength(),substr()等函數,可以很友善地操作lob對象。這裡不做深入讨論,讀者可以參看相關的書籍。
以下全部操作都在system使用者下進行的:
1.建立表downfilelist
create table downfilelist
(id varchar(20) not null primary key,
name varchar(40) not null,
filelocation bfile,
description clob
);
2.建立目錄
create or replace directory filedir as 'd:\downlist';
3.插入一行:
insert into downfilelist values
('10001','oracle plsql程式設計指南',bfilename('filedir','信管(1)班-麒麟湖照片.exe')
,'這是一本很棒的書');
4.進行查詢
SQL> select * from downfilelist;
SP2-0678: 列或屬性類型無法通過 SQL*Plus 顯示
SQL> select id,name,description from downfilelist;
ID NAME
-------------------- ----------------------------------------
DESCRIPTION
--------------------------------------------------------------------------------
10001 oracle plsql程式設計指南
這是一本很棒的書
5.read
declare
tempdesc clob;
ireadcount int;
istart int;
soutputdesc varchar(100);
begin
ireadcount:=5;
istart:=1;
select description into tempdesc from downfilelist
where id='10001';
dbms_lob.read(tempdesc,ireadcount,istart,soutputdesc);
dbms_output.put_line(soutputdesc);
end;
/
6.getlength
declare
tempclob clob;
ilen int;
begin
select description into tempclob from downfilelist
where id='10001';
ilen:=dbms_lob.getlength(tempclob);
dbms_output.put_line(ilen);
exception
when others then
dbms_output.put_line(sqlcode||' '||sqlerrm);
end;
/
7.write
declare
tempdesc clob;
icount int;
istart int;
snewvar varchar(30);
begin
icount:=10;
istart:=5;
snewvar:='這本書是今年的暢銷書';
select description into tempdesc from downfilelist
where id='10001' for update;--鎖定本行為了修改
dbms_output.put_line('更改前:'||tempdesc);
dbms_output.put_line('從'||istart||'開始的'||icount||'個字元被改寫為:'||snewvar);
dbms_lob.write(tempdesc,icount,istart,snewvar);
commit;
end;
8.append
declare
destdesc clob;
srcdesc clob;
begin
select description into destdesc from downfilelist where id='10001' for update;
select description into srcdesc from downfilelist where id='10001';
dbms_lob.append(destdesc,srcdesc);
commit;
end;
/
9.erase
declare
tempdesc clob;
icount int;
istart int;
begin
icount:=3;
istart:=1;
select description into tempdesc from downfilelist where id='10001' for update;--必須用for upda
dbms_lob.erase(tempdesc,icount,istart);
commit;
end;
/
10.copy
declare
destdesc clob;
srcdesc clob;
icount int;
ideststart int;
isrcstart int;
begin
icount:=10;
ideststart:=10;
isrcstart:=1;
select description into destdesc from downfilelist
where id='10001' for update;
select description into srcdesc from downfilelist where id='10001' for update;
dbms_lob.copy(destdesc,srcdesc,icount,ideststart,isrcstart);
commit;
end;
/
轉載于:https://blog.51cto.com/gaoshan/156687