使用动态数据创建BIRT数据集-ORA-01722

Creating a BIRT Data Set with Dynamic Data - ORA-01722

本文关键字:BIRT 数据集 -ORA-01722 创建 数据 动态      更新时间:2023-09-26

在获取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无效数字错误。

对此有什么想法吗?

两个截然不同的想法:

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注入攻击——如果您不熟悉这个术语,可以在这里找到一个简单的示例。

如果你熟悉这个概念,你可能会觉得SQL注入攻击不能用数字参数来实现——Tom Kite最近在他的博客上发表了几篇关于SQL注入的文章,其中一篇文章使用带有数字的NLS设置来处理SQL注入缺陷。

相反,您应该使用绑定参数。要使用您的报告,请修改您的查询以包括:

...
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1
where D1.NHRDIST_PAYNO between ? and ?
AND D1.NHRDIST_YEAR = ?
...

从beforeOpen脚本中删除queryText替换代码,而不是现有代码,并在数据集编辑器中将三个数据集参数分别映射到PaynoBegin、PaynoEnd和Year报表参数。(您还应该更改查询文本中的任何其他替换文本,以绑定参数标记(?),并根据需要将数据集参数映射到它们。)