分层查询伪列
- CONNECT_BY_ISCYCLE伪列
- CONNECT_BY_ISLEAF伪列
- LEVEL伪列
--CONNECT_BY_ISCYCLE伪列:如果当前行的子级也是其父级, 则返回1。否则它返回0。
--CONNECT_BY_ISLEAF伪列:如果当前行是由CONNECT BY条件定义的树的叶, 则返回1。否则它返回0。此信息指示是否可以进一步扩展给定行以显示更多层次结构。
SELECT last_name "Employee",
connect_by_isleaf "IsLeaf",
LEVEL,
sys_connect_by_path(last_name, '/') "Path"
FROM hr.employees
WHERE LEVEL <= 3
AND department_id = 80
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id
AND LEVEL <= 4
ORDER BY "Employee", "IsLeaf";
--LEVEL伪列:对于由分层查询返回的每一行, LEVEL伪列返回 1, 用于根行、2对于根的子LEVEL等。根行是倒树中的最高行。子行是任何非根行。父行是任何具有子级的行。叶行是没有子级的任何行。
序列伪列
- CURRVAL
- NEXTVAL
--CURRVAL: 返回序列的当前值
--NEXTVAL: 递增序列并返回下一个值
--序列是可以生成唯一顺序值的架构对象。这些值通常用于主要和唯一键。可以使用以下伪列引用 SQL 语句中的序列值:
--必须使用序列的名称限定CURRVAL和NEXTVAL :
sequence.CURRVAL
sequence.NEXTVAL
--若要引用另一个用户架构中序列的当前或下一个值, 必须已在序列上授予SELECT权限或
--SELECTANYSEQUENCE系统特权, 并且必须限定包含它的架构的序列:(schema代表用户名称)(sequence代表序列名称)
schema.sequence.CURRVAL
schema.sequence.NEXTVAL
--若要引用远程数据库上序列的值, 必须使用数据库链接的完整或部分名称限定序列:
schema.sequence.CURRVAL@dblink
schema.sequence.NEXTVAL@dblink
不能在以下构造中使用序列伪列:
/
*DELETE、SELECT或UPDATE语句中的子查询
*视图或实例化视图的查询
*具有DISTINCT运算符的SELECT语句
*带有GROUP BY子句或ORDER BY子句的SELECT语句
*与另一个SELECT语句结合使用UNION、INTERSECT或MINUS集运算符的SELECT语句
*SELECT语句的WHERE子句
*CREATETABLE或ALTERTABLE语句中的列的DEFAULT值
*CHECK约束的条件
*在使用CURRVAL或NEXTVAL的单个 SQL 语句中, 所有引用的LONG列、更新的表和锁定表都必须位于同一数据库中。
*如果这些位置中的任何一个包含多个对NEXTVAL的引用, 则 Oracle 将递增序列一次, 并为所有NEXTVAL的匹配项返回相同的值。.
*如果这些位置中的任何一个包含对CURRVAL和NEXTVAL的引用, 则 Oracle 将递增序列, 并为CURRVAL和NEXTVAL返回相同的值。.
*/
--查找序列的下一个值: 示例
--本示例选择示例架构hr中员工序列的下一个值:
SELECT hr.employees_seq.nextval
FROM DUAL;
--将序列值插入表中: 示例
--本示例递增员工序列, 并将其值用于插入到示例表 hr 中的新员工hr.employees:
INSERT INTO hr.employees
VALUES (hr.employees_seq.nextval, 'John', 'Doe', 'jdoe', '555-1212',
TO_DATE(SYSDATE), 'PU_CLERK', 2500, null, null, 30);
--重用序列的当前值: 示例
--本示例将一个新订单添加到主订单表中的下一个订单编号。然后将 suborders 添加到明细订单表中:
INSERT INTO oe.orders (order_id, order_date, customer_id)
VALUES (oe.orders_seq.nextval, TO_DATE(SYSDATE), 106);
INSERT INTO oe.order_items (order_id, line_item_id, product_id)
VALUES (oe.orders_seq.currval, 1, 2359);
INSERT INTO oe.order_items (order_id, line_item_id, product_id)
VALUES (oe.orders_seq.currval, 2, 3290);
INSERT INTO oe.order_items (order_id, line_item_id, product_id)
VALUES (oe.orders_seq.currval, 3, 2381);
VERSION QUERY(版本查询) 伪列
版本查询序列是仅在 oracle 闪回版本查询中有效, 这是 oracle 闪回查询的一种形式:
- VERSIONS_STARTSCN和VERSIONS_STARTTIME: 在创建行版本时启动系统更改号 (SCN) 或TIMESTAMP。此伪列标识数据第一次具有行版本中反映的值的时间。使用此伪列标识 oracle 闪回表或 oracle 闪回查询的过去目标时间。如果此伪列为NULL, 则在开始之前创建行版本。
- VERSIONS_ENDSCN和VERSIONS_ENDTIME: 当行版本过期时, SCN 或TIMESTAMP。如果伪列为NULL, 则在查询时行版本是当前的, 或者该行对应于DELETE操作。
- VERSIONS_XID: 创建行版本的事务的标识符 (RAW编号)。
- VERSIONS_OPERATION: 由事务执行的操作: I为插入, D为删除, 或者U为更新。该版本是插入、删除或更新的行的。即, 在INSERT操作之后的行、DELETE操作之前的行或由UPDATE操作影响的行。
- 对于索引键的用户更新, Oracle闪回版本查询可能将DELETE和UPDATE操作视为两个操作, 即先DELETE后INSERT, 表示为两个版本行.
COLUMN_VALUE伪列
--当引用没有 "COLUMNS" 子句的XMLTable构造时, 或者当使用TABLE集合表达式引用标量嵌套表类型时, 数据库将返回一个具有单个列的虚拟表。此伪列的名称是COLUMN_VALUE.
--在XMLTable的上下文中, 返回的值是数据类型XMLType。
--例如, 以下两个语句是等效的, 并且两者的输出都显示COLUMN_VALUE为要返回的列的名称:
SELECT *
FROM XMLTABLE('<a>123</a>');
SELECT COLUMN_VALUE
FROM (XMLTable('<a>123</a>'));
--在TABLE集合表达式的上下文中, 返回的值是集合元素的数据类型。
CREATE TYPE phone AS TABLE OF NUMBER;
/
CREATE TYPE phone_list AS TABLE OF phone;
/
--使用COLUMN_VALUE从phone类型中进行选择:
SELECT t.column_value FROM TABLE(phone(1, 2, 3)) t;
--在嵌套类型中, 可以在选择列表和TABLE集合表达式中使用伪列
SELECT t.column_value
FROM TABLE(phone_list(phone(1, 2, 3))) p, TABLE(p.column_value) t;
--关键字COLUMN_VALUE也是 Oracle 数据库为内部嵌套表的标量值生成的名称, 没有列或属性名,
--如下面的示例所示。在此上下文中, COLUMN_VALUE不是伪列, 而是实际的列名。
CREATE TABLE my_customers (
cust_id NUMBER,
name VARCHAR2(25),
phone_numbers phone_list,
credit_limit NUMBER)
NESTED TABLE phone_numbers STORE AS outer_ntab
(NESTED TABLE COLUMN_VALUE STORE AS inner_ntab);
OBJECT_ID伪列
- OBJECT_ID伪列返回对象表或视图的列的对象标识符。Oracle 使用此伪列作为对象表的主键。OBJECT_ID在视图和INSTEAD OF触发器中可替换行的 ID 方面很有用。
- 在早期版本中, 此伪列被称为SYS_NC_OID$。该名称仍然支持向后兼容性。但是, Oracle 建议您使用更直观的名称OBJECT_ID.
OBJECT_VALUE伪列
- OBJECT_VALUE伪列 返回对象表、 XMLType表、对象视图或XMLType视图的列的系统生成的名称。此伪列 用于标识对象表中可替换行的值以及使用WITH OBJECT IDENTIFIER子句创建对象视图。
- 在早期版本中, 此伪列 被称为SYS_NC_ROWINFO$。该名称仍然支持向后兼容性。但是, Oracle 建议您使用更直观的名称OBJECT_VALUE
ORA_ROWSCN伪列
- ORA_ROWSCN反映了对行的最新更改的系统更改号 (SCN)。此更改可以位于块 (粗) 或行级别 (细粒度) 的级别。后者由行级依赖项跟踪提供。
- 外部表不支持此伪列
--使用伪列seudocolumn 获取 "employees" 表上最后一个操作的系统更改号
SELECT ORA_ROWSCN, last_name
FROM employees
WHERE employee_id = 188;
--使用伪列与SCN_TO_TIMESTAMP函数来确定操作的时间戳:
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN), last_name
FROM employees
WHERE employee_id = 188;
ROWID伪列
虽然可以在查询的SELECT和WHERE子句中使用ROWID 伪列, 但这些伪列值实际上并不存储在数据库中。不能插入、更新或删除ROWID伪列的值。
--此语句选择包含部门20中员工数据的所有行的地址:
SELECT ROWID, last_name
FROM hr.employees
WHERE department_id = 20;
ROWNUM伪列
使用时ROWNUM伪列时,用ROWNUM作为条件不能大于一个正整数
--对于查询返回的每一行, ROWNUM伪列返回一个数字, 指示 Oracle 从表或联接行集合中选择行的顺序。
--选定的第一行的ROWNUM为 1, 第二个为 2, 等等。
--您可以使用ROWNUM来限制查询返回的行数, 如下例所示:
SELECT * FROM employees WHERE rownum < 11;
--如果ORDER BY by 子句遵循同一查询中的ROWNUM , 则行将按ORDER BY by 子句重新排序。
--根据访问行的方式, 结果可能会有所不同。
--例如, 如果ORDER BY子句导致 oracle 使用索引来访问数据, 则 oracle 可以以不同的顺序检索行,
--而不是索引。因此, 下面的语句不一定返回与前面的示例相同的行:
SELECT * FROM employees WHERE rownum < 11 ORDER BY last_name;
--如果在子查询中嵌入ORDER BY by 子句并将ROWNUM条件置于顶级查询中,
--则可以强制在行排序后应用ROWNUM条件。
--例如, 下面的查询返回具有10个最小雇员编号的员工。这有时被称为顶 N 报告:
SELECT *
FROM (SELECT * FROM employees ORDER BY employee_id)
WHERE rownum < 11;
--在前面的示例中, ROWNUM值是顶级SELECT语句的,
--因此它们是在子查询中的employee_id已排序之后生成的。
--对大于正整数的ROWNUM值的条件测试总是错误的。
--例如, 此查询不返回任何行:
SELECT * FROM employees WHERE rownum > 1;
--提取的第一行被指定为1的ROWNUM , 并使条件为 false。要提取的第二行现在是第一行,
--并且分配了一个ROWNUM 1 并使条件为 false。随后, 所有行都无法满足条件, 因此不返回行。
--您还可以使用ROWNUM为表中的每一行分配唯一值, 如本示例所示:
UPDATE my_table SET column1 = rownum;
XMLDATA伪列
--Oracle 根据伪列信息以及如何指定存储子句, 在 LOB 或对象关系列中存储XMLType数据。
--XMLDATA伪列允许您访问基础 LOB 或对象关系列, 以指定附加的存储子句参数、约束、索引等。
--以下语句说明了此伪列的用法。假设您使用一个CLOB列创建一个简单的XMLType表:
CREATE TABLE xml_lob_tab of XMLTYPE
XMLTYPE STORE AS CLOB;
--若要更改基础LOB 列的存储特征, 可以使用以下语句:
ALTER TABLE xml_lob_tab
MODIFY LOB (XMLDATA) (STORAGE (MAXSIZE 2G) CACHE);
--现在假设您已经创建了一个基于 XMLSchema 的表,
--如在 "在SQL 语句中使用 XML" 创建的xwarehouses表。
--然后, 可以使用XMLDATA列设置基础列的属性, 如下面的语句所示:
ALTER TABLE xwarehouses
ADD (UNIQUE(XMLDATA."WarehouseId"));