使用动态数据创建BIRT数据集-ORA-01722
Creating a BIRT Data Set with Dynamic Data - ORA-01722
在获取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报表参数。(您还应该更改查询文本中的任何其他替换文本,以绑定参数标记(?
),并根据需要将数据集参数映射到它们。)
- React中的数据集表示
- 使用相同的数据集绘制各种符号
- 多维数据集网格未在指定的分区中绘制
- chart.js 2.0为数据集添加了新属性
- Kendo网格中数据集的最高值
- 具有大型数据集的组件仅在 IE11/Edge 上运行缓慢
- 具有关联数组数据集的D3.js表
- javascript中网络图表的大型数据集
- 具有多个数据集的分组散点图D3
- 如何在web上动态可视化数据集
- Javascript D3如何从CSV访问和操作数据集
- Chart.js2.X中的条形值-数据集元数据未定义
- 访问HTML数据集
- D3.js如何只创建一个绑定到多个数据项的数据集的元素
- WebGL多纹理多维数据集
- 如何外部联接两个数据集(基于多个主键)
- 在 BIRT 中输入参数后更新数据集查询
- Birt:从 beforeFactory 访问数据集的内容
- 使用动态数据创建BIRT数据集-ORA-01722
- 在 BIRT 中,如何从 JavaScript 访问任意数据集