在获取BIRT时遇到一些麻烦,允许我创建一个带有在运行时设置的参数的数据集。
给我错误的SQL是:
...
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1
where D1.NHRDIST_PAYNO between '@PAYNO_BEGIN' and '@PAYNO_BEGIN'
AND D1.NHRDIST_YEAR = '@YEAR'
...
我的报告参数定义为PaynoBegin,PaynoEnd,Year
我还为beforeOpen设置了数据集脚本,如下所示:
queryText = String (queryText).replace ("@PAYNO_END", Number(params["PaynoEnd"]));
queryText = String (queryText).replace ("@PAYNO_BEGIN", Number(params["PaynoBegin"]));
queryText = String (queryText).replace ("@YEAR", Number(params["Year"]));
问题似乎是JDBC无法从中获取ResultSet,但是我有10个其他报告以相同的方式工作。我已经注释掉了where子句,它将生成数据集。我也尝试将where子句分解为两个和< =和> =的子句,但它仍然在行上抛出ORA-01722无效数字错误。
对此有何想法?
答案 0 :(得分:0)
两个完全不同的想法:
1)在查询中的每个参数周围都有单引号,但看起来每个参数都是数字 - 尝试删除单引号,以便where
子句如下所示:
where D1.NHRDIST_PAYNO between @PAYNO_BEGIN and @PAYNO_BEGIN
AND D1.NHRDIST_YEAR = @YEAR
不要忘记应该要求所有三个参数。如果查询仍然返回错误,请尝试使用查询字符串中的硬编码数值替换@PAYNO_BEGIN,@ PAYNO_BEGIN和@YEAR,并查看是否仍然出现错误。
2)您当前正在使用动态SQL - 修改查询字符串,以使用输入参数的文本替换指定的标记。这使您容易受到SQL Injection attacks的攻击 - 如果您不熟悉该术语,可以找到一个简单的示例here。
如果您熟悉这个概念,您可能会认为SQL注入攻击无法使用数字参数实现 - Tom Kite最近在他的blog上发布了一些关于SQL注入的文章,包括一篇处理SQL Injection flaw using NLS settings with numbers。
相反,您应该使用绑定参数。要对您的报告执行此操作,请修改您的查询以包含:
...
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1
where D1.NHRDIST_PAYNO between ? and ?
AND D1.NHRDIST_YEAR = ?
...
而不是现有代码,从beforeOpen脚本中删除queryText替换代码,并将三个数据集参数分别映射到数据集编辑器中的PaynoBegin,PaynoEnd和Year报表参数。 (您还应该更改查询文本中的任何其他替换文本以绑定参数标记(?
)并根据需要将数据集参数映射到它们。)