ORACLE官方SQL语言参考笔记重点整理之伪列

分层查询伪列

  • CONNECT_BY_ISCYCLE伪列
  • CONNECT_BY_ISLEAF伪列
  • LEVEL伪列
 
 
  1. --CONNECT_BY_ISCYCLE伪列:如果当前行的子级也是其父级, 则返回1。否则它返回0
  2. --CONNECT_BY_ISLEAF伪列:如果当前行是由CONNECT BY条件定义的树的叶, 则返回1。否则它返回0。此信息指示是否可以进一步扩展给定行以显示更多层次结构。
  3. SELECT last_name "Employee",
  4. connect_by_isleaf "IsLeaf",
  5. LEVEL,
  6. sys_connect_by_path(last_name, '/') "Path"
  7. FROM hr.employees
  8. WHERE LEVEL <= 3
  9. AND department_id = 80
  10. START WITH employee_id = 100
  11. CONNECT BY PRIOR employee_id = manager_id
  12. AND LEVEL <= 4
  13. ORDER BY "Employee", "IsLeaf";
  14. --LEVEL伪列:对于由分层查询返回的每一行, LEVEL伪列返回 1, 用于根行、2对于根的子LEVEL等。根行是倒树中的最高行。子行是任何非根行。父行是任何具有子级的行。叶行是没有子级的任何行。

序列伪列

  • CURRVAL
  • NEXTVAL
 
 
  1. --CURRVAL: 返回序列的当前值
  2. --NEXTVAL: 递增序列并返回下一个值
  3. --序列是可以生成唯一顺序值的架构对象。这些值通常用于主要和唯一键。可以使用以下伪列引用 SQL 语句中的序列值:
  4. --必须使用序列的名称限定CURRVALNEXTVAL :
  5. sequence.CURRVAL
  6. sequence.NEXTVAL
  7. --若要引用另一个用户架构中序列的当前或下一个值, 必须已在序列上授予SELECT权限或
  8. --SELECTANYSEQUENCE系统特权, 并且必须限定包含它的架构的序列:(schema代表用户名称)(sequence代表序列名称)
  9. schema.sequence.CURRVAL
  10. schema.sequence.NEXTVAL
  11. --若要引用远程数据库上序列的值, 必须使用数据库链接的完整或部分名称限定序列:
  12. schema.sequence.CURRVAL@dblink
  13. schema.sequence.NEXTVAL@dblink

不能在以下构造中使用序列伪列:

 
 
  1. /
  2. *DELETESELECTUPDATE语句中的子查询
  3. *视图或实例化视图的查询
  4. *具有DISTINCT运算符的SELECT语句
  5. *带有GROUP BY子句或ORDER BY子句的SELECT语句
  6. *与另一个SELECT语句结合使用UNIONINTERSECTMINUS集运算符的SELECT语句
  7. *SELECT语句的WHERE子句
  8. *CREATETABLEALTERTABLE语句中的列的DEFAULT
  9. *CHECK约束的条件
  10. *在使用CURRVALNEXTVAL的单个 SQL 语句中, 所有引用的LONG列、更新的表和锁定表都必须位于同一数据库中。
  11. *如果这些位置中的任何一个包含多个对NEXTVAL的引用, Oracle 将递增序列一次, 并为所有NEXTVAL的匹配项返回相同的值。.
  12. *如果这些位置中的任何一个包含对CURRVALNEXTVAL的引用, Oracle 将递增序列, 并为CURRVALNEXTVAL返回相同的值。.
  13. */
  14. --查找序列的下一个值: 示例
  15. --本示例选择示例架构hr中员工序列的下一个值:
  16. SELECT hr.employees_seq.nextval
  17. FROM DUAL;
  18. --将序列值插入表中: 示例
  19. --本示例递增员工序列, 并将其值用于插入到示例表 hr 中的新员工hr.employees:
  20. INSERT INTO hr.employees
  21. VALUES (hr.employees_seq.nextval, 'John', 'Doe', 'jdoe', '555-1212',
  22. TO_DATE(SYSDATE), 'PU_CLERK', 2500, null, null, 30);
  23. --重用序列的当前值: 示例
  24. --本示例将一个新订单添加到主订单表中的下一个订单编号。然后将 suborders 添加到明细订单表中:
  25. INSERT INTO oe.orders (order_id, order_date, customer_id)
  26. VALUES (oe.orders_seq.nextval, TO_DATE(SYSDATE), 106);
  27. INSERT INTO oe.order_items (order_id, line_item_id, product_id)
  28. VALUES (oe.orders_seq.currval, 1, 2359);
  29. INSERT INTO oe.order_items (order_id, line_item_id, product_id)
  30. VALUES (oe.orders_seq.currval, 2, 3290);
  31. INSERT INTO oe.order_items (order_id, line_item_id, product_id)
  32. 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伪列

 
 
  1. --当引用没有 "COLUMNS" 子句的XMLTable构造时, 或者当使用TABLE集合表达式引用标量嵌套表类型时, 数据库将返回一个具有单个列的虚拟表。此伪列的名称是COLUMN_VALUE.
  2. --在XMLTable的上下文中, 返回的值是数据类型XMLType
  3. --例如, 以下两个语句是等效的, 并且两者的输出都显示COLUMN_VALUE为要返回的列的名称:
  4. SELECT *
  5. FROM XMLTABLE('<a>123</a>');
  6. SELECT COLUMN_VALUE
  7. FROM (XMLTable('<a>123</a>'));
  8. --在TABLE集合表达式的上下文中, 返回的值是集合元素的数据类型。
  9. CREATE TYPE phone AS TABLE OF NUMBER;
  10. /
  11. CREATE TYPE phone_list AS TABLE OF phone;
  12. /
  13. --使用COLUMN_VALUEphone类型中进行选择:
  14. SELECT t.column_value FROM TABLE(phone(1, 2, 3)) t;
  15. --在嵌套类型中, 可以在选择列表和TABLE集合表达式中使用伪列
  16. SELECT t.column_value
  17. FROM TABLE(phone_list(phone(1, 2, 3))) p, TABLE(p.column_value) t;
  18. --关键字COLUMN_VALUE也是 Oracle 数据库为内部嵌套表的标量值生成的名称, 没有列或属性名,
  19. --如下面的示例所示。在此上下文中, COLUMN_VALUE不是伪列, 而是实际的列名。
  20. CREATE TABLE my_customers (
  21. cust_id NUMBER,
  22. name VARCHAR2(25),
  23. phone_numbers phone_list,
  24. credit_limit NUMBER)
  25. NESTED TABLE phone_numbers STORE AS outer_ntab
  26. (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)。此更改可以位于块 (粗) 或行级别 (细粒度) 的级别。后者由行级依赖项跟踪提供。
  • 外部表不支持此伪列
 
 
  1. --使用伪列seudocolumn 获取 "employees" 表上最后一个操作的系统更改号
  2. SELECT ORA_ROWSCN, last_name
  3. FROM employees
  4. WHERE employee_id = 188;
  5. --使用伪列与SCN_TO_TIMESTAMP函数来确定操作的时间戳:
  6. SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN), last_name
  7. FROM employees
  8. WHERE employee_id = 188;

ROWID伪列

虽然可以在查询的SELECT和WHERE子句中使用ROWID 伪列, 但这些伪列值实际上并不存储在数据库中。不能插入、更新或删除ROWID伪列的值

 
  
  1. --此语句选择包含部门20中员工数据的所有行的地址:
  2. SELECT ROWID, last_name
  3. FROM hr.employees
  4. WHERE department_id = 20;

ROWNUM伪列

使用时ROWNUM伪列时,用ROWNUM作为条件不能大于一个正整数

 
  
  1. --对于查询返回的每一行, ROWNUM伪列返回一个数字, 指示 Oracle 从表或联接行集合中选择行的顺序。
  2. --选定的第一行的ROWNUM 1, 第二个为 2, 等等。
  3. --您可以使用ROWNUM来限制查询返回的行数, 如下例所示:
  4. SELECT * FROM employees WHERE rownum < 11;
  5. --如果ORDER BY by 子句遵循同一查询中的ROWNUM , 则行将按ORDER BY by 子句重新排序。
  6. --根据访问行的方式, 结果可能会有所不同。
  7. --例如, 如果ORDER BY子句导致 oracle 使用索引来访问数据, oracle 可以以不同的顺序检索行,
  8. --而不是索引。因此, 下面的语句不一定返回与前面的示例相同的行:
  9. SELECT * FROM employees WHERE rownum < 11 ORDER BY last_name;
  10. --如果在子查询中嵌入ORDER BY by 子句并将ROWNUM条件置于顶级查询中,
  11. --则可以强制在行排序后应用ROWNUM条件。
  12. --例如, 下面的查询返回具有10个最小雇员编号的员工。这有时被称为顶 N 报告:
  13. SELECT *
  14. FROM (SELECT * FROM employees ORDER BY employee_id)
  15. WHERE rownum < 11;
  16. --在前面的示例中, ROWNUM值是顶级SELECT语句的,
  17. --因此它们是在子查询中的employee_id已排序之后生成的。
  18. --对大于正整数的ROWNUM值的条件测试总是错误的。
  19. --例如, 此查询不返回任何行:
  20. SELECT * FROM employees WHERE rownum > 1;
  21. --提取的第一行被指定为1ROWNUM , 并使条件为 false。要提取的第二行现在是第一行,
  22. --并且分配了一个ROWNUM 1 并使条件为 false。随后, 所有行都无法满足条件, 因此不返回行。
  23. --您还可以使用ROWNUM为表中的每一行分配唯一值, 如本示例所示:
  24. UPDATE my_table SET column1 = rownum;

XMLDATA伪列

 
 
  1. --Oracle 根据伪列信息以及如何指定存储子句, LOB 或对象关系列中存储XMLType数据。
  2. --XMLDATA伪列允许您访问基础 LOB 或对象关系列, 以指定附加的存储子句参数、约束、索引等。
  3. --以下语句说明了此伪列的用法。假设您使用一个CLOB列创建一个简单的XMLType表:
  4. CREATE TABLE xml_lob_tab of XMLTYPE
  5. XMLTYPE STORE AS CLOB;
  6. --若要更改基础LOB 列的存储特征, 可以使用以下语句:
  7. ALTER TABLE xml_lob_tab
  8. MODIFY LOB (XMLDATA) (STORAGE (MAXSIZE 2G) CACHE);
  9. --现在假设您已经创建了一个基于 XMLSchema 的表,
  10. --如在 "在SQL 语句中使用 XML" 创建的xwarehouses表。
  11. --然后, 可以使用XMLDATA列设置基础列的属性, 如下面的语句所示:
  12. ALTER TABLE xwarehouses
  13. ADD (UNIQUE(XMLDATA."WarehouseId"));

猜你喜欢

转载自blog.csdn.net/HuYingZuo/article/details/80822623