Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Oracle的v$reserved_words视图中有两个“null”关键字?_Oracle - Fatal编程技术网

为什么Oracle的v$reserved_words视图中有两个“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

我注意到我们的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”。是,其中一行保留为“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