为什么Oracle的v$reserved_words视图中有两个“null”关键字?
我注意到我们的Oracle11.2数据库中的v$reserved_words视图有两行,关键字为null,值为null,而不是null 所以这个查询:为什么Oracle的v$reserved_words视图中有两个“null”关键字?,oracle,Oracle,我注意到我们的Oracle11.2数据库中的v$reserved_words视图有两行,关键字为null,值为null,而不是null 所以这个查询: select * from v$reserved_words where keyword is null; 返回两行,除一行保留=Y,另一行保留=N外,其他行相同。知道这是什么目的或如何使用吗?您需要了解如何解释该视图。要确定特定关键字是否以任何方式保留,请检查保留、RES\u类型、RES\u ATTR和RES\u半列 这两行并非所有列都有“Y
select * from v$reserved_words where keyword is null;
返回两行,除一行保留=Y,另一行保留=N外,其他行相同。知道这是什么目的或如何使用吗?您需要了解如何解释该视图。要确定特定关键字是否以任何方式保留,请检查保留、RES\u类型、RES\u ATTR和RES\u半列 这两行并非所有列都有“Y”。是,其中一行保留为“Y”,但长度为0。此外,没有一个属性是“Y” 根据文件
RESERVED VARCHAR2(1) A value of Y means that the keyword cannot be used as an identifier. A value of N means that it is not reserved.
RES_TYPE VARCHAR2(1) A value of Y means that the keyword cannot be used as a type name. A value of N means that it is not reserved.
RES_ATTR VARCHAR2(1) A value of Y means that the keyword cannot be used as an attribute name. A value of N means that it is not reserved.
RES_SEMI VARCHAR2(1) A value of Y means that the keyword is not allowed as an identifier in certain situations, such as in DML. A value of N means that it is not reserved.
DUPLICATE VARCHAR2(1) A value of Y means that the keyword is a duplicate of another keyword. A value of N means that it is not a duplicate.
这澄清了原因
除了v$reserved_字,您还可以通过以下方式检查SQL*Plus中的SQL和PL/SQL保留字:
SQL*Plus: Release 12.1.0.1.0 Production on Fri Sep 5 13:05:15 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Last Successful login time: Thu Sep 04 2014 15:01:52 +05:30
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> help reserve
RESERVED WORDS (PL/SQL)
-----------------------
PL/SQL Reserved Words have special meaning in PL/SQL, and may not be used
for identifier names (unless enclosed in "quotes").
An asterisk (*) indicates words are also SQL Reserved Words.
ALL* DESC* JAVA PACKAGE SUBTYPE
ALTER* DISTINCT* LEVEL* PARTITION SUCCESSFUL*
AND* DO LIKE* PCTFREE* SUM
ANY* DROP* LIMITED PLS_INTEGER SYNONYM*
ARRAY ELSE* LOCK* POSITIVE SYSDATE*
AS* ELSIF LONG* POSITIVEN TABLE*
ASC* END LOOP PRAGMA THEN*
AT EXCEPTION MAX PRIOR* TIME
AUTHID EXCLUSIVE* MIN PRIVATE TIMESTAMP
AVG EXECUTE MINUS* PROCEDURE TIMEZONE_ABBR
BEGIN EXISTS* MINUTE PUBLIC* TIMEZONE_HOUR
BETWEEN* EXIT MLSLABEL* RAISE TIMEZONE_MINUTE
BINARY_INTEGER EXTENDS MOD RANGE TIMEZONE_REGION
BODY EXTRACT MODE* RAW* TO*
BOOLEAN FALSE MONTH REAL TRIGGER*
BULK FETCH NATURAL RECORD TRUE
BY* FLOAT* NATURALN REF TYPE
CHAR* FOR* NEW RELEASE UI
CHAR_BASE FORALL NEXTVAL RETURN UNION*
CHECK* FROM* NOCOPY REVERSE UNIQUE*
CLOSE FUNCTION NOT* ROLLBACK UPDATE*
CLUSTER* GOTO NOWAIT* ROW* USE
COALESCE GROUP* NULL* ROWID* USER*
COLLECT HAVING* NULLIF ROWNUM* VALIDATE*
COMMENT* HEAP NUMBER* ROWTYPE VALUES*
COMMIT HOUR NUMBER_BASE SAVEPOINT VARCHAR*
COMPRESS* IF OCIROWID SECOND VARCHAR2*
CONNECT* IMMEDIATE* OF* SELECT* VARIANCE
CONSTANT IN* ON* SEPERATE VIEW*
CREATE* INDEX* OPAQUE SET* WHEN
CURRENT* INDICATOR OPEN SHARE* WHENEVER*
CURRVAL INSERT* OPERATOR SMALLINT* WHERE*
CURSOR INTEGER* OPTION* SPACE WHILE
DATE* INTERFACE OR* SQL WITH*
DAY INTERSECT* ORDER* SQLCODE WORK
DECIMAL* INTERVAL ORGANIZATION SQLERRM WRITE
DECLARE INTO* OTHERS START* YEAR
DEFAULT* IS* OUT STDDEV ZONE
DELETE* ISOLATION
RESERVED WORDS (SQL)
--------------------
SQL Reserved Words have special meaning in SQL, and may not be used for
identifier names unless enclosed in "quotes".
An asterisk (*) indicates words are also ANSI Reserved Words.
Oracle prefixes implicitly generated schema object and subobject names
with "SYS_". To avoid name resolution conflict, Oracle discourages you
from prefixing your schema object and subobject names with "SYS_".
ACCESS DEFAULT* INTEGER* ONLINE START
ADD* DELETE* INTERSECT* OPTION* SUCCESSFUL
ALL* DESC* INTO* OR* SYNONYM
ALTER* DISTINCT* IS* ORDER* SYSDATE
AND* DROP* LEVEL* PCTFREE TABLE*
ANY* ELSE* LIKE* PRIOR* THEN*
AS* EXCLUSIVE LOCK PRIVILEGES* TO*
ASC* EXISTS LONG PUBLIC* TRIGGER
AUDIT FILE MAXEXTENTS RAW UID
BETWEEN* FLOAT* MINUS RENAME UNION*
BY* FOR* MLSLABEL RESOURCE UNIQUE*
CHAR* FROM* MODE REVOKE* UPDATE*
CHECK* GRANT* MODIFY ROW USER*
CLUSTER GROUP* NOAUDIT ROWID VALIDATE
COLUMN HAVING* NOCOMPRESS ROWNUM VALUES*
COMMENT IDENTIFIED NOT* ROWS* VARCHAR*
COMPRESS IMMEDIATE* NOWAIT SELECT* VARCHAR2
CONNECT* IN* NULL* SESSION* VIEW*
CREATE* INCREMENT NUMBER SET* WHENEVER*
CURRENT* INDEX OF* SHARE WHERE
DATE* INITIAL OFFLINE SIZE* WITH*
DECIMAL* INSERT* ON* SMALLINT*
SQL>
添加更多信息以澄清这两行是不同类型的
我的Oracle support中的支持说明说,最好检查视图中的类型:X$KWDDEF
现在,V$RESERVED_WORDS视图是如何由X$KWDDEF形成的?这是基础查询:
SELECT inst_id, keyword, LENGTH,
DECODE (MOD (TRUNC (TYPE / 2), 2), 0, 'N', 1, 'Y', '?') reserved,
DECODE (MOD (TRUNC (TYPE / 4), 2), 0, 'N', 1, 'Y', '?') res_type,
DECODE (MOD (TRUNC (TYPE / 8), 2), 0, 'N', 1, 'Y', '?') res_attr,
DECODE (MOD (TRUNC (TYPE / 16), 2), 0, 'N', 1, 'Y', '?') res_semi,
DECODE (MOD (TRUNC (TYPE / 32), 2), 0, 'N', 1, 'Y', '?') duplicate
FROM x$kwddef;
那么类型究竟是什么呢?TYPE列用作对单词进行分组的存储桶
SQL> select type, count(*)
2 from x$kwddef
3 group by type
4 order by 1
5 /
TYPE COUNT(*)
---------- ----------
1 1939
2 96
9 2
16 28
33 20
34 4
6 rows selected.
因此,根据甲骨文的建议,这两行是不一样的。它们属于不同的类型
关键字“NULL”不应该被这些行中的NULL值误解。NULL关键字完全不同,长度为4
SQL> select indx, keyword, length, type from X$KWDDEF where keyword = 'NULL';
INDX KEYWORD LENGTH TYPE
---------- ---------- ---------- ----------
338 NULL 4 2
由于'X$KWDDEF'有一个'NULL'关键字条目作为类型2,因此可以安全地忽略这两行。我猜X$KWDDEF意味着内核单词定义,只是一个猜测 据我所知,这表明只有一个空作为保留关键字不确定,但更多信息请参阅。我在GV_$RESERVED_WORDS视图中看到两个条目,目前无法深入到底层的x$kwddef视图中。@R.t.你说得对。如果我从v$reserved_words中选择*关键字='NULL',我得到一行。但是如果我搜索关键字的null值而不是字符串'null',我会得到两个。这很奇怪。更有趣的是它们不是复制品:-。Oracle在对自己的元数据实施约束方面做得很好。我不知道这能说明什么。这两行表示null是保留的,而不是保留的,您实际上刚刚重新启动了OP所询问的内容-它没有解释为什么有两个明显冲突的条目?当然,null在很多方面都是不寻常的,我认为它为什么会出现在这里一点也不明显。@Alex,我不同意你的说法,两行说null是保留的,不是保留的。它没有说空关键字。NULL关键字是视图中长度为4的另一行,可以在关键字为“NULL”的位置看到。上面提到的这两行的长度为0。我说的是null,而不是字符串“null”。您不能使用“NULL”作为标识符,这在表、文档和SQL*Plus帮助中是清楚的。问题是关于关键字为null的两行。显然你不能有一个空标识符,甚至有一个特殊的错误,ORA-01741,但是这个视图中的行没有太大意义。这可能是一个历史文物,但仍然没有解释。我试着深入研究内核视图,还搜索了MOS,没有任何关于关键字列中两行空值的描述。无论我能理解和解释什么,我都在上面的答案中添加了。它不是'K$WDDEF',而是您在自己的代码中显示的X$KWDDEF。就像在关键字定义中一样。
SQL> select type, count(*)
2 from x$kwddef
3 group by type
4 order by 1
5 /
TYPE COUNT(*)
---------- ----------
1 1939
2 96
9 2
16 28
33 20
34 4
6 rows selected.
SQL> select indx, keyword, length, type from X$KWDDEF where keyword = 'NULL';
INDX KEYWORD LENGTH TYPE
---------- ---------- ---------- ----------
338 NULL 4 2