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

时间:2018-03-06 14:42:33

标签: oracle oracle11g oracle11gr2

数据库为Oracle 11g release2

有一个Spring应用程序连接到上面的数据库。所有映射都是正确的。在运行时,在提交表单以更新记录时,我得到异常invalid identifier : some_column。虽然当我通过desc commandSqlPlus上创建 success: function(datafromphp){ latest_array = JSON.parse(datafromphp); ); 时,该列就在表格中!那么如何解决这个问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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

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

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

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