DB2 错误 字符串列、主变量、常量或函数的使用不当

Posted

技术标签:

【中文标题】DB2 错误 字符串列、主变量、常量或函数的使用不当【英文标题】:DB2 error Improper use of a string column, host variable, constant, or function 【发布时间】:2013-04-01 10:15:18 【问题描述】:

我正在尝试在所有表和列中搜索某个值,并且我正在使用 php 连接到 IBM DB2 数据库。我想知道这个错误是否是由于多次使用联合造成的。

这是我的错误信息:

Improper use of a string column, host variable, constant, or function "NAMABARANG". SQLSTATE=42907 SQLCODE=-134

这是我的代码:

$keyword=$_GET['keyword'];
$query="SELECT * FROM INVENTORY WHERE NAMABARANG LIKE '%".$keyword."%'".
    " UNION ALL SELECT * FROM INVENTORY WHERE ARRIVALDATE LIKE '%".$keyword."%'".
     " UNION ALL SELECT * FROM INVENTORY WHERE PAPERNUMBER LIKE '%".$keyword."%'".
     " UNION ALL SELECT * FROM INVENTORY WHERE SERIALNUMBER LIKE '%".$keyword."%'".
     " UNION SELECT * FROM INVENTORY WHERE CONDITION LIKE '%".$keyword."%'".
     " UNION ALL SELECT * FROM INVENTORY WHERE LOCATION LIKE '%".$keyword."%'".
     " UNION ALL SELECT * FROM INVENTORY WHERE CONFIRMATIONDATE LIKE '%".$keyword."%'".
     " UNION ALL SELECT * FROM INVENTORY WHERE BARCODE LIKE '%".$keyword."%'".
     " UNION ALL SELECT * FROM USERANDPASSWORD WHERE USERNAME LIKE '%".$keyword."%'";
     " UNION ALL SELECT * FROM USERANDPASSWORD WHERE ACCESS LIKE '%".$keyword."%'";

【问题讨论】:

在您的上下文中,Namabaran 是什么?您是否尝试过按“部分”执行查询,每个选择单独执行,然后仅按对执行联合,等等。 Namabarang 是一个字段名 【参考方案1】:

查看有关该错误消息 here 的信息。问题似乎是NAMABARANG 是长字符/ clob 类型之一,在执行分组的查询中使用它是非法的。此查询执行分组,因为其中一个子查询使用UNION 而不是UNION ALLUNION 删除重复行时的分组。

这样的查询可能不会返回所有列 (SELECT *)。相反,只返回你真正需要的东西。可能是一个 ID 列,可以识别匹配的每一行,以及匹配的列和表的名称。这将消除错误。

其他几点:

您的代码非常不安全!您直接从表单中获取参数并将其插入 SQL。有人可以用它来做各种邪恶的事情,甚至从你的数据库中删除表。请查看the first answer to this question,了解在查询中使用用户输入数据的安全方式。 您正在合并来自两个不同表的行 USERANDPASSWORD 是否具有与 INVENTORY 完全相同的列?否则,这个工会将无法运作。通过不选择 * 来解决此问题,而是从每个表中选择一组相似的列。 UNION 或 UNION ALL? 如果不止一列包含搜索字符串,是否要从单行返回多个匹配项?如果是这样,请使用UNION ALL。否则,请使用 UNION 删除重复项。

【讨论】:

非常感谢您的帮助,现在错误已解决。我想删除多个匹配记录,但我在位置和条件字段中使用了 long varchar,除了编辑字段数据类型还有其他方法吗? @StephenAdipradhana, long varchar 在最近的 DB2 版本中已弃用。你可能不应该使用它。在最近的版本中,常规的varchar 可以容纳 32K 字节(与 long varchar 一样多)。有关详细信息,请查看特定版本的手册。 我尝试使用 Data Studio 3.2 将表更改为 varchar(100),但失败了,错误消息是:ALTER TABLE "DB2ADMIN.INVENTORY" 为列 "NAMABARANG" 指定的属性不是与现有列兼容.. SQLCODE=-190, SQLSTATE=42837, DRIVER=3.64.106 @StephenAdipradhana,也许你有超过 100 个字符的数据?或者也许它根本不允许您将列从 long varchar 更改为其他内容?另一种选择是创建一个新列,然后通过更新复制值,然后删除旧列,然后重命名新列。 我通过将 long varchar 更改为 char(100) 找到了解决方案,似乎不允许将 long varchar 更改为 varchar。感谢您的帮助。

以上是关于DB2 错误 字符串列、主变量、常量或函数的使用不当的主要内容,如果未能解决你的问题,请参考以下文章

使用字符串列旋转 SQL 表的语法错误

javascript 变量常量 函数 声明

pandas - 合并字符串列不起作用(错误?)

指针函数不可以返回局部变量地址解决

Delphi中的SendKeys函数无法使用常量

从 pandas DataFrame 中的多个字符串列中删除子字符串