Sql Informix:WebSphere中的Update语句错误

Sql Informix:WebSphere中的Update语句错误,sql,informix,Sql,Informix,我正在尝试运行此更新语句,但informix不允许我这样做 我有一个表,命名的项目,下面我从中选择了一些记录 SELECT SHORT_SKU, ITEMS."STYLE" FROM ITEMS; SHORT_SKU STYLE --------- ----- 01846173 null 01811752 null 01811748 null 尝试运行下面的UPDATE语句时,informix表示语法错误 UPDAT

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

我有一个表,命名的项目,下面我从中选择了一些记录

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未定义)”

如何更新“样式”字段

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

我尝试了另一种方法,那就是编写一个Java类来更新ITEMMST.STYLE列。我是通过一个shell脚本执行的。在shell脚本中,我定义并导出了值为“Y”的变量DELIMIDENT。但我仍然得到“语法错误”

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

但是,这对我们的web应用程序不起作用,因为它使用WebSphere数据源来创建db连接。如果有办法在Informix环境本身中设置此属性,那就太好了。

使用此查询:

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.

最新答复2:

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

试试:

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

必须说明
STYLE
是一个保留字,因此必须将其双引号引到该列中。但是标准的
UPDATE
语法不允许您在
SET
子句中使用表名作为列名前缀(因为您只能更新一个表的列:更新
中提到的表)。

正确的语法是

UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';
如前所述,但由于风格是一个问题,我想你会遇到问题,请阅读此


无论如何,你可以找到一个OAT的工作,否则你可以考虑更改列名。

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

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


还有一点:如果使用分隔标识符,它们也会区分大小写(而通常情况下,标识符不区分大小写)。因此,您需要知道样式列如何存储在系统目录中。在大多数数据库中,它们都是小写的。在模式ANSI数据库中,它们很可能是以大写形式存储的(但我已经有一段时间没有确认了)。

有两种解决方案

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


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

    使用ITEMS.STYLE而不是ITEMS.STYLE。我认为列名不需要双引号。请尝试。它表示“SQL错误(-217):在查询中的任何表中都找不到列(样式)(或SLV未定义)。”“但未在表中定义,且未显示为语句局部变量(SLV)定义”我已使用dbaccess表信息检查了表列,并在其中看到了列样式。是否有必要将其定义为语句局部变量(SLV)?若有,我该怎么做?你们能在数据库中更改列名吗?这可能是保留关键字。请检查这样做是工作。我们可以这样做,但将有一个大的代码更改和测试。如果可能的话,我会尽量避免。我已经给出了程序和申报的细节。您是否通过定义SLV声明进行了检查?它起作用了吗?
    UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';