天天看點

如何使用DBMS_LOB從檔案中加載CLOB資料

在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