我有一个db2查询的birt数据集。我的查询在没有参数的情况下正常工作,具有以下查询...
with params as (SELECT '2014-02-16' enddate,'1' locationid FROM sysibm.sysdummy1)
select
t.registerid
from (
select
...
FROM params, mytable sos
WHERE sos.locationid=params.locationid
AND sos.repositorytype ='xxx'
AND sos.repositoryaccountability='xxx'
AND sos.terminalid='xxx'
AND DATE(sos.balanceDate) between date(params.enddate)-6 DAY and date(params.enddate)
GROUP BY sos.terminalid,sos.balancedate,params.enddate) t
GROUP BY
t.registerid
WITH UR
但是当我将顶线更改为......
with params as (SELECT ? enddate,? locationid FROM sysibm.sysdummy1)
并使字符串数据类型的两个输入参数得到db2错误sqlcode -418。但我知道这不是我的特质,因为我的查询有效。
我设置参数的正确方法是什么,所以没有错误?
感谢
答案 0 :(得分:1)
我不熟悉DB2编程,但在Oracle上?适用于查询中的任何位置。
似乎在DB2上它有点复杂,你应该使用“类型化参数标记”。
医生说:
输入参数标记
使用其目标数据类型指定的参数标记。类型化参数标记具有以下一般形式: CAST(?AS数据类型) 这种CAST规范的调用是一个“承诺”,即运行时参数的数据类型将是指定的数据类型或可分配给指定数据类型的某种数据类型。
除此之外,始终确保您的日期字符串采用DB期望的格式,并在日期函数中使用显式格式掩码,如下所示:
with params as (
SELECT cast (? as varchar(10)) enddate,
cast (? as varchar2(80)) locationid
FROM sysibm.sysdummy1
)
select
...
from params, ...
where ...
AND DATE(sos.balanceDate) between date(XXX(params.enddate))-6 DAY and date(XXX(params.enddate))
...
不幸的是我无法告诉你XXX函数应该如何看待DB2。 在Oracle上,一个例子是
to_date('2014-02-18', 'YYYY-MM-DD')
在DB2上,请参阅Converting a string to a date in DB2
答案 1 :(得分:1)
除了hvb回答,我还看到两个选项:
选项1 您可以使用DB2存储过程而不是纯SQL查询。因此,由于JDBC查询参数,您不会遇到这些限制。
选项2 ,我们应该能够删除查询的第一行“with params as”并将其替换为查询中的问号:
select
t.registerid
from (
select
sos.terminalid,sos.balancedate,max(sos.balanceDate) as maxdate
FROM params, mytable sos
WHERE sos.locationid=?
AND sos.repositorytype ='xxx'
AND sos.repositoryaccountability='xxx'
AND sos.terminalid='xxx'
AND DATE(sos.balanceDate) between date(?)-6 DAY and date(?)
GROUP BY sos.terminalid,sos.balancedate) t
GROUP BY
t.registerid
一个小缺点是,这次我们需要在BIRT而不是2中声明3个数据集参数。更讨厌,我从“group by”中删除params.endDate并将其替换为select中的“max(sos.balanceDate)”条款。这非常接近但并非严格等同。如果在您的上下文中这是不可接受的,则存储过程可能是最佳选择。