Oracle Database SQL Language Reference 笔记(3)—— 伪列(续)

来源:互联网 发布:ubuntu 禁用访客 编辑:程序博客网 时间:2024/06/14 21:21


前面已经学习过 Oracle 伪列的种类:

  • 与树状结构查询语句相关的伪列(包括 CONNECT_BY_ISCYCLE、CONNECT_BY_ISLEAF 和 LEVEL);
  • 与序列对象相关的伪列(CURRVAL和NEXTVAL);
  • 与版本控制相关的伪列(ORA_ROWSCN、VERSIONS_STARTSCN、VERSIONS_STARTTIME、VERSIONS_ENDSCN、VERSIONS_ENDTIME、VERSIONS_XID、VERSIONS_OPERATION);
  • 与嵌套表数据相关的伪列(COLUMN_VALUE);
  • 与对象数据表相关的伪列(OBJECT_ID、OBJECT_VALUE);
  • 与数据行相关的伪列(ROWID、ROWNUM)。


3、与版本控制相关的伪列

包括ORA_ROWSCN、VERSIONS_STARTSCN、VERSIONS_STARTTIME、VERSIONS_ENDSCN、VERSIONS_ENDTIME、VERSIONS_XID、VERSIONS_OPERATION等伪列。

这些伪列仅仅在 Oracle 的闪回版本查询语句中可用(Flashback Version Query)。

说到 Oracle 的 Flashback 功能(从 Oracle 10g 开始),主要包括四种类型:

  • Flashback Database,可以把整个数据库回退到过去的某个时点的状态。
  • Flashback Drop,用于恢复用户误删除的对象(包括表,索引等)。
  • Flashback Query,又分Flashback Query,Flashback Version Query, Flashback Transaction Query 三种
    • Flashback Query,利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据
    • Flashback Version Query,可以看到过去某个时间段内,记录是如何发生变化的(Flashback Query 只能看到一点的状态)
    • Flashback Transaction Query,可以查看某个事务执行的所有变化
  • Flashback Table。

对于这几种 Flashback 功能和前述伪列的作用,具体可参考cnblogs上的这篇博文,以及itpub上这篇博文中的详细描述。


4、与嵌套表数据相关的伪列(COLUMN_VALUE)(暂略)

5、与对象数据表相关的伪列(OBJECT_ID、OBJECT_VALUE)(暂略)

6、与数据行相关的伪列(ROWID、ROWNUM)

这是我们见得最多也最常用的伪列,其中 ROWID 返回每个数据行的物理地址,而 ROWNUM 用于返回检索集的数据行号。

ROWID 伪列返回的值是ROWID或UROWID类型,其中ROWID类型是普通的以堆方式存储数据表行的地址,由数据对象编号、数据行在数据文件中的数据块地址、数据行在数据块中的编号,以及数据所在数据文件的编号组成。而UROWID是索引组织方式存储数据表以及外部表行的地址。

其格式为18个64进制数字,这些数字由'A~Z'(对应十进制0~25)、'a~z'(对应十进制26~51)、'0~9'(对应十进制52~61)、+(对应十进制62)、/(对应十进制63)来表示。这18位64进制数字中(从左至右):前6位表示数据对象编号,转换成十进制后对应 DBA_OBJECTS 中的某个 DATA_OBJECT_ID,第7至9位表示对应表空间相应的文件编号,第10至15位表示数据文件中的数据块编号,最后3位表示在数据块中的记录(行)编号。

例如:

scott@ORA11G> select rowid from emp_flash;

ROWID
------------------
AAASoOAAEAAAQ5TAAA
AAASoOAAEAAAQ5TAAB
AAASoOAAEAAAQ5TAAC
AAASoOAAEAAAQ5TAAD
AAASoOAAEAAAQ5TAAE
AAASoOAAEAAAQ5TAAF
AAASoOAAEAAAQ5TAAG
AAASoOAAEAAAQ5TAAH
AAASoOAAEAAAQ5TAAI
AAASoOAAEAAAQ5TAAJ
AAASoOAAEAAAQ5TAAK
AAASoOAAEAAAQ5TAAL
AAASoOAAEAAAQ5TAAM
AAASoOAAEAAAQ5TAAN
AAASoOAAEAAAQ5TAAO

其中第一行数据的 rowid 表示对象编号为 AAASoO,表空间文件号为 AAE,数据块编号是 AAAQ5T,数据是数据块中第 AAA 个记录。

可以用下面的语句来查询相应的编码数据:

scott@ORA11G> select dbms_rowid.rowid_object(rowid) obj#,dbms_rowid.rowid_relative_fno(rowid) rfile#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid) row#,dbms_rowid.rowid_to_absolute_fno(rowid,'SCOTT','EMP_FLASH') file# from emp_flash;

OBJ# RFILE# BLOCK# ROW# FILE#
---------- ---------- ---------- ---------- ----------
76302 4 69203 0 4
76302 4 69203 1 4
76302 4 69203 2 4
76302 4 69203 3 4
76302 4 69203 4 4
76302 4 69203 5 4
76302 4 69203 6 4
76302 4 69203 7 4
76302 4 69203 8 4
76302 4 69203 9 4
76302 4 69203 10 4
76302 4 69203 11 4
76302 4 69203 12 4
76302 4 69203 13 4
76302 4 69203 14 4

可以看见 OBJECT_ID 为76302,通过以下语句从 dba_objects 中查询(需要具有 dba 权限的用户)

system@ORA11G> select owner,object_name,object_id,object_type from dba_objects where object_id=76302;


OWNER OBJECT_NAME OBJECT_ID OBJECT_TYPE
------------- ---------------------------------------------------
SCOTT EMP_FLASH     76302 TABLE


表空间相对文件号为 4,通过以下语句查询具体对应哪个文件

system@ORA11G> select file_name,tablespace_name from dba_data_files where relative_fno=4;

FILE_NAMETABLESPACE_NAME
---------------- -------------------
/home/u01/app/oracle/oradata/ora11g/users01.dbf USERS

利用这些信息可以查看 dump 文件信息,具体操作方法请参考新浪博客的这篇博文。





0 0
原创粉丝点击