關於oracle中blob欄位的錄入問題
在oracle中,有4個大物件(lobs)型別可用,分別是blob,clob,bfile,nclob。
下面是對lob資料型別的簡單介紹。
blob:二進位制lob,為二進位制資料,最長可達4GB,存貯在資料庫中。
clob:字元lob,字元資料,最長可以達到4GB,存貯在資料庫中。
bfile:二進位制檔案;存貯在資料庫之外的只讀型二進位制資料,最大長度由作業系統限制。
nclob:支援對位元組字符集合(nultibyte characterset)的一個clob列。
對於如何檢索和操作這些lob資料一直是oracle資料庫開發者經常碰到的問題。下面我將在oracle對lob資料處理的一些方法和技巧,介紹給讀者,希望能夠對讀者以後的開發有所幫助。
oracle中可以用多種方法來檢索或操作lob資料。通常的處理方法是通過dbms_lob包。
其他的方法包括使用api(application programminginterfaces)應用程式介面和oci(oracle call interface)oracle呼叫介面程式。
一、在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物件。這裡不做深入討論,讀者可以參看相關的書籍。
對於pl/sql,下面介紹一種技巧,用動態的pl/sql語句處理clob物件來傳替表名!
example 1.
動態PL/SQL,對CLOB欄位操作可傳遞表名table_name,表的唯一標誌欄位名field_id,clob欄位名field_name記錄號v_id,開始處理字元的位置v_pos,傳入的字串變數v_clob
修改CLOB的PL/SQL過程:updateclob
create or replace procedure updateclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,v_id in number,
v_pos in number,
v_clob in varchar2)
is
lobloc clob;
c_clob varchar2(32767);
amt binary_integer;
pos binary_integer;
query_str varchar2(1000);
begin
pos:=v_pos*32766+1;
amt := length(v_clob);
c_clob:=v_clob;
query_str :='select '||field_name||'from '||table_name||'
where '||field_id||'= :id for update ';
--initialize buffer with data to be inserted or updated
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
--from pos position, write 32766 varchar2 into lobloc
dbms_lob.write(lobloc, amt, pos, c_clob);
commit;
exception
when others then
rollback;
end;
l /用法說明:
在插入或修改以前,先把其它欄位插入或修改,CLOB欄位設定為空empty_clob(),
然後呼叫以上的過程插入大於2048到32766個字元。
如果需要插入大於32767個字元,編一個迴圈即可解決問題。
查詢CLOB的PL/SQL函式:getclob
create or replace function getclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number) return varchar2
is
lobloc clob;
buffer varchar2(32767);
amount number := 2000;
offset number := 1;
query_str varchar2(1000);
begin
query_str :='select '||field_name||' from '||table_name||'
where '||field_id||'= :id ';
--initialize buffer with data to be found
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
offset:=offset+(v_pos-1)*2000;
--read 2000 varchar2 from the buffer
dbms_lob.read(lobloc,amount,offset,buffer);
return buffer;
exception
when no_data_found then
return buffer;
end;
l 用法說明:
用select getclob(table_name,field_id,field_name,v_id,v_pos) as
partstr from dual;
可以從CLOB欄位中取2000個字元到partstr中,
編一個迴圈可以把partstr組合成dbms_lob.getlength(field_name)長度的目標字串。
二、對於在其他不同的開發環境,例如vc,vb,pb,java等環境下對lob的處理,處理方法不盡相同,在這裡將簡要舉幾個例子來說明不在oracle開發環境下對lob的處理。
(一) 在pb中的處理
exampler 2.
string ls_path,ls_filename,ls_jhdh
long ll_num,ll_count,rtn
blob ole_blob
ll_num=dw_lb.getrow()
if ll_num>0 then ls_jhdh=dw_lb.object.ct_njhdh[ll_num]
select count(*) into :ll_count from sj_jh_jhfjb where
ct_jhdlxbh='1' and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;
if ll_count>0 then
rtn=messagebox("提示","是否要修改此附件",question!,yesno!,1)
if rtn=1 then
SELECTBLOB ct_jhfjnr INTO le_blob from sj_jh_jhfjb where
ct_jhdlxbh='1' and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;
ole_1.objectdata =ole_blob
If ole_1.activate(offsite!) <> 0 Then
Messagebox("OLE Activate","不能啟用")
Return -1
end If
end if
else
messagebox("提示","沒有附件")
end if
end if
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219982/viewspace-578024/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中Blob欄位的寫入處理(一) (轉)Oracle
- Oracle lob載入bfile資料到blob欄位中Oracle
- 關於Thinkphp 使用AdvModel來讀取Blob欄位PHP
- 關於SQL Server通過OLEDB訪問ORACLE資料表涉及CLOB或BLOB欄位的錯誤提示SQLServerOracle
- Oracle資料庫連結(DBLink)中如何訪問包含BLOB欄位的資料Oracle資料庫
- [BUG反饋]關於ot模型中的時間型別欄位bug問題模型型別
- 在ASP中讀取ORACLE中的BLOB型別的欄位的值,不用Oracle Object for Object (轉)Oracle型別Object
- 請教:關於log4j資訊入庫增加自定義欄位的問題
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- 關於9i匯入資料到10g時候欄位大小的問題
- BLOB及CLOB欄位處理
- hibernate中blob大2進位制檔案的問題?
- MySQL中NULL欄位的比較問題MySqlNull
- [提問交流]小問題關於外掛開發的欄位定義bug
- 使用sqlldr匯入日期格式欄位的問題SQL
- 關於分組後欄位拼接的問題[行列轉換]『By duanzilin』
- oracle union查詢中BLOB欄位出錯問題,ora-00932:資料型別不一致:應為 -,但卻獲得BLOBOracle資料型別
- 關於學習java中的按位取反(~)的問題Java
- Oracle中的Rownum 欄位Oracle
- Oracle中的大欄位Oracle
- hibernate中Blob,Clob欄位類行,二級快取的問題,哪位老大來指點指點快取
- PB關於資料視窗內欄位值改變問題
- Oracle資料庫中對BLOB資料的操作問題Oracle資料庫
- oracle 時間欄位自動更新問題Oracle
- Oracle10g Logminer處理BLOB欄位錯誤Oracle
- oracle中lob欄位Oracle
- MySQL中需要注意的欄位長度問題MySql
- 在VC中用OLE DB讀寫SQL Server中的BLOB欄位 (轉)SQLServer
- Oracke大欄位Blob匯出到檔案
- MySQL 大欄位問題MySql
- Oracle錄入特殊字元 [&] 的小問題Oracle字元
- 關於32位oracle擴充套件SGA的一些問題Oracle套件
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- 關於redo log 檔案中記錄的內容問題 ?
- 關於oracle的監聽問題Oracle
- varchar or blob:欄位型別的儲存和溢位條件型別
- 解決SQL Server中CHAR欄位空格問題SQLServer
- 關於SQL的重複記錄問題SQL