【问题标题】:DB2 LIKE Operator with a Variable带有变量的 DB2 LIKE 运算符
【发布时间】:2017-10-26 18:09:19
【问题描述】:

我是 DB2 的新手,它在多个 IBM iSeries 机器上运行。我在编写一个存储过程时遇到了一些困难,该存储过程将从表中选择值,其中键字段以参数的值开头。

现在在 MS SQL Server 中我会这样写:

SELECT field FROM table WHERE fieldB like parm + '%'

所以对于我的 DB2 过程,我有:

SELECT field FROM table WHERE fieldB like parm || '%'

我不仅在 IBM 文档中发现了这种语法,还在几个 SO 问题和答案中发现了这种语法。所以我明白了如何将通配符连接到参数值。

不幸的是,当我运行 CREATE PROCEDURE 语句时,我收到以下错误:

[SQL0104] 令牌 PARM 无效。有效令牌: FOR NOT CCSID NORMALIZED。

我什至也尝试过以下操作:

SET [*some declare variable*] = parm|| '%'

SET srch = CONCAT(parm, '%');

以及在 WHERE 子句中使用 CONCAT 函数:

WHERE fieldB like CONCAT(parm, '%');

每个都返回相同的错误。

那么我可能做错了什么?

【问题讨论】:

  • 你知道你的系统是什么版本吗?
  • 是的。大多数运行 V7R2,但至少有一个运行 V6R1。我相信,最终所有系统都将采用 V7R2。

标签: ibm-midrange db2-400


【解决方案1】:

应该可以正常工作...没有您的代码,我无法准确判断您做错了什么...

请注意,您必须显式声明游标以返回 Db2 中的结果集。由于您没有使用 SELECT INTO,我假设您的选择返回多行。

CREATE OR REPLACE PROCEDURE cwilt.myproc(IN parm char(128))
    LANGUAGE SQL
    BEGIN
        DECLARE myRS cursor with return to client for
          select table_name
          from systables
          where table_name like trim(parm) concat '%';

        open myRS;

    END;

call cwilt.myproc(char('SYP'));

【讨论】:

  • 完美运行。我也意识到我的输入是 11 个字符,所以我必须修剪它才能使匹配工作。
  • 假设用户可以输入 11 个字符,您可能希望声明一个 12+ 的变量,以便为 '%' 留出空间...否则您可能会遇到运行时错误。跨度>
  • 有没有办法使用?参数化(避免 SQL 注入)例如,使用 :parm 打开 myRs
【解决方案2】:

试试 SELECT field FROM table WHERE fieldB like ? || '%'

我已经在我的 iSeries 上使用了它,它应该可以根据 IBM 文档工作:

https://www.ibm.com/support/knowledgecenter/SSEPGG_9.8.0/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0020295.html

【讨论】:

  • 谢谢。但是,这可能是我更新我的过程的方式。我正在使用 ALTER PROCEDURE 来测试各种更改。然而,当我删除 proc 然后使用 CREATE PROCEDURE 时,没有错误。
  • 虽然参数标记适用于我所谓的“内联”SQL 语句,但它们不适用于存储过程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2010-12-23
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多