[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > Oracle > 正文
oralce names server 簡介
不詳 (2001-05-14 07:28:01)

0、LARGE OBJECT  
ORACLE8中有4種LOB 
- BLOB:Binary Large Object 
- CLOB:Character Large Object 
- NCLOB:固定長度的多字節Character Large Object 
- BFILE:DB外部的二進制文件 
它們分為兩類: 
內部LOB:存放在DB內部,包括BLOB,CLOB,BCLOB 
外部文件:存放在DB外面,就是BFILE 

要注意的是ORACLE8不自動轉換這些類型的數據。 

1、LONG和LOB的比較 
LONG/LONG RAW LOB 
-------------------------------------------------- 
表中只能由一個列 可以有多列 
最大2G 最大4G 
SELECT返回值 SELECT返回指針 
存放在DB內 可以在DB的內或者外 
不支持OBJECT類型 支持 
順序存取 隨機存取 
-------------------------------------------------- 

NCLOB不支持OBJECT類型 
LOB小4000字節時是內部存放 

2、LOB解析 
LOB有兩個不同的部分 
- LOB值:LOB代表的數據 
- LOB指針:LOB存放數據的位置 
LOB列內部不存放數據,而是LOB值的位置。當創建內部LOB時,值存放在LOB SEGMENT中,指向OUT-OF-LIN數據的指針放在列中。對外部LOB,只在列中存放位置。 

3、內部LOB 
就是存放在DB內部的LOB,包括BLOB,CLOB,NCLOB。它們可以是 
用戶自定義的類型中的屬性 
表中某列 
SQL 變量 
程序host變量 
PL/SQL中的變量、參數、返回值 

內部LOB可以使用ORACLE的並發機制、REDO LOG、RECOVERY機制。 
BLOB被ORACLE8解釋為二進制位流,類似LONG RAW。 
CLOB解釋為單字節字符流 
NCLOB是固定的多字節字符流,基DB NATIONAL字符集的字節長度。 

例子: 
CREATE TYPE picture_typ AS OBJECT (image BLOB); 

CREATE TABLE person_tab 
( pname VARCHAR2(20), 
  RESUME CLOB, 
  picture picture_typ 
); 

上面的語句完成,數據將存放在5個物理SEGMENT中。 
- TABLE person_tab在缺省TABLESPACE, 
- RESUME存放的LOB SEGMENT  
- PICTURE存放的LOB SEGMENT 
- 標示RESUME存放位置的LOB INDEX SEGMENT 
- 標示PICTURE存放位置的LOB INDEX SEGMENT 
LOB INDEX是隱式創建的。 

當INSERT或者OBJECT CACHE中的OBJECT刷新到SERVER時,LOB生成。可以使用DBMS_LOB包和OCI來處理LOB。當ROW刪除時,相應的內部LOB也會刪除。UPDATE必須處理整個LOB值,不能UPDATE其中的一部分。 

4、內部LOB的存儲參數 
具體語法可以參見ORACLE文檔, 
LOB ( lob項,...) STORE AS lob_segment_name  
CHUNK integer 
PCTVERSION integer 
CACHE 
NOCACHE LOGGING/NOLOGGING 
TABLESPACE tablespace_name 
STORAGE storage子句 
INDEX INDEX字句 

lob_segment_name:缺省式LOB$n 
CHUNK:連續分配在一起的BLOCK數目,存放連續的LOB數據。這些CHUNK的數據存放在LOB INDEX裡面,使用內部LOB標示和LOB值作為鍵。 
PCTVERSION:LOB一致讀需要的系統空間。一旦LOB申請超過PCTVERSION的值,ORACLE就會收舊的空間並REUSE之。 
CACHE:使用SGA區的DB BUFFER CACHE處理LOB的READ/WRITE。 
NOCACHE LOGGING:不使用SGA區的BUFFER,數據的改變紀錄到REDO LOG。 
  存取LOB比較頻繁時,使用CACHE 
    存取LOB不頻繁時,使用NOCACHE 
NOCACHE NOLOGGING:不使用SGA區的BUFFER和REDO LOG 
   
INDEX子句 
INDEX  lob_index_segtment_name  
INITTRANS integer 
MAXTRANS integer 
TABLESPACE tablespace_name 
STORAGE storage子句 

如果沒有設置LOB存儲參數和INDEX STROAGE,則採用如下缺省值 
CHUNK=1 DB_BLOCK 
PCTVERSION=10 
NOCACHE 
NOLOGGING 

例子: 
CREATE TABLE APARTMENTS (  
floor_plan BLOB, 
contract  CLOB, 
name VARCHAR2(10)) 
LOB (floor_plan, contract)STORAGE AS( 
 STORAGE (INITIAL 100K NEXT 100K PCTINCREASE 0) 
CHUNK 10 
PCTVERSION 20 
NOCACHE 
NOLOGGING 
INDEX (INITIAL 100K NEXT 100K) 
); 

5、內部LOB的並發 
LOB的讀一致和其他ORACLE類型一樣,但是它是在CHUNK級別上作VERSION的。 

6、外部LOB 
ORACLE8允許定義BFILE類型,可以把外部文件和BFILE對象連接起來,同時能提供BFILE的安全機制。 
BFILE對處理不需要transaction控制的OS文件很有用處。 
對BFILE的處理需要DBMS_LOB或者OCI。 
BFILE必須是READ-ONLY的,文件應該放在ORACLE能存取的地方。如果刪除BFILE對象,外部文件並不刪除。 
例子: 
CREATE TABLE home_page( 
 EMPLOYEE REF EMPLOYEE_TYP, 
LAST_UPDATE DATE, 
HOMEPAGE BFILE); 

CREATE TYPE personal_info_typ AS OBJECT  
( EMPLOYEE REF employee_typ, 
 PICTURE BFILE, 
 THUMBPRINT BFILE, 
 REINAPRINT BFILE 
); 

其實在BFILE對應的列或者屬性中存放的是BFILE的位置,即是物理文件的位置。 
讀BFILE不通過SGA. 

7、BFILE的安全 
ORACLE8提供安全機制。文件必須和DB在一台機器上,讀取不存在文件的timeout由os決定。可以和內部LOB的讀取方法一致,但是必須注意:文件的權限、文件系統空間限制、其他對文件的維護、OS允許的最大文件大小。 
ORACLE8不對BFILE採取TRANSACTION的支持,ORACLE的BACKUO和RECOVERY也不支持BFILE。 


8、目錄DIRECTORY 
這是ORACLE為了管理BFILE引入的新元素,它指定SERVER文件系統的目錄,可以把文件系統的目錄抽象為數據庫對象,更具有靈活性。 
DIRECTORY由DBA建立,系統用戶擁有,通過GRANT/REVOKE來確定哪些用戶有權限。 

CREATE OR REPLACE DIRECTORY 目錄名 AS 路徑名 
DROP DIRECTORY 目錄名 

存取BFILE在如下情況時候產生異常: 
-用戶沒有操作DIRECTORY的權限 
-DIRECTORY所對應的物理目錄不存在,或者沒有存取該目錄的權限。 
-文件不存在 

文件和權限的檢查是在文件存取時候檢查的,創建時候並不報錯。 
不支持邏輯路徑 

系統新增加了CREATE ANY DIRECTORY和DROP  ANY DIRECTORY。對DIRECTORY授權只有READ。 

對CREATE DIRECTORY和GRANT READ ON DIRECTORY是可以AUDIT的。 

8、DIRECTORY建立的原則 
DIRECTORY不要和DB DATAFILE在相同的目錄下。 
要有選擇的賦予CREATE ANY DIRECTORY和DROP ANY DIRECTORY ROLE。 
在建立之前要在OS級別上設置權限。 
如果移植DB到其他機器,需要注意DIRECTORY的路徑是否改變。 

9、管理LOB 
ORACLE 通類似文件操作一樣的接口:DBMS_LOB, OCI8。同時還有SQL語句的一些支持。 
管理LOB的一般方法: 
1)CREATE/POPULATE 包含LOB的TABLE, 
2)在程序中DECLARE AND INITIALIZE LOB Locator 
3)用SELECT FOR UPDATE 鎖定包含LOB的ROW, 
4)用DBMS_LOB或者OCI維護相關LOB值 
5)COMMIT 

管理BFILE的一般方法 
1)建立OS目錄,授予ORACLE 用戶READ的權限 
2)把文件放到該目錄 
3)建立包含BFILE的TABLE 
4)建立DIRECTORY,用GRANT授權 
5)在TABLE中INSERT與文件相關的值 
6)在程序中聲明LOB Locator 
7)取得包含LOB Locator的行 
8)用DBMS_LOB和OCI讀取BFILE 

10、LOB的操作 
可以用SQL、PL/SQL、3GL中嵌入式SQL或者OCI中的變量值直接INSERT 到LOB中。 

可以用其他的LOB、NULL或者EMPTY_CLOB()/EMPTY_BLOB()的值UPDATE LOB。當把一個LOB賦給另一個時,其實是新建了一個LOB。這些操作不需要SELECT FOR UPDATE。只有在更新LOB的其中一部分的時候才需要先LOCK。 
ORACLE8不會自動轉換CLOB和BLOB。 
最好的辦法是OCILobWrite,以為它使用ORACLE的流機制,最快、使用更好的空間和REDO。 

刪除LOB的方法 
DELETE .... 
TRUNCATE TABLE.... 
DROP TABLE ... 
刪除注意在OS級別上刪除相關文件。 
如果只是要去掉LOB的Locator,可以用NULL或者空字符串''來UPDATE。 

11、DBMS_LOB包 
DBMS_LOB包用SYS用戶提交DBMSLOB.SQL和PRVTLOB.PLB腳本。它們包含在CATPROC.SQL中。用戶要授權才能使用它。匿名BLOCK中的DBMS_LOB例程使用當前用戶的權限。STORED PROCEDURE中的DBMS_LOB調用使用其所有者的權限。 
它不支持BFILE的並發控制機制。 
你必須控制LOB的LOCK,DBMS_LOB不會隱式的LOCK LOB所在的ROW。 
DBMS_LOB.LOBMAXSIZE = 4G 

包含兩類操作 
1)APPEND、COPY, EARSE,TRIM,WRITE,FILECLOSE,FILECLOSEALL,FILEOPEN,LOADFROMFILE 
2)COMPARE,FILEGETNAME.INSTR,GETLENGTH,READ,SUBSTR,FILEEXISTS,FILEISOPEN 

DBMS_LOB的任何參數為NULL,則返回值為NULL. 
如果目標LOB/BFILE=NULL,將觸發異常。 
BLOB/BFILE的OFFSET以BYTE為單位,CLOB/NCLOB以字符為單位。且不能為負值,否則會觸發異常。缺省OFFSET為1。 
參數不能為負值。 

PROCEDURE APPEND(DEST_LOB, SRC_LOB); 
把一個LOB加到另一個LOB中。 
FUNCTION COMPARE(L1, L2, AMOUNT, OFFSET1,OFFSET2) 
  =0  ,相同 
 =-1,第一個小 
 =1,第一個大 

12、系統管理方面的問題 
EXPORT/IMPORT支持LIBRARY和DIRECTORY,支持LOB。 
IMPORT轉換EXPORT文件中的CLOB到當前缺省的字符集。NCLOB轉換到當前Nationanl字符集。BLOB不轉換。 
BFILE不能EXP/IMP。只有BFILE的名字和DIRECTORY被EXPORT出來。  (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★