程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle 中LONG RAW BLOB CLOB類型介紹

Oracle 中LONG RAW BLOB CLOB類型介紹

編輯:Oracle教程

Oracle 中LONG RAW BLOB CLOB類型介紹


RAW: 未加工類型,可存儲二進制數據或字節符  LONG: 可變長的字符串數據,最長2G,LONG具有VARCHAR2列的特性,可以存儲長文本一個表中最多一個LONG列【不建議使用】  LONG RAW: 可變長二進制數據,最長2G 【不建議使用】  CLOB: 字符大對象Clob 用來存儲單字節的字符數據;大型文本,例如XML數據。  NCLOB: 用來存儲多字節的字符數據  BLOB: 用於存儲二進制大對象數據;例如數碼照片;  BFILE: 存儲在文件中的二進制數據,這個文件中的數據只能被只讀訪。但該文件不包含在數據庫內。  bfile字段實際的文件存儲在文件系統中,字段中存儲的是文件定位指針.bfile對Oracle來說是只讀的,也不參與事務性控制和數據恢復.      CLOB,NCLOB,BLOB都是內部的LOB(Large Object)類型,最長4G,沒有LONG只能有一列的限制 注意: LONG 和 LONG RAW在Oracle新版已不推薦使用(使用BLOB替代),只是為了向後兼容而保留著。   本文著重介紹:RAW/CLOB/BLOB   1、RAW類型  1.1 介紹  You use the RAW datatype to store binary data or byte strings. For example, a RAW  variable might store a sequence of graphics characters or a digitized picture. Raw data  is like VARCHAR2 data, except that PL/SQL does not interpret raw data. Likewise,  Oracle Net does no character set conversions when you transmit raw data from one  system to another.  The RAW datatype takes a required parameter that lets you specify a maximum size up  to 32767 bytes. The syntax follows:  RAW(maximum_size)  You cannot use a symbolic constant or variable to specify the maximum size; you must  use an integer literal in the range 1 .. 32767.  You cannot insert RAW values longer than 2000 bytes into a RAW column. You can insert  any RAW value into a LONG RAW database column because the maximum width of a  LONG RAW column is 2147483648 bytes or two gigabytes. However, you cannot retrieve  a value longer than 32767 bytes from a LONG RAW column into a RAW variable. Note  that the LONG RAW datatype is supported only for backward compatibility; see “LONG  and LONG RAW Datatypes” on page 3-5 for more information. RAW英語的意思為:生的;未加工的;  你可以使用RAW類型存儲二進制數據或字節符。例如,一個RAW變量可以存儲一系列圖形字符或一張數碼照片。  RAW數據就像VARCHAR2數據,除了一點:PL/SQL不會對其進行解釋。同樣的,當你在傳輸RAW數據時,Oracle Net不會對其進行字符集轉換。 RAW數據類型要求指定一個最大值到32767的參數;   聲明格式如下: RAW(maximum_size)  你不能使用一個符號常量或變量來代替該參數而必須使用1..32767中的任一整數。 你不能往RAW列中插入超過2000字節的字符;  你可以往long raw列中插入任何raw數據,最大支持2G。然而,反過來則無法一次性取出超過32767字節的raw數據。 此處需要注意,long raw是早起版本的類型;現在已不建議使用;詳細見以下內容:   1.2 相關工具  –包  utl_raw –函數  utl_raw.cast_to_raw  utl_raw.cast_to_number  utl_raw.cast_to_varchar2  hextoraw RAW保存的為16進制數。當使用HEXTORAW時,會把字符串中數據當作16進制數。  而使用UTL_RAW.CAST_TO_RAW時,直接把字符串中每個字符的ASCII碼存放到RAW類型的字段中。 1.3 例子   drop table test_raw; create table test_raw(msg raw(2000)); SCOTT@orcl> insert into test_raw values('<xml><name>Dylan</name><score>100</score></xml>'); insert into test_raw values('<xml><name>Dylan</name><score>100</score></xml>') * 第 1 行出現錯誤: ORA-01465: 無效的十六進制數字 --這個地方注意是十六進制 SCOTT@orcl> insert into test_raw values(utl_raw.cast_to_raw('<xml><name>Dylan</name><score>100</score></xml>')); 已創建 1 行。   SCOTT@orcl> commit;   --查看 select msg from test_raw; MSG ------------------------------------------------------------------------------ 3C786D6C3E3C6E616D653E44796C616E3C2F6E616D653E3C73636F72653E3130303C2F73636F72 653E3C2F786D6C3E 0ABC   SCOTT@orcl> select utl_raw.cast_to_varchar2(msg) from test_raw;   UTL_RAW.CAST_TO_VARCHAR2(MSG) ------------------------------------------------------------------------------ <xml><name>Dylan</name><score>100</score></xml>2、LONG和LONG RAW類型 可以使用LONG類型存儲變長字符串。Long類型就像VARCHAR2一樣,除了LONG的最大容量為32760;   使用LONG RAW類型存儲二進制數據或字節字符串。LONG RAW數據就像LONG數據,除了LONG RAW數據不會被PL/SQL解釋。  LONG RAW的最大容量也為32760. 你可以往LONG列中插入任何LONG數據,最大長度為2G。然而,PL/SQL中的LONG類型變量只能支持到32760。  這條規則同樣適用於LONG RAW類型。 表中的LONG列可以存儲文本,字符數組,甚至短文檔。可以針對該類型列做UPDATE, INSERT, 和SELECT 操作。  但是無法再表達式,SQL函數調用或特定的SQL條件語句例如WHERE, GROUP BY和CONNECT BY。 In SQL statements, PL/SQL binds LONG values as VARCHAR2, not as LONG. However,  if the length of the bound VARCHAR2 exceeds the maximum width of a VARCHAR2  column (4000 bytes), Oracle converts the bind type to LONG automatically, then issues  an error message because you cannot pass LONG values to a SQL function SQL語句中, PL/SQL將LONG類型作為VARCHAR2類型綁定。然而,如果所綁定的VARCHAR2長度超出了4000,ORACLE會自動轉換到LONG,  然後拋出一個錯誤因為你不能將LONG值傳遞給SQL函數。 --例如: SCOTT@orcl> create table long_test(id number, msg long); 表已創建。   SCOTT@orcl> insert into long_test values(1,'hello world');   已創建 1 行。   SCOTT@orcl> commit;   提交完成。   SCOTT@orcl> select * from long_test where msg='123'; select * from long_test where msg='123' * 第 1 行出現錯誤: ORA-00997: 非法使用 LONG 數據類型 SCOTT@orcl> / ID MSG ---------- -------------------------------------------------------------------------------- 1 hello world SCOTT@orcl> select id, trim(msg) from long_test where id = 1; select id, trim(msg) from long_test where id = 1 * 第 1 行出現錯誤: ORA-00932: 數據類型不一致: 應為 NUMBER, 但卻獲得 LONG3、CLOB  可以使用CLOB類型大塊的字符數據。每一個CLOB變量存儲一個定位器,指向一個大塊字符數據。 CLOBs participate fully in transactions, are recoverable, and can be replicated. Changes  made by package DBMS_LOB can be committed or rolled back. CLOB locators can span  transactions (for reads only), but they cannot span sessions. CLOB參與整體事務,可恢復,並且可以重復。  由DBMS_LOB包改變的數據可以提交和回滾。CLOB定位器可以跨事務,但不能跨會話。 4、BLOB  You use the BLOB datatype to store large binary objects in the database, in-line or  out-of-line. Every BLOB variable stores a locator, which points to a large binary object.  BLOBs participate fully in transactions, are recoverable, and can be replicated. Changes  made by package DBMS_LOB can be committed or rolled back. BLOB locators can span  transactions (for reads only), but they cannot span sessions. 用於存儲大二進制對象,BLOB參與整體事務,可恢復,並且可以重復。  由DBMS_LOB包改變的數據可以提交和回滾。BLOB定位器可以跨事務,但不能跨會話。 drop table blob_test;   SCOTT@orcl> create table blob_test( id number primary key, content blob not null);   表已創建。   SCOTT@orcl> insert into blob_test values(1,'11111000011111');   已創建 1 行。   SCOTT@orcl> commit;   提交完成。   SCOTT@orcl> select * from blob_test;   SCOTT@orcl> set linesize 2000 SCOTT@orcl> / ID CONTENT ---------- ----------------------------------- 1 11111000011111 SCOTT@orcl> insert into blob_test values(1,'11111000011111>'); insert into blob_test values(1,'11111000011111>') * 第 1 行出現錯誤: ORA-01465: 無效的十六進制數字 SCOTT@orcl> update blob_test set content=to_blob('110010000110011') where id=1; 已更新 1 行。   SCOTT@orcl> rollback 2 ; 回退已完成。   SCOTT@orcl> select * from blob_test;   ID CONTENT ---------- --------------------------------------------------------------------- 1 11111000011111 delete from blob_test where id=1;  commit;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved