在Oracle数据库 中有一些单词具有特定的意思也许不是提供给你的但是使用它们你就可以不必解析执行和获取你所编写的代码为了更准确在第一句话中的一些单词可以归类为保留字和关键字在关键字的分类中上下文起到了作用因为一个单词不总是保留字例如单词COMMIT 本身可以触发很多事件所以你可能要假设COMMIT 是Oracle密切使用的一个关键字从Oracle 的角度看就是只有它可以使用这个单词但结果是COMMIT 并没有如它希望的那样如果你想的话你可以创建一个叫做COMMIT 的表因为COMMIT 是一个关键字这比保留字的级别要低
SQL> create table commit (id number);
Table create
SQL>
保留字是被锁定的而关键字在某些条件下可以使用审查是一个有用的工具或功能那么如果你想创建你自己的审查表你是否可以使用create table audit ()语句呢?
SQL> create table audit (id number);
create table audit (id number);
*
ERROR at line :
ORA:invalid table name
SQL>
至少在SQL中是不行的你不能通过这种方法使用audit既然你不想使用这些特殊单词那么你怎样能知道(或者你能从哪找到)特殊单词有哪些呢?在文档库(在一个索引中)中的几个指导包括了这个列表但是权威的和一站式的来源是V$RESERVED_WORDS 数据字典视图
视图的名称表示这只是关于保留字的;但是描述视图的时候重要的主键列被称为KEYWORD这使得当我要了解关键字和保留字的区别时把我搞糊涂了它使得视图中的第二列也很重要RESERVED因此V$RESERVED_WORDS 的解码环如下所示
RESERVED值
意思
Y
是保留字
N
不是保留字
数据库参考指导在对V$RESERVED_WORDS的描述中准确地表达了这个意思视图有其它几个字段而它们所显示出来的(或没有)很有意思拿LENGTH举例这个字段如它的名字所显示的表示了关键字的长度这带来两个问题首先为什么这个长度重要呢?其次这个值既然很容易得到那为什么不把它存储为一个属性呢?(是哪个正规化作出这个例外的?)
在Oracle g 中有个关键字长度是有个关键字长度为或为空这些长度为或为空的关键字有哪些呢(而且它们的保留状态是什么)?我正在思考长度为的关键字因为它们通常包括符号也可以包括关键字>>但是这样的话要考虑的关键字的数量就超出了在这里所需要考虑的
关键字(保留的)
关键字(不保留的)
|
:
[
<
]
!
*
>
(
=
@
^
/
)
+
&
E
A
G
M
K
U
P
T
在非保留关键字字段中有两个值为空的例子它们显示为一个空格或为空或其它的什么吗?这个问题很难回答因为它们都没有ASCII 值如果其中一个表现为一个或多个空格的形式那么可能backspacetab新行或者空格的值就对应地变成了或
让我们更深一层地研究视图定义并看看这些值是从哪来的使用Toad 深入到GV_$RESERVED_WORDS 脚本(在SYS schema下面VIEWS)中我们看到下面的内容
SELECTinst_idkeywordLENGTH
DECODE(MOD(TRUNC(TYPE/))NY?)reserved
DECODE(MOD(TRUNC(TYPE/))NY?)res_type
DECODE(MOD(TRUNC(TYPE/))NY?)res_attr
DECODE(MOD(TRUNC(TYPE/))NY?)res_semi
DECODE(MOD(TRUNC(TYPE/))NY?)duplicate
FROMx$kwddef;
在格式化一些字段并按类型排序之后(只针对长度小于等于的)输出下面的内容
ADDR INDX INST_ID KEYWORD LENGTH TYPE
DE
DDC E
DCB A
D G
DBC M
DC K
DA U
DEC
DA P
DCC T
DE |
DFF :
DA
DAA [
DADE <
DBB ]
DBEC !
DCC *
DBAC >
DD (
D =
DCBC
D @
DFDC ^
DB /
DA
DBC )
DF +
D &
TYPE 字段用作分组全部的类型数量如下所示
SQL> select type count(*)
from x$kwddef
group by type
order by ;
TYPE COUNT(*)
将类型的值作为一个指示器将一个单词指定为具有重复的意思使它具有一个足够高的类型值(大于)以便分割的截断大于这个具有重复值的单词是
关键字
PRIVILEGE
NOPARALLEL_INDEX
NESTED_TABLE_SET_REFS
INTEGER
NOREWRITE
REFERENCING
NO_FILTERING
SB
UB
INDEX_RS
SMALLINT
NOCPU_COSTING
PARALLEL
ROLES
MAXARCHLOGS
CONSTRAINTS
DECIMAL
CHAR
这些单词真的与其它关键字具有同一个意思吗?通过计算答案是否定的直接的单词数()和总的单词数()间只有两个数的差距这是否是和单词的目的或功能有某种关联呢?就是说是否CHAR是(大致是)和VARCHAR一个意思呢?如果是这样的话那么VARCHAR(或VARCHAR选一个)也应该是相同的那么这个相同的意思就有点神秘了
让我们来看一个从Oracle 公司的展望而来的问题在OTN论坛上的一个技术作者在创建新的关键字一栏里发表了一篇文章叫做认识到的一个关键问题许多的(如果不是所有的)有记录的优化器hint是某种形式的关键字假设你创建一个叫做GO_FAST 的存储过程但是在下一个版本的关系数据库管理系统中就有一个新的(假设我们愿意等这么久!)叫做GO_FAST 的hint 供你使用你就可以开始想象当已创建的对象名称为了不和新版本中的保留字沖突而要改名时接收到的客户的海量抱怨
但是已记录的单词数从版本中的增加到了中的个减少两个视图的结果就是g 有个关键字在i 中找不到而i 有两个(不算空白的话)在g 中找不到许多新的单词是和优化器hint有关的
作为一个开发人员你需要能够开发一个用户无权使用的scheme可以在你的关系数据库管理系统产品的开始建立一个scheme这个scheme不只要阻止与它不一致的用户还要只允许一些选定的用户能够首先看到它X$表就是用于这个的
我试着解释在X$表名称背后所隐藏的意思几个来源定义了许多X$表;一个相当广泛的来源是MetaLink 的注解即使有了这个列表kwddef的意思也还没有表示出来我们知道开头k是核心的意思我曾经猜测wddef可能是与单词定义有关
关键是在SYS中所命名的避免了沖突但是在SYS中所显示出来的(通过视图作为一种方式)可能会与你的代码或命名scheme 沖突你肯定已经做过这样的事情在Oracle 中在某些等级上一个对象有且只有一个名称用户A和用户B可以各有一个叫做EMP的表但是最多只能有一个具有和EMP相同名称的公共同义字假设一个用户叫做A:
SQL> create table aemp as select * from scottemp;
Table created
SQL> create public synonym emp for scottemp;
Synonym created
SQL> create public synonym emp for aemp;
create public synonym emp for aemp
*
ERROR at line :
ORA: name is already used by an existing object
结束语
建立一个命名规范特别是对于关键字这使我想起了在骑士保护圣杯时看到的(在圣战奇兵中的情景)当Donovan (Jones的敌人)选了错误的酒杯后可怕的死状他选了可怜的一旦选好了关键字并且产品发布给了用户那么再要添加更多的关键字(或要将一个非保留字改变为一个保留字)就很困难了在早期所做的表面上看起来没什么关系的选择或决定可能限制你将来的选择尽管允许某些单词可以重新定义看起来好像你具有了很大的灵活性但是你可能只是使这条路越来越混乱
而使得情况更加复杂的是Oracle 的一些关键字同时还是ANSI保留字此外如果使用不同的系统那么在系统A中的关键字可能在系统B中不是关键字在电影的后面部分在Indiana 选中了正确的酒杯之后骑士说道你选对了当给出了许多单词来选择时这可能很难做到现在选择你所需要的并且如果可能的话设置一些保留状态的保留字以防万一在将来将它们删除要比试着要求它们要来得容易