EclipseLink:列名'版本'导致ORA-00942

时间:2014-11-26 16:21:36

标签: java oracle11g eclipselink

Eclipse Link在我们的RCP应用程序中的持久化类中创建一个查询,如下所示:

select column1, column2, ..., version from table_name

使用这样的选择,我们得到错误' ORA-00942',说表或视图不存在。我们正在使用Oracle 11g数据库。相同的语句与JDBC连接(不使用Eclipse Link)一起使用没有问题。同样在SQLPlus中,该语句有效。我们检查了访问权限,确保在我们的所有测试中拥有相同的用户,数据库等。 我们试图在持久化类中设置列版本的注释以使用双引号:

@Column(name="\"VERSION\"", nullable=false, precision=22)
private BigDecimal version;

之后它起作用了。所有其他列,也是表名,都没有引号。只是这个专栏'版本'需要报价,为什么。专栏版本'是DDL脚本的一部分,它没有使用任何双引号。所有列名都是大写的。表名相同。

在SQLDeveloper中,'版本'被标记为关键字。但我无法解释如何使用' version'因为列名可能会对SQL语句产生影响。

有人知道关键字'版本'可能会对Eclipse Link或Oracle中的查询产生影响吗?

1 个答案:

答案 0 :(得分:0)

关于Oracle:

select * from V$RESERVED_WORDS where keyword = 'VERSION';


KEYWORD                  LENGTH RESERVED RES_TYPE RES_ATTR RES_SEMI DUPLICATE
-------------------- ---------- -------- -------- -------- -------- ---------
VERSION                       7 N        N        N        N        N      

此查询检查' VERSION'是一个关键字(您可能需要一些特殊权限才能从此视图中进行选择)

以下是对此观点的描述:
https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2048.htm#REFRN30204

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.

根据此信息,' VERSION'是一个关键字,但您可以将其用作标识符。