概述
DBMS_ROWID包允許我們使用PL/SQL程序或SQL語句創建rowids和獲取rowid的信息。例如可以通過其找到數據對象編號,數據文件編號,包含數據行的數據塊編號及數據塊中的數據行。該包從Oracle 8.X開始可用。
這個包在11gR2中有11個函數或存儲:
1、 根據給定參數返回一個rowid
--根據給定參數返回一個rowid FUNCTION rowid_create(rowid_type IN NUMBER,--rowid類型,0:restricted,1:extended object_number IN NUMBER,--對象id relative_fno IN NUMBER,--關聯文件 block_number IN NUMBER,--數據塊id row_number IN NUMBER)--行號 RETURN ROWID;
2、根據rowid返回相關參數
--根據rowid返回相關參數 ROCEDURE rowid_info(rowid_in IN ROWID,--rowid rowid_type OUT NUMBER,--rowid類型 object_number OUT NUMBER,--對象id relative_fno OUT NUMBER,--相關文件 block_number OUT NUMBER,--數據塊id row_number OUT NUMBER,--行號 ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE');--表空間類型,BIGFILE:大文件表空間,SMALLFILE:傳統表空間
3、 通過rowid返回rowid類型
--通過rowid返回rowid類型 function rowid_type(row_id IN rowid) --rowid return number;
4、通過rowid提取數據文件編號
--通過rowid提取數據文件編號 function rowid_object(row_id IN rowid) --rowid return number;
5、通過rowid提取相關文件編號
--通過rowid提取相關文件編號 FUNCTION rowid_relative_fno(row_id IN ROWID,--rowid ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE')--表空間類型 RETURN NUMBER;
6、 通過rowid提取數據塊編號
--通過rowid提取數據塊編號 FUNCTION rowid_block_number(row_id IN ROWID,--rowid ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE')--表空間類型 RETURN NUMBER;
7、通過rowid提取行號
--通過rowid提取行號 function rowid_row_number(row_id IN rowid)--rowid return number;
8、 通過rowid和給定表,提取相關文件編號
--通過rowid和給定表,提取相關文件編號 FUNCTION rowid_to_absolute_fno(row_id IN ROWID,--rowid schema_name IN VARCHAR2,--擁有者 object_name IN VARCHAR2) --對象名 RETURN NUMBER;
9、 轉換一個restricted rowid為一個extended rowid
--轉換一個restricted rowid為一個extended rowid. --如果原始的rowid存儲在列中,轉換的 就是internal類型; --如果原始的rowid是以字符串形式存儲的,那轉換的就是external類型 FUNCTION rowid_to_extended(old_rowid IN ROWID,--rowid schema_name IN VARCHAR2,--擁有者 object_name IN VARCHAR2,--對象名 conversion_type IN INTEGER)--轉換類型,0:轉換restricted internal rowid為extended格式 --轉換類型,1:轉換restricted external rowid為extended格式
10、 轉換一個exteneded的rowid為一個restricted的rowid
--轉換一個exteneded的rowid為一個restricted的rowid --restricted的rowid格式為BBBBBBB.RRRR.FFFFF, --BBBBBBB 代表block --RRRR 代表在block中的行號,從0開始 --FFFFF 代表文件號。 --這個包可以使用rowid或者rowid轉換類型(ROWID_CONVERT_INTERNAL (0)和ROWID_CONVERT_EXTERNAL (1)) FUNCTION rowid_to_restricted(old_rowid IN ROWID,--rowid conversion_type IN INTEGER)--rowid_convert_internal := 0; --rowid_convert_external := 1; RETURN ROWID;
11、 驗證rowid 有效性
--驗證rowid是否有效 FUNCTION rowid_verify(rowid_in IN ROWID,--rowid schema_name IN VARCHAR2,--擁有者 object_name IN VARCHAR2,--對象名 conversion_type IN INTEGER)--rowid_convert_internal := 0; --rowid_convert_external := 1; RETURN NUMBER;
實用函數:使用dbms_rowid包獲得rowid的詳細信息
create or replace function get_rowid (l_rowid in varchar2) return varchar2 is ls_my_rowid varchar2(200); rowid_type number; object_number number; relative_fno number; block_number number; row_number number; begin dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number); ls_my_rowid := 'Object# is :'||to_char(object_number)||chr(10)|| 'Relative_fno is :'||to_char(relative_fno)||chr(10)|| 'Block number is :'||to_char(block_number)||chr(10)|| 'Row number is :'||to_char(row_number); return ls_my_rowid ; end; /
1、創建函數
2、獲取rowid
3、查看rowid詳細信息