在创建表时如果使用了Oralce的某些保留字,将会收到系统提示的“无效名”等错误,那么Oracle都有哪些保留字需要回避呢?
这个问题完全可以使用Oralce自带的V$RESERVED_WORDS视图来回答,不同的版本中这个视图中记录的内容是有差别的,以实际环境查询内容为准。
简单演示一下使用保留字创建表时报错的现象。当看到有类似“invalid ... name”等错误时,就要提高警惕了,不是你敲错了字母就是用到了某些被禁止使用的保留字。
1.保留字作为列名时
例如,我们打算使用“number”这个名字作为表的一个列名,尝试创建这个表是就会收到报错
sec@ora10g> create table t (number int);
create table t (number int)
*
ERROR at line 1:
ORA-00904: : invalid identifier
2.保留字作为表名时
使用“number”作为表名也是一样会报错
sys@ora10g> create table number ( x int);
create table number ( x int)
*
ERROR at line 1:
ORA-00903: invalid table name
3.查询一下还有哪些保留字不可以作为标识符(以Oracle 10gR2环境为例)
如果V$RESERVED_WORDS视图的RESERVED字段内容是“Y”表示这个保留字不可以在标识符中使用的。
sys@ora10g> select * from v$reserved_words where RESERVED = 'Y';
KEYWORD LENGTH R R R R D
------------------------------ ---------- - - - - -
SHARE 5 Y N N N N
+ 1 Y N N N N
PCTFREE 7 Y N N N N
EXISTS 6 Y N N N N
& 1 Y N N N N
INSERT 6 Y N N N N
DROP 4 Y N N N N
BETWEEN 7 Y N N N N
FROM 4 Y N N N N
) 1 Y N N N N
DESC 4 Y N N N N
OPTION 6 Y N N N N
TO 2 Y N N N N
PRIOR 5 Y N N N N
LONG 4 Y N N N N
THEN 4 Y N N N N
DEFAULT 7 Y N N N N
IS 2 Y N N N N
, 1 Y N N N N
INTO 4 Y N N N N
HAVING 6 Y N N N N
MINUS 5 Y N N N N
INTEGER 7 Y N N N Y
UPDATE 6 Y N N N N
GRANT 5 Y N N N N
/ 1 Y N N N N
ALL 3 Y N N N N
^ 1 Y N N N N
ORDER 5 Y N N N N
EXCLUSIVE 9 Y N N N N
FLOAT 5 Y N N N N
DATE 4 Y N N N N
ON 2 Y N N N N
NUMBER 6 Y N N N N
UNION 5 Y N N N N
RESOURCE 8 Y N N N N
PUBLIC 6 Y N N N N
TABLE 5 Y N N N N
VARCHAR2 8 Y N N N N
@ 1 Y N N N N
ELSE 4 Y N N N N
VALUES 6 Y N N N N
. 1 Y N N N N
RENAME 6 Y N N N N
AS 2 Y N N N N
= 1 Y N N N N
ALTER 5 Y N N N N
INDEX 5 Y N N N N
FOR 3 Y N N N N
WHERE 5 Y N N N N
CHECK 5 Y N N N N
SMALLINT 8 Y N N N Y
WITH 4 Y N N N N
DELETE 6 Y N N N N
REVOKE 6 Y N N N N
( 1 Y N N N N
SIZE 4 Y N N N N
NOCOMPRESS 10 Y N N N N
> 1 Y N N N N
AND 3 Y N N N N
| 1 Y N N N N
: 1 Y N N N N
NULL 4 Y N N N N
GROUP 5 Y N N N N
ASC 3 Y N N N N
IN 2 Y N N N N
VIEW 4 Y N N N N
SET 3 Y N N N N
COMPRESS 8 Y N N N N
- 1 Y N N N N
[ 1 Y N N N N
NOT 3 Y N N N N
LIKE 4 Y N N N N
TRIGGER 7 Y N N N N
SELECT 6 Y N N N N
CLUSTER 7 Y N N N N
LOCK 4 Y N N N N
CREATE 6 Y N N N N
INTERSECT 9 Y N N N N
] 1 Y N N N N
DISTINCT 8 Y N N N N
! 1 Y N N N N
CONNECT 7 Y N N N N
MODE 4 Y N N N N
OF 2 Y N N N N
RAW 3 Y N N N N
* 1 Y N N N N
UNIQUE 6 Y N N N N
SYNONYM 7 Y N N N N
VARCHAR 7 Y N N N N
ANY 3 Y N N N N
DECIMAL 7 Y N N N Y
IDENTIFIED 10 Y N N N N
OR 2 Y N N N N
START 5 Y N N N N
NOWAIT 6 Y N N N N
BY 2 Y N N N N
CHAR 4 Y N N N Y
99 rows selected.
4.强制使用保留字的方法
如果要强制使用这些保留字,可以使用双银行将保留字括起来使用。不过如果使用了保留字,那么使用起时将非常的不便,而且极易出现混淆的问题,因此应该严格禁止这种情况的发生。
1)以上面的例子为例演示一下使用保留字成功创建表的情况
sys@ora10g> create table t ("number" int);
Table created.
sys@ora10g> create table "number" ( x int);
Table created.
sys@ora10g> desc t
Name Null? Type
------------------------- -------- ----------------
number NUMBER(38)
2)此时必须使用带引号的形式引用这个特殊的表名,操作不便,而且容易出现错误。
sys@ora10g> desc "number"
Name Null? Type
------------------------- -------- ----------------
X NUMBER(38)
5.V$RESERVED_WORDS视图中的其他列的的含义请参考Oracle的官方文档
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2048.htm#REFRN30204
V$RESERVED_WORDS
6.小结
很多问题Oracle都在内部给出了答案,很是便利。如本例中使用V$RESERVED_WORDS视图快速得到保留字的功能就是一个很好的例子。
Good luck.
secooler
09.12.03
-- The End --
这个问题完全可以使用Oralce自带的V$RESERVED_WORDS视图来回答,不同的版本中这个视图中记录的内容是有差别的,以实际环境查询内容为准。
简单演示一下使用保留字创建表时报错的现象。当看到有类似“invalid ... name”等错误时,就要提高警惕了,不是你敲错了字母就是用到了某些被禁止使用的保留字。
1.保留字作为列名时
例如,我们打算使用“number”这个名字作为表的一个列名,尝试创建这个表是就会收到报错
sec@ora10g> create table t (number int);
create table t (number int)
*
ERROR at line 1:
ORA-00904: : invalid identifier
2.保留字作为表名时
使用“number”作为表名也是一样会报错
sys@ora10g> create table number ( x int);
create table number ( x int)
*
ERROR at line 1:
ORA-00903: invalid table name
3.查询一下还有哪些保留字不可以作为标识符(以Oracle 10gR2环境为例)
如果V$RESERVED_WORDS视图的RESERVED字段内容是“Y”表示这个保留字不可以在标识符中使用的。
sys@ora10g> select * from v$reserved_words where RESERVED = 'Y';
KEYWORD LENGTH R R R R D
------------------------------ ---------- - - - - -
SHARE 5 Y N N N N
+ 1 Y N N N N
PCTFREE 7 Y N N N N
EXISTS 6 Y N N N N
& 1 Y N N N N
INSERT 6 Y N N N N
DROP 4 Y N N N N
BETWEEN 7 Y N N N N
FROM 4 Y N N N N
) 1 Y N N N N
DESC 4 Y N N N N
OPTION 6 Y N N N N
TO 2 Y N N N N
PRIOR 5 Y N N N N
LONG 4 Y N N N N
THEN 4 Y N N N N
DEFAULT 7 Y N N N N
IS 2 Y N N N N
, 1 Y N N N N
INTO 4 Y N N N N
HAVING 6 Y N N N N
MINUS 5 Y N N N N
INTEGER 7 Y N N N Y
UPDATE 6 Y N N N N
GRANT 5 Y N N N N
/ 1 Y N N N N
ALL 3 Y N N N N
^ 1 Y N N N N
ORDER 5 Y N N N N
EXCLUSIVE 9 Y N N N N
FLOAT 5 Y N N N N
DATE 4 Y N N N N
ON 2 Y N N N N
NUMBER 6 Y N N N N
UNION 5 Y N N N N
RESOURCE 8 Y N N N N
PUBLIC 6 Y N N N N
TABLE 5 Y N N N N
VARCHAR2 8 Y N N N N
@ 1 Y N N N N
ELSE 4 Y N N N N
VALUES 6 Y N N N N
. 1 Y N N N N
RENAME 6 Y N N N N
AS 2 Y N N N N
= 1 Y N N N N
ALTER 5 Y N N N N
INDEX 5 Y N N N N
FOR 3 Y N N N N
WHERE 5 Y N N N N
CHECK 5 Y N N N N
SMALLINT 8 Y N N N Y
WITH 4 Y N N N N
DELETE 6 Y N N N N
REVOKE 6 Y N N N N
( 1 Y N N N N
SIZE 4 Y N N N N
NOCOMPRESS 10 Y N N N N
> 1 Y N N N N
AND 3 Y N N N N
| 1 Y N N N N
: 1 Y N N N N
NULL 4 Y N N N N
GROUP 5 Y N N N N
ASC 3 Y N N N N
IN 2 Y N N N N
VIEW 4 Y N N N N
SET 3 Y N N N N
COMPRESS 8 Y N N N N
- 1 Y N N N N
[ 1 Y N N N N
NOT 3 Y N N N N
LIKE 4 Y N N N N
TRIGGER 7 Y N N N N
SELECT 6 Y N N N N
CLUSTER 7 Y N N N N
LOCK 4 Y N N N N
CREATE 6 Y N N N N
INTERSECT 9 Y N N N N
] 1 Y N N N N
DISTINCT 8 Y N N N N
! 1 Y N N N N
CONNECT 7 Y N N N N
MODE 4 Y N N N N
OF 2 Y N N N N
RAW 3 Y N N N N
* 1 Y N N N N
UNIQUE 6 Y N N N N
SYNONYM 7 Y N N N N
VARCHAR 7 Y N N N N
ANY 3 Y N N N N
DECIMAL 7 Y N N N Y
IDENTIFIED 10 Y N N N N
OR 2 Y N N N N
START 5 Y N N N N
NOWAIT 6 Y N N N N
BY 2 Y N N N N
CHAR 4 Y N N N Y
99 rows selected.
4.强制使用保留字的方法
如果要强制使用这些保留字,可以使用双银行将保留字括起来使用。不过如果使用了保留字,那么使用起时将非常的不便,而且极易出现混淆的问题,因此应该严格禁止这种情况的发生。
1)以上面的例子为例演示一下使用保留字成功创建表的情况
sys@ora10g> create table t ("number" int);
Table created.
sys@ora10g> create table "number" ( x int);
Table created.
sys@ora10g> desc t
Name Null? Type
------------------------- -------- ----------------
number NUMBER(38)
2)此时必须使用带引号的形式引用这个特殊的表名,操作不便,而且容易出现错误。
sys@ora10g> desc "number"
Name Null? Type
------------------------- -------- ----------------
X NUMBER(38)
5.V$RESERVED_WORDS视图中的其他列的的含义请参考Oracle的官方文档
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2048.htm#REFRN30204
V$RESERVED_WORDS
This view gives a list of all SQL keywords. To determine whether a particular keyword is reserved in any way, check the RESERVED, RES_TYPE, RES_ATTR, and RES_SEMI columns.
Column | Datatype | Description |
---|---|---|
KEYWORD | VARCHAR2(30) | Name of the keyword |
LENGTH | NUMBER | Length of the keyword |
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. |
6.小结
很多问题Oracle都在内部给出了答案,很是便利。如本例中使用V$RESERVED_WORDS视图快速得到保留字的功能就是一个很好的例子。
Good luck.
secooler
09.12.03
-- The End --
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-621601/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/519536/viewspace-621601/