您的位置:首页 > 数据库 > Oracle

oracle关键字作为列名

2014-09-27 18:22 204 查看
在创建表时如果使用了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

H***ING 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

< 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_WORDSThis view gives a list of all SQL keywords. To determine whether a particular keyword is reserved in any way, check theRESERVED,RES_TYPE,RES_ATTR,
andRES_SEMIcolumns.

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视图快速得到保留字的功能就是一个很好的例子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: