【问题标题】:Creating a BIRT Data Set with Dynamic Data - ORA-01722使用动态数据创建 BIRT 数据集 - ORA-01722
【发布时间】:2012-02-29 22:30:29
【问题描述】:

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

对此有什么想法吗?

【问题讨论】:

    标签: javascript eclipse birt


    【解决方案1】:

    两个完全不同的想法:

    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 报告参数。 (您还应该更改查询文本中的任何其他替换文本以绑定参数标记 (?) 并根据需要将数据集参数映射到它们。)

    【讨论】:

    • 做到了。当我在“BIRT - A Field Guide”中找到相同的解决方案时,我在发布此内容后立即尝试过,但它不起作用。再次运行它,它现在可以在 Web 查看器和我们的 Web 应用程序中运行。谢谢@Mark Ba​​nnister
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多