CLOB與BLOB的轉換
CLOB轉換為BLOB在Oracle中可以通過utl_raw和dbms_lob兩個包來實現。
1) 在utl_raw中FUNCTION cast_to_raw(c IN VARCHAR2 CHARACTER SET ANY_CS) RETURN RAW
用來把字串轉為raw。由於傳入的varchar2必然受到32767位元組長度的限制。
SQL> set serveroutput on size 2000;
SQL>
SQL> declare
2 b_blob blob;
3 c_clob varchar2(32767);
4 begin
5 for i in 1..32767 loop
6 c_clob := c_clob ||'a';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
32767
32767
PL/SQL procedure successfully completed
SQL>
SQL> declare
2 b_blob blob;
3 c_clob varchar2(32767);
4 begin
5 for i in 1..32767 loop
6 c_clob := c_clob ||'a';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
32767
32767
PL/SQL procedure successfully completed
但把 c_clob varchar2(32767) 換為 c_clob clob會怎樣呢
SQL> declare
2 b_blob blob;
3 c_clob clob;
4 begin
5 for i in 1..32767 loop
6 c_clob := c_clob ||'a';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
ORA-06502: PL/SQL: 數字或值錯誤
ORA-06512: 在 line 10
2 b_blob blob;
3 c_clob clob;
4 begin
5 for i in 1..32767 loop
6 c_clob := c_clob ||'a';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
ORA-06502: PL/SQL: 數字或值錯誤
ORA-06512: 在 line 10
SQL> declare
2 b_blob blob;
3 c_clob clob;
4 begin
5 for i in 1..16383 loop -- 修改這兒的長度(如果16384就會報錯)
6 c_clob := c_clob ||'a';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
16383
16383
PL/SQL procedure successfully completed
2 b_blob blob;
3 c_clob clob;
4 begin
5 for i in 1..16383 loop -- 修改這兒的長度(如果16384就會報錯)
6 c_clob := c_clob ||'a';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
16383
16383
PL/SQL procedure successfully completed
我們再來試試中文如何
SQL> declare
2 b_blob blob;
3 c_clob clob;
4 begin
5 for i in 1..16383 loop
6 c_clob := c_clob ||'鄧';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
16383
32766
PL/SQL procedure successfully completed
2 b_blob blob;
3 c_clob clob;
4 begin
5 for i in 1..16383 loop
6 c_clob := c_clob ||'鄧';
7 end loop;
8 dbms_output.put_line(dbms_lob.getlength(c_clob));
9 b_blob := utl_raw.cast_to_raw(c_clob);
10 dbms_output.put_line(dbms_lob.getlength(b_blob));
11 end;
12 /
16383
32766
PL/SQL procedure successfully completed
看來cast_to_raw對於clob的型別最大是支援16383字元長度(一個漢字只當一個字元長度)。
2) DBMS_LOB中
PROCEDURE convertToBlob(dest_lob IN OUT NOCOPY BLOB,
src_clob IN CLOB CHARACTER SET ANY_CS,
amount IN INTEGER,
dest_offset IN OUT INTEGER,
src_offset IN OUT INTEGER,
blob_csid IN NUMBER,
lang_context IN OUT INTEGER,
warning OUT INTEGER);
src_clob IN CLOB CHARACTER SET ANY_CS,
amount IN INTEGER,
dest_offset IN OUT INTEGER,
src_offset IN OUT INTEGER,
blob_csid IN NUMBER,
lang_context IN OUT INTEGER,
warning OUT INTEGER);
SQL> declare
2 b_blob blob;
3 c_clob clob;
4 l_lang NUMBER := DBMS_LOB.default_lang_ctx;
5 i_dest_offset number := 1;
6 i_src_offset number :=1;
7 l_warning NUMBER;
8 begin
9 DBMS_LOB.CREATETEMPORARY(b_blob,TRUE,2);
10 for i in 1 .. 40000 loop
11 c_clob := c_clob || '鄧';
12 end loop;
13 dbms_output.put_line(dbms_lob.getlength(c_clob));
14 dbms_lob.convertToBlob(b_blob,
15 c_clob,
16 dbms_lob.lobmaxsize,
17 i_dest_offset,
18 i_src_offset,
19 DBMS_LOB.default_csid,
20 l_lang,
21 l_warning);
22 dbms_output.put_line(dbms_lob.getlength(b_blob));
23 end;
24 /
40000
80000
2 b_blob blob;
3 c_clob clob;
4 l_lang NUMBER := DBMS_LOB.default_lang_ctx;
5 i_dest_offset number := 1;
6 i_src_offset number :=1;
7 l_warning NUMBER;
8 begin
9 DBMS_LOB.CREATETEMPORARY(b_blob,TRUE,2);
10 for i in 1 .. 40000 loop
11 c_clob := c_clob || '鄧';
12 end loop;
13 dbms_output.put_line(dbms_lob.getlength(c_clob));
14 dbms_lob.convertToBlob(b_blob,
15 c_clob,
16 dbms_lob.lobmaxsize,
17 i_dest_offset,
18 i_src_offset,
19 DBMS_LOB.default_csid,
20 l_lang,
21 l_warning);
22 dbms_output.put_line(dbms_lob.getlength(b_blob));
23 end;
24 /
40000
80000
結論:字元轉換為位元組:對於小於32767的字串可以使用utl_raw包;對於超長的字元必須使用dbms_lob包.
注:要計算CLOB的位元組長度,要先轉換為blob型別,再用dbms_lob.getlength來計算長度.
lengthb是不支援CLOB和NCLOB的.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-680474/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Blob 轉換為ClobOracle
- Base64與BLOB 轉換函式函式
- ORA-22835: 緩衝區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小
- BLOB及CLOB欄位處理
- clob和字串之間的轉換字串
- Mysql BLOB、BLOB與TEXT區別及效能影響、將BLOB型別轉換成VARCHAR型別MySql型別
- JDBC複習,oracle的blob,clob的讀寫-zhaiJDBCOracleAI
- 用JDBC操縱BLOB和CLOB資料JDBC
- JDBC 處理CLob和Blob型別資料JDBC型別
- Oracle 中LONG RAW BLOB CLOB型別介紹Oracle型別
- Blob實現與File DataURL canvas相互轉換示例詳解Canvas
- 如何檢視ORACLE的LOB(BLOB和CLOB)物件佔用的大小Oracle物件
- Oracle Long型別轉換為Clob型別Oracle型別
- 初探JavaScript PDF blob轉換為Word docx方法JavaScript
- 表存在Clob、Blob欄位,dblink報錯的解決辦法
- oracle blob_clob列的表如何指定sement_name及index nameOracleIndex
- BLOB和CLOB的區別以及在ORALCE中的插入和查詢操作
- 使用SQL*Loader匯入CLOB和BLOB資料使用案例SQL
- 前端圖片canvas,file,blob,DataURL等格式轉換前端Canvas
- 熊與猴的轉換(轉)
- VARCHAR2轉換為CLOB碰到ORA-22858錯誤
- Oracle blob型別資料轉換成 base64編碼Oracle型別
- (轉)CWnd與HWND的區別與轉換
- oracle對BLOB型別資料的操作與效能問題(轉載)Oracle型別
- 如何更換Azure SQL DB blob storage credentialsSQL
- [20130301]clob欄位的empty_clob與NULL.txtNull
- RGB與YIQ的轉換
- 程式的狀態與轉換
- XML與DataSet的相互轉換XML
- Swift3.0語言教程字串與URL的資料轉換與自由轉換Swift字串
- 關於SQL Server通過OLEDB訪問ORACLE資料表涉及CLOB或BLOB欄位的錯誤提示SQLServerOracle
- hibernate中Blob,Clob欄位類行,二級快取的問題,哪位老大來指點指點快取
- java型別轉換與強制型別轉換(轉)Java型別
- Torrent檔案的解析與轉換
- NSData與UIImage之間的轉換UI
- 基類與派生類的轉換
- ascii碼與字元的相互轉換ASCII字元
- 旋轉矩陣與尤拉角的相互轉換矩陣