当前位置: 代码迷 >> 综合 >> DM8伪列的使用
  详细解决方案

DM8伪列的使用

热度:99   发布时间:2024-02-21 08:43:07.0

 伪列概述

DM伪列在语法上和表中的列很相似,查询时能返回一个值,但实际上伪列在表中并不存在。用户可以对伪列进行查询,但不能插入、更新和删除它们的值。DM支持的伪列有:ROWNUM,ROWID,USER,UID,TRXID等。

  • rowid

DM 中行标识符 ROWID 用来标识数据库基表中每一条记录的唯一键值,标识了数据记录的确切的存储位置。如果用户在选择数据的同时从基表中选取 ROWID,在后续的更新语句中,就可以使用 ROWID 来提高性能。如果在查询时加上 FOR UPDATE 语句,该数据行就会被锁住,以防其他用户修改数据,保证查询和更新之间的一致性。

SQL> select employee_id,employee_name,salary,rowid from DMHR.EMPLOYEE where rowid = 2; 行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWID               
---------- ----------- ------------- ----------- --------------------
1          1002        程擎武     9000        2已用时间: 54.530(毫秒). 执行号:1920.
SQL> update DMHR.EMPLOYEE set salary = 10000 where rowid = 2;
影响行数 1已用时间: 77.662(毫秒). 执行号:1921.
SQL> commit;
操作已执行
已用时间: 35.668(毫秒). 执行号:1922.
SQL> select employee_id,employee_name,salary,rowid from DMHR.EMPLOYEE where rowid = 2;行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWID               
---------- ----------- ------------- ----------- --------------------
1          1002        程擎武     10000       2已用时间: 0.732(毫秒). 执行号:1923.
SQL> 
  • rownum

rownum表示从表中查询或者连接查询的行号,值为1...N,N是行的数量。rownum一个重要作用是:限制查询返回行数。例如,我们只想看到前5行数据,可以这样写:

select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum <= 5;

 特点一:一个rownum值不是被永久的分配给一行数据的。表中的某一行并没有标号,不可以查询rownum为某个值的行。rownum值只有当被分配之后才会增长,初始值为1。只有满足一行后,rownum才会加1,否则维持原值不变。因此,以下语句在任何时候都不能返回数据:

select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum > 5;
select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum = 5;

特点二:rownum值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的.因此,在排序和聚合使用 ROWNUM 时需要注意,可能得到并非预期的结果。例如,我们要查询工资最高的5个人的信息:

SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum <= 5 order by salary desc;行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWNUM              
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       1
2          1003        郑吉群     15000       3
3          1004        陈仙        12000       4
4          1005        金纬        10000       5
5          1002        程擎武     10000       2已用时间: 2.738(毫秒). 执行号:1938.
SQL> 

 以上语句只会对EMPLOYEE表前5行按工资排序输出,并不是按表的所有数据排序后输出前5行,要实现后者,需要使用以下语句:

select * from (select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE order by salary desc) where rownum <= 5;

或者

select top 5 employee_id,employee_name,salary,rownum from DMHR.employee order by salary desc;

 rownum的使用存在以下限制:

1.在查询中,ROWNUM 可与任何数字类型表达式进行比较及运算,但不能出现在含OR 的布尔表达式中,否则报错处理;
2.ROWNUM 可以在非相关子查询中使用;当参数 ENABLE_RQ_TO_INV 等于 1 时,部分相关子查询支持使用;
3.在非相关子查询中,ROWNUM只能实现与TOP相同的功能,因此子查询不能含ORDER BY 和 GROUP BY; 4.ROWNUM 所处的子谓词只能为如下形式: ROWNUM op exp,exp 的类型只能是立即数、参数和变量值,op ∈ {<, <=, >, >=, =, <>}。

  • uid和user

user和 uid分别用来表示当前用户的用户名和用户标识。

SQL> select top 5 employee_id,employee_name,salary,user,uid from DMHR.employee order by salary desc;行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      USER() UID        
---------- ----------- ------------- ----------- ------ -----------
1          1001        马学铭     30000       SYSDBA 50331649
2          3001        苏国华     30000       SYSDBA 50331649
3          7001        郑晓同     30000       SYSDBA 50331649
4          7241        高念        19990       SYSDBA 50331649
5          7240        陈珂        19980       SYSDBA 50331649已用时间: 1.021(毫秒). 执行号:1956.
SQL> select user(),uid;行号     USER() UID        
---------- ------ -----------
1          SYSDBA 50331649已用时间: 55.743(毫秒). 执行号:1957.
SQL>
  •  trxid

trxid用来表示当前事务的事务标识。

SQL> select top 5 employee_id,employee_name,salary,trxid from DMHR.employee order by salary desc;行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      TRXID               
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       3882
2          3001        苏国华     30000       3877
3          7001        郑晓同     30000       3877
4          7241        高念        19990       3877
5          7240        陈珂        19980       3877已用时间: 29.561(毫秒). 执行号:1960.
SQL>
  • sessid

SESSID 用来表示当前会话的 ID 标识。

SQL> select top 5 employee_id,employee_name,salary,sessid from DMHR.employee order by salary desc;行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      SESSID              
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       139625026624328
2          3001        苏国华     30000       139625026624328
3          7001        郑晓同     30000       139625026624328
4          7241        高念        19990       139625026624328
5          7240        陈珂        19980       139625026624328已用时间: 0.977(毫秒). 执行号:1964.
SQL>
  • phyrowid

 phyrowid 用来表示当前记录的物理存储信息。 

       PHYROWID 值由聚集 B 树或二级 B 树中物理记录的文件号、页号、页内槽号组成,能体现聚集 B 树或二级 B 树的存储信息,聚集 B 树记录的最高位为 1。
       当查询语句中实际使用 CSCN、CSEK、BLKUP 操作符时,PHYROWID 内容是聚集 B 树中记录的物理存储地址;当查询语句中实际仅使用 SSEK、SSCN 操作符时,PHYROWID 内容是二级 B 树中记录的物理存储地址。

SQL> select top 5 employee_id,employee_name,salary,phyrowid from DMHR.employee order by salary desc;行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      PHYROWID            
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       4611686018439970817
2          3001        苏国华     30000       4611686018440757255
3          7001        郑晓同     30000       4611686018440757271
4          7241        高念        19990       4611686018440364084
5          7240        陈珂        19980       4611686018440364083已用时间: 1.283(毫秒). 执行号:1969.
SQL>

 

  相关解决方案