使用简单算术运算和别名时,即使表中的数据不为零,JDBC 查询也会返回零
Posted
技术标签:
【中文标题】使用简单算术运算和别名时,即使表中的数据不为零,JDBC 查询也会返回零【英文标题】:JDBC query returning zero when using simple arithmetic operations and alias even though the data in table is not zero 【发布时间】:2016-10-24 11:14:29 【问题描述】:我正在通过 android 构建一个 Web 门户,我通过 JDBC 驱动程序运行的查询返回 0,其中数据不应为零。
这是查询:
ResultSet set = statement.executeQuery("select it.itcod, it.itnam, it.packn, it.tradp, " +
"sum(nvl(itd.slbox,0) - nvl(itd.srbox,0) - nvl(itd.brbox,0) - nvl(itd.gsbox,0)) as sbox, " +
"sum(nvl(itd.slbbx,0) - nvl(itd.srbbx,0) - nvl(itd.brbbx,0) - nvl(itd.gsbbx,0)) as sbbx, " +
"SUM(NVL(itd.PRBOX,0) - NVL(itd.RPBOX,0) - NVL(itd.TRBOX,0)) as pbox, " +
"SUM(NVL(itd.PRBBX,0) - NVL(itd.RPBBX,0) - NVL(itd.TRBBX,0)) as pbbx " +
"from items it " +
"LEFT join item_daily itd " +
"on (it.cocod = itd.cocod " +
"and it.itcod = itd.itcod " +
"and ITD.ddate between " + fdate + " and " + tdate + ")" +
"WHERE IT.COCOD = " + COCOD +
"AND IT.DCODE = " + DCODE +
"AND NVL(IT.FREZE,'N')!='Y' " +
"group by it.cocod, it.itcod, it.itnam, it.packn, " +
" it.tradp, it.pkqty, it.dcode, it.freze, " +
" it.ishow, it.sltax, it.dcont, it.mcode, " +
" it.nwcod " +
"order by itnam ");
我尝试过使用结果集元数据,但这也不起作用。
【问题讨论】:
你能通过 sql plus/sql developer 运行它,看看是否能得到你想要的输出吗? 我通过保持工具运行它,它确实给了我想要的结果,所以我确定数据不存在@pahariayogi 请注意,如果 fdate、tdate、COCOD 或 DCODE 来自用户输入,则查询容易受到 SQL 注入攻击。考虑使用PreparedStatement
。
【参考方案1】:
你应该小心这条线
+ fdate + " and " + tdate
因为你应该这样使用:
" .. to_date('"+fdate+"','***your_date_format') and to_date('"+fdate+"','***your_date_format')"
【讨论】:
我一直在通过保持工具运行这个查询并且数据返回正常..我也试过这个但是这会引发其他异常 你试过我的解决方案了吗? 我做了,仍然返回零,这个错误真的让我的应用程序陷入了死胡同,希望有任何其他解决方案 您的具体查询是什么?你能写在编辑器上运行它吗?没有参数?以上是关于使用简单算术运算和别名时,即使表中的数据不为零,JDBC 查询也会返回零的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使我们将指针分配给NULL,指针的指向对象的大小也不为零?
CWE-369:Divide By Zero除数有可能为零缺陷是如何产生的?