数据库为Oracle 11g release2
。
有一个Spring应用程序连接到上面的数据库。所有映射都是正确的。在运行时,在提交表单以更新记录时,我得到异常invalid identifier : some_column
。虽然当我通过desc command
在SqlPlus
上创建 success: function(datafromphp){
latest_array = JSON.parse(datafromphp);
);
时,该列就在表格中!那么如何解决这个问题?
答案 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不区分大小写。它不是。您可以通过将标识符括在双引号中来要求保留大小写。你做到了;你可能认为这意味着别的东西。
如果您将列定义为id
,ID
或Id
,则可以通过三个名称中的任何一个来调用它,您仍然可以获得所需的结果。但是,如果您拨打专栏"ID"
,则必须在每次引用时将其引用为"ID"
,而不是"id"
或"Id"
。 (但是,您可以将其称为id
,不带双引号,因为解析器会将其映射到ID
,这与"ID"
相同。)
实际上,您可以在同一个表中包含两列,一列名为"ID"
,另一列"id"
- 没有冲突。它们可能包含不同的数据 - 它们甚至可能具有不同的数据类型。但是,您不能拥有"ID"
和ID
(或"ID"
和id
- 因为Oracle会自动将id
映射到ID
,正如我已经说过的那样)。
在您的情况下,简单的解决方案是,删除双引号。养成永远的习惯,永远使用双引号;这将为您省去很多麻烦。