ORA-00904 & ORA-00928与oracle保留字
从informix中迁移数据到oracle时,发现表的列使用了oracle的保留字level。
下面模拟一下问题解决过程:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as CAICPROD_7601
SQL> CREATE TABLE TEST_RESERVED (LEVEL VARCHAR2(10));
CREATE TABLE TEST_RESERVED (LEVEL VARCHAR2(10))
ORA-00904: : invalid identifier
-- 给level加双引号后,建表成功
SQL> CREATE TABLE TEST_RESERVED ("LEVEL" VARCHAR2(10));
Table created
SQL> insert into TEST_RESERVED (LEVEL) values ('abcd');
insert into TEST_RESERVED (LEVEL) values ('abcd')
ORA-00928: missing SELECT keyword
SQL> INSERT INTO TEST_RESERVED VALUES('abcd');
1 row inserted
--同样给level加双引号后,插入数据成功
SQL> insert into TEST_RESERVED ("LEVEL") values ('abcde');
1 row inserted
SQL> commit;
Commit complete
SQL> SELECT * FROM TEST_RESERVED;
LEVEL
----------
abcd
abcde
oracle中每个版本的保留字略有差别,可以从V$RESERVED_WORDS中获取。
下述SQL查询出了oracle中完全禁止使用的保留字。
SQL>SELECT * FROM V$RESERVED_WORDS WHERE reserved='Y';
虽然通过加双引号可以避免oracle保留字带来的问题,但给以后的使用和维护带来了麻烦。
所以还是尽量避免不使用oracle的保留字做列名。