尽管列在表中,但标识符无效

问题描述 投票:0回答:2

该数据库是Oracle 11g release2

有一个Spring应用程序连接到上面的数据库。所有映射都是正确的。在运行时提交表单以更新记录时,我得到例外invalid identifier : some_column。虽然当我通过desc command制作一个SqlPlus时,该列在表中!那么如何解决这个问题呢?

oracle oracle11g oracle11gr2
2个回答
3
投票

如果您的申请将标识括在双引号中,那么案件就很重要。

create table t(id1 int, id2 int);

Table created.

UPDATE T SET ID1 = 1, ID2 = 2;

0 rows updated.

update t set id1 = 1, id2 = 2;

0 rows updated.

UPDATE T SET "ID1" = 1, ID2 = 2;

0 rows updated.

update t set "id1" = 1, id2 = 2;
update t set "id1" = 1, id2 = 2
             *
ERROR at line 1:
ORA-00904: "id1": invalid identifier

3
投票

默认情况下,标识符(模式,表,列,过程等的名称)以全大写形式存储在数据目录中。您可以按照自己想要的任何方式编写它们,并且可以在查询,功能等任何部分以任何方式使用它们。解析器(预处理器)以大写形式重写它们。

但这并不意味着Oracle不区分大小写。它不是。您可以通过将标识符括在双引号中来要求保留大小写。你做到了;你可能认为这意味着别的东西。

如果将列定义为idIDId,则可以通过三个名称中的任何一个来调用它,您仍然可以获得所需的结果。但是,如果你调用"ID"列,那么每次引用时都必须将其称为"ID",而不是"id""Id"。 (但是,你可以将它称为id,没有双引号,因为解析器会将其映射到ID,这与"ID"相同。)

实际上,您可以在同一个表中有两列,一个名为"ID",另一个名为"id" - 没有冲突。它们可能包含不同的数据 - 它们甚至可能具有不同的数据类型。但是,你不能拥有"ID"ID(或"ID"id - 因为Oracle自动将id映射到ID,正如我已经说过的那样)。

在您的情况下,简单的解决方案是,删除双引号。养成永远的习惯,永远使用双引号;这样可以省去很多麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.