ROWID囊个提取信息

来源:互联网 发布:淘宝一件代销怎么发货 编辑:程序博客网 时间:2024/04/20 16:43
Oracle数据库的rowid,是数据库记录在数据库中的地址,通常rowid和记录是一一对应关系,当然了,如果是IOT表的记录不是这个样子。
通常我们所说的rowid是扩展rowid,它占10个字节(80bit),通常rowid的表示是64进制的18个字符的字符串,这个字符串的具体含义如下:

AAASZF        -      AAE               -    AAAACH       -    AAA                
对象号(6个字符)         相关文件号(3个字符)       块号(6个字符)       行号(3个字符)

SQL> conn scott/tiger
Connected.

SQL> select rowid,t.* from dept t;
ROWID                  DEPTNO DNAME          LOC
------------------ ---------- -------------- -------------
AAASZFAAEAAAACHAAA         10 ACCOUNTING     NEW YORK
AAASZFAAEAAAACHAAB         20 RESEARCH       DALLAS
AAASZFAAEAAAACHAAC         30 SALES          CHICAGO
AAASZFAAEAAAACHAAD         40 OPERATIONS     BOSTON

 

如果你想要获取rowid的具体信息比如说文件号、块号等,可以使用Oracle提供的包  DBMS_ROWID,使用则个包,我做了一个简单的存储过程

 

SQL> create or replace procedure get_rowid(rid varchar2)
  2  is
  3  begin
  4  for x in
  5  ( select DBMS_ROWID.ROWID_OBJECT(rid) objno,
  6           DBMS_ROWID.ROWID_RELATIVE_FNO(rid) rfno,
  7           DBMS_ROWID.ROWID_BLOCK_NUMBER(rid) blockno,
  8           DBMS_ROWID.ROWID_ROW_NUMBER(rid) rownumber
  9    From dual
 10   )
 11 
 12  loop
 13      dbms_output.put_line( 'Object No: ' || x.objno );
 14      dbms_output.put_line( 'R Fno: ' || x.rfno );
 15      dbms_output.put_line( 'Block Number: ' || x.blockno );
 16      dbms_output.put_line( 'Row Number: ' || x.rownumber );
 17  end loop;
 18  end;
 19  /

Procedure created.

SQL> set serveroutput on

SQL> exec get_rowid('AAASZFAAEAAAACHAAA');
Object No: 75333
R Fno: 4
Block Number: 135
Row Number: 0

PL/SQL procedure successfully completed.