准备好的语句中的 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
数据类型。如果它的第一个参数是另一种数据类型,则使用对应的cast
和set<Datatype>
。
演员已经做到了。谢谢。您想将其添加为答案吗?
【参考方案1】:
试试function(cast(? as varchar(xxx)), 'foobar')
,其中xxx
对应函数第一个字符串参数的长度。在这种情况下,函数的第一个参数必须是 varchar
数据类型。如果它的第一个参数是另一种数据类型,则使用相应的强制转换和set<Datatype>
。
您需要这样做,因为可能有多个函数具有相同的名称和参数数量,但具有不同的数据类型。并且 Db2 必须知道在查询编译(准备)期间准确使用哪个函数。
【讨论】:
以上是关于准备好的语句中的 IBM DB2 标量函数参数的主要内容,如果未能解决你的问题,请参考以下文章