准备好的语句中的 IBM DB2 标量函数参数

Posted

技术标签:

【中文标题】准备好的语句中的 IBM DB2 标量函数参数【英文标题】:IBM DB2 Scalar Function Parameters in Prepared Statement 【发布时间】:2020-08-25 17:45:53 【问题描述】:

我有一个 db2 表 t1,其中一列是通过使用一个接受两个字符串参数的标量函数来填充的。

function(string foo, string bar)

在准备sql代码如下:

UPDATE t1 SET col1 = function(?, 'foobar') WHERE t1.id = ?

当我现在向准备好的语句添加一个参数时,我收到一个错误,即第一个参数的类型错误。

for (Entry entry : entries) 
    preparedStatement.setString(1, entry.getDesc());
    preparedStatement.setInt(2, entry.getId());

我已经尝试将第一个参数用单引号括起来,但这不起作用。有没有其他人遇到过这个问题并找到了解决方案? 主要问题是我现在确定 db2 引擎如何为标量函数准备第一个字符串参数,以便首先抛出错误。

【问题讨论】:

PreparedStatement 接口有 set<Datatype> 函数,有 2 或 3 个参数,第一个是 int - parameterIndex。为什么你尝试使用只有一个参数的set<Datatype> 函数? 抱歉,打错了。 尝试function(cast(? as varchar(xxx)), 'foobar'),其中xxx 是函数的第一个字符串参数的相应长度,并提供您从 Db2 获得的准确错误代码和消息。在这种情况下,函数的第一个参数必须是 varchar 数据类型。如果它的第一个参数是另一种数据类型,则使用对应的castset<Datatype> 演员已经做到了。谢谢。您想将其添加为答案吗? 【参考方案1】:

试试function(cast(? as varchar(xxx)), 'foobar'),其中xxx对应函数第一个字符串参数的长度。在这种情况下,函数的第一个参数必须是 varchar 数据类型。如果它的第一个参数是另一种数据类型,则使用相应的强制转换和set<Datatype>。 您需要这样做,因为可能有多个函数具有相同的名称和参数数量,但具有不同的数据类型。并且 Db2 必须知道在查询编译(准备)期间准确使用哪个函数。

【讨论】:

以上是关于准备好的语句中的 IBM DB2 标量函数参数的主要内容,如果未能解决你的问题,请参考以下文章

IBM DB2 LPAD/RPAD

如何使用 jdbc 准备好的语句传递可变数量的参数?

在 Apply 块中使用需要表参数的标量函数

为啥使用 mysql 准备好的语句比使用常见的转义函数更安全?

DB2 中带有准备好的语句和批处理的“无效数据转换”

mysqli_stmt::bind_param():变量的数量与准备好的语句中的参数数量不匹配