
好的,我们来详细解析 Oracle 19C 数据库中的 V$RESERVED_WORDS 动态性能视图。
📖 概述与作用
V$RESERVED_WORDS 视图列出了 Oracle SQL 和 PL/SQL 中所有的关键字(Keywords),并标识了哪些是“保留字(Reserved Words)”。它的核心作用是为开发人员和 DBA 提供一个权威的参考,以避免在定义数据库对象(如表名、列名、过程名)或变量时使用这些关键字,从而防止潜在的语法冲突和编译错误。
- 关键字(Keyword):Oracle SQL 语言中有特殊含义的单词,例如
SELECT,FROM,WHERE,INDEX,DATE。 - 保留字(Reserved Word):关键字的一个严格子集。保留字不仅具有特殊含义,而且不能被用作标识符(即不能直接用作表名、列名等,除非使用双引号
""将其引起来)。例如,SELECT是保留字,你不能创建名为"SELECT"的表(虽然技术上可以,但极度不推荐)。而INDEX是关键字但不是保留字,你可以创建一个名为INDEX的表。
🎯 使用场景
- 对象命名验证:在创建或修改数据库对象(表、视图、列、游标、变量等)之前,查询此视图以检查拟用的名称是否为保留字或关键字,从而避免
ORA-00904、ORA-00936等语法错误。 - SQL 和 PL/SQL 开发:作为开发规范的一部分,确保代码中使用的标识符不会与语言本身的关键字冲突,提高代码的可读性和可移植性。
- 迁移项目:在将数据库或应用从其他数据库系统(如 MySQL, SQL Server)迁移到 Oracle 时,检查对方系统中使用的标识符是否在 Oracle 中是保留字,以便提前做出重命名或引用处理。
- 工具开发:如果你正在开发一个需要解析 SQL、进行语法高亮或代码格式化的工具,此视图提供了 Oracle 关键字的完整列表。
📊 字段含义详解
下表详细说明了 V$RESERVED_WORDS 视图中的各个字段。
| 字段名 | 数据类型 | 含义与说明 |
|---|---|---|
| KEYWORD | VARCHAR2(128) | 关键字名称。即 Oracle SQL 或 PL/SQL 中使用的关键字或保留字的文本字符串。 |
| LENGTH | NUMBER | 关键字的长度。表示 KEYWORD 字段中字符串的字符个数。 |
| RESERVED | VARCHAR2(1) | 保留字标志。 • Y:表示该关键字是 保留字(Reserved Word),不能 用作未引用的标识符。• N:表示该关键字是 非保留关键字(Non-Reserved Keyword)。它虽有特殊含义,但可以 用作标识符而无需引号。然而,出于清晰起见,通常仍建议避免使用。 |
| RES_TYPE | VARCHAR2(3) | 保留类型。提供关于保留状态的更细粒度信息。常见值包括: • YES:是保留字(与 RESERVED='Y' 对应)。• NO:不是保留字(与 RESERVED='N' 对应)。• N/A:可能不适用或未知。 |
| RES_ATTR | VARCHAR2(1) | 保留属性。提供关于关键字性质的附加信息。例如,它可能指示关键字是否是 SQL 操作符的一部分。常见值为 I (可能是 Implicit 或其他内部分类),但此字段的精确含义较为模糊,通常以 RESERVED 字段为准。 |
| RES_SCOPE | VARCHAR2(1) | 保留范围。指示关键字在哪种语言或上下文中有特殊含义。 • S:表示该关键字在 SQL 中是保留的/有关的。• P:表示该关键字在 PL/SQL 中是保留的/有关的。• B:表示该关键字在 SQL 和 PL/SQL 中都是保留的/有关的。 |
| DUPLICATE | VARCHAR2(1) | 重复标志。指示是否存在另一个同名的关键字,但可能具有不同的属性。此字段通常为 NULL,除非存在重复。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,标识该行数据所属的容器。可能值包括: • 0:表示数据属于整个 CDB,对所有 PDB 有效。• 1:表示数据属于根容器(CDB$ROOT)。• n (n>1):表示数据属于特定可插拔数据库(PDB)的 ID。对于此视图,数据通常是全局的,CON_ID 通常为 0。 |
🔗 相关视图与基表
-
相关视图:
V$RESERVED_WORDS本身是最直接的视图。- 虽然没有完全等效的静态数据字典视图,但在进行对象检查时,通常会关联
DBA_OBJECTS,DBA_TAB_COLUMNS等视图来确认名称是否已被使用。
-
关于基表:
V$RESERVED_WORDS是一个 **动态性能视图(V 视图) ∗ ∗ 。与其他许多动态性能视图不同,它的数据 ∗ ∗ 并非来源于实例运行时的内存结构,而是源自数据库内部的一个静态列表 ∗ ∗ 。这个列表是 O r a c l e 软件代码的一部分,在数据库创建时就被确定, ∗ ∗ 不会随着实例的运行状态而改变 ∗ ∗ 。因此,它 ∗ ∗ 没有传统意义上的“基表” ∗ ∗ 。可以将其理解为数据库内置的一个只读参考列表,通过 V 视图)**。与其他许多动态性能视图不同,它的数据**并非来源于实例运行时的内存结构,而是源自数据库内部的一个静态列表**。这个列表是 Oracle 软件代码的一部分,在数据库创建时就被确定,**不会随着实例的运行状态而改变**。 因此,它**没有传统意义上的“基表”**。可以将其理解为数据库内置的一个只读参考列表,通过 V 视图)∗∗。与其他许多动态性能视图不同,它的数据∗∗并非来源于实例运行时的内存结构,而是源自数据库内部的一个静态列表∗∗。这个列表是Oracle软件代码的一部分,在数据库创建时就被确定,∗∗不会随着实例的运行状态而改变∗∗。因此,它∗∗没有传统意义上的“基表”∗∗。可以将其理解为数据库内置的一个只读参考列表,通过V视图的机制暴露给用户查询。其底层数据极有可能来源于某个$开头的内部底层表(如X$KQWDT等),但这些表对用户是不可见且不推荐直接查询的。
⚙️ 底层原理与知识点
1. 编译与解析:
当 Oracle 解析一条 SQL 或 PL/SQL 语句时,解析器会首先将语句分解为一系列“词法单元”(Lexical Units)。V$RESERVED_WORDS 中的内容构成了解析器识别关键字的权威词典。如果一个标识符未经双引号引用且与列表中的某个保留字完全匹配(不区分大小写),解析器就会将其解释为语言关键字而非对象名称,这就会导致语法错误。
2. 引号的作用:
使用双引号("") 可以强制将保留字或关键字解释为一个普通的标识符。例如,CREATE TABLE "SELECT" (id NUMBER); 是允许的,但之后任何引用此表的地方都必须使用双引号并保持相同的大小写(因为引号标识符是大小写敏感的),例如 SELECT * FROM "SELECT";。这是一种非常不推荐的做法,因为它会使代码难以阅读和维护。
3. 版本演进:
Oracle 的关键字和保留字列表会随着版本的更新而增加。例如,在后续版本中成为关键字的单词,在以前的版本中可能可以用作标识符。这就是为什么在从一个旧的 Oracle 版本迁移到 19C 时,检查此视图尤为重要。
4. RESERVED 与 RES_TYPE 的区别:
RESERVED='Y' 是最终的、最明确的标志,表示绝对不能用作标识符。RES_TYPE 提供了类似的信息,但有时会更详细。在实践中,以 RESERVED 字段作为主要判断依据是最可靠的。
🛠️ 常用查询 SQL
- 检查一个特定的单词是否为保留字或关键字
这是最常用的场景,在创建对象前验证名称。
SELECT KEYWORD, LENGTH, RESERVED, RES_TYPE, RES_SCOPE
FROM V$RESERVED_WORDS
WHERE UPPER(KEYWORD) = UPPER('&your_word'); -- 替换 your_word,例如 DATE, INDEX, SELECT
-- 示例:WHERE UPPER(KEYWORD) = 'ORDER';
- 列出所有保留字(Reserved Words)
SELECT KEYWORD, LENGTH, RES_TYPE, RES_SCOPE
FROM V$RESERVED_WORDS
WHERE RESERVED = 'Y'
ORDER BY KEYWORD;
- 列出所有非保留的关键字(Non-Reserved Keywords)
SELECT KEYWORD, LENGTH, RES_TYPE, RES_SCOPE
FROM V$RESERVED_WORDS
WHERE RESERVED = 'N'
ORDER BY KEYWORD;
- 查找包含特定字符串的关键字(用于模糊查询)
SELECT KEYWORD, RESERVED, RES_TYPE, RES_SCOPE
FROM V$RESERVED_WORDS
WHERE KEYWORD LIKE '%SIZE%' -- 查找包含"SIZE"的关键字
ORDER BY KEYWORD;
💎 总结
V$RESERVED_WORDS 是 Oracle 数据库中的一个静态参考视图,它充当了 SQL 和 PL/SQL 语言的关键字字典。其主要价值在于:
- 预防错误:通过提前查询,避免因使用保留字作为标识符而引发的编译和解析错误。
- 制定规范:为数据库对象和编程变量的命名提供依据,促进良好的开发规范。
- 保证兼容:确保应用在不同 Oracle 版本间的兼容性和可移植性。
虽然它属于 V$ 动态性能视图家族,但其数据是静态的,是数据库设计者和开发者应当时常利用的重要参考资料。
欢迎关注我的公众号《IT小Chen》

386

被折叠的 条评论
为什么被折叠?



