Informix:WebSphere中的更新语句错误

时间:2011-12-22 04:51:14

标签: sql informix

我正在尝试运行此更新语句,但informix不允许我这样做。

我有一张桌子,名为ITEMS,下面我从中选择了一些记录。

SELECT SHORT_SKU, ITEMS."STYLE" FROM ITEMS;

SHORT_SKU        STYLE
---------        -----
01846173         null
01811752         null
01811748         null

尝试运行以下UPDATE语句,informix说语法错误。

UPDATE ITEMS SET ITEMS."STYLE" = 'M' WHERE SHORT_SKU = '01846173';
                      ^ syntax error here

然后我改变了(如下所示)并且在查询的任何表格中找不到“列(样式)”(或SLV未定义)。“

UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';

如何更新“STYLE”字段?

更新1 我对WAS数据源的一个自定义属性ifxDELIMIDENT进行了更改。原来它是空白的。所以,我把它改成了真的。重启WAS。我无法登录我们的应用程序。 WAS抛出了SQLExceptions,但由于WAS截断了最后几行,因此无法看到堆栈跟踪。将属性更改为空白后,我可以登录到我们的应用程序。

我尝试了另一种方法,即编写一个更新ITEMMST.STYLE列的Java类。我从shell脚本执行了这个。在shell脚本中,我使用值“Y”定义并导出变量DELIMIDENT。但我仍然得到'语法错误'。

更新2 我设法更新了这个专栏。这是通过在连接字符串的末尾添加'DELIMIDENT = Y'属性来完成的,该属性将在打开数据库连接时传递给DriverManager对象。

但是,这对我们的Web应用程序不起作用,因为它使用WebSphere数据源来创建数据库连接。如果有一种方法可以在Informix环境中设置此属性,那将是超级的。

5 个答案:

答案 0 :(得分:0)

使用此查询:

UPDATE ITEMS SET ITEMS.STYLE = 'M' WHERE SHORT_SKU = '01846173';

我认为列名不需要双引号。

更新的答案1: 错误说明 -

-217    Column column-name not found in any table in the query
(or SLV is undefined).

The name appears in the select list or WHERE clause of this query but is
not defined in a table and does not appear as a statement local variable
(SLV) definition. Check that the column name or SLV name and the names of
the selected tables are spelled as you intended.

If all names are spelled correctly, you are not using the right tables,
the database has been changed, or you have not defined the SLV. If the
name not found is a reference to a column, that column might have been
renamed or dropped. If the name not found represents an SLV and you
defined the SLV in the statement, make sure that the SLV definition
appears before all other references to that SLV name.

This error message can also appear during the execution of an ALTER TABLE
statement when the engine tries to update views that depend on the table.

More info link

更新了答案2:

如果无法更改列名,请获取有关SLV的更多信息。 您可以参考以下链接了解SLV的描述和使用:

link1 link2 link3

答案 1 :(得分:0)

尝试:

UPDATE ITEMS SET "STYLE" = 'M' WHERE SHORT_SKU = '01846173';

必须是STYLE是一个保留字,所以你必须引用它来引用该列。但标准UPDATE语法不允许您使用SET子句中的表名为列名添加前缀(因为您只能更新一个表的列:{{1中提到的表) }})。

答案 2 :(得分:0)

正确的语法是

UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';

正如IBM Documentation所述,但由于STYLE是reserved word,我猜您遇到问题,请阅读IBM Recommendation

无论如何,您可能会找到燕麦this link的作品,否则您可以考虑更改列名。

答案 3 :(得分:0)

我不知道STYLE是Informix中的关键字(但我还没有去寻找它)。但是,您通常可以使用关键字作为列名等,而不会出现太多问题。

如果必须引用它,则需要设置DELIMIDENT环境变量 - 值无关紧要,但使用DELIMIDENT = 1表示具体性。这使得SQL标准“分隔标识符”成为可能,其中双引号包围标识符(列名,表名等)和单引号环绕字符串。 (通常,您可以在字符串周围使用单引号或双引号。)

另一点:如果使用分隔标识符,它们也会区分大小写(而标识符通常不区分大小写)。因此,您需要知道STYLE列如何存储在系统目录中。在大多数数据库中,它们都是小写的。在MODE ANSI数据库中,有一个很大的机会,它们以大写形式存储(但是我需要一段时间才能确定)。

答案 4 :(得分:0)

有两个解决方案。

  1. 将Informix JDBC数据源“ifxDELIMIDENT”属性设置为“true”
  2. 重命名受影响的表格列
  3. 对于第一个选项,我们在将数据源设置为“true”后出现问题。突然间,我们所有的查询都无效。经过多次故障排除后,我们发现通过将'ifxDELIMIDENT'属性设置为'true',它还将Informix更改为区分大小写。在我们的Java代码中,我们的所有列名都是大写的,并且在Informix中(例如:resultSet.getString(“STYLE”)),但表列名是小写的(例如:'style')。这就是为什么在更改此属性后,我们无法登录到我们的应用程序,不幸的是,IBM的信息中心或互联网中没有记录此行为。

    我们选择了第二个选项,其中涉及将受影响的列名更改为另一个列名(例如:将'STYLE'更改为'ITEM_STYLE')。