java - 为什么在传递 String 参数时得到不正确的结果集?

标签 java sql oracle

我已经为这个问题争论了一段时间,但我还没有找到解决方案。解释起来非常简单。

我有一个 Java 方法,它传递一个字符串作为参数,这个字符串是一个 SQL 查询。

当我执行这个传递字符串参数的查询时,我得到了 1 行的结果。

ResultSet rs1 = stmt.executeQuery(sqlq);

当我在代码中键入完全相同的查询时,我得到了 5 行的正确返回值。

ResultSet rs1 = stmt.executeQuery("SELECT a.GSM_NO AS A_GSM_NO,a.START_DATE AS A_START_DATE,a.INVOICE_DETAIL_CODE AS A_INVOICE_DETAIL_CODE,a.VALUE_VAT_EXCLUDED AS A_VALUE_VAT_EXCLUDED, b.GSM_NO AS B_GSM_NO,b.START_DATE AS B_START_DATE,b.INVOICE_DETAIL_CODE AS B_INVOICE_DETAIL_CODE,b.VALUE_VAT_EXCLUDED AS B_VALUE_VAT_EXCLUDED FROM INVOICEPRINT_DETAIL_LEGACY a, INVOICEPRINT_DETAIL_GENESIS b WHERE a.GSM_NO=b.GSM_NO AND a.START_DATE=b.START_DATE AND a.INVOICE_DETAIL_CODE=b.INVOICE_DETAIL_CODE AND a.INVOICE_DETAIL_CODE IN ( 'DT-ASUTOP' , 'DT-AVMAH4' , 'DT-BAGTOP' , 'DT-BNDTOP' , 'DT-DIGTOP' , 'DT-FATTUT ' , 'DT-GORGPRF' )");

是的,我打印了字符串参数,虽然输出不同,但内容完全一样。

我做了一些测试,当字符串的最后一部分只有:

IN ( 'DT-ASUTOP' , 'DT-AVMAH4' , 'DT-BAGTOP' , 'DT-BNDTOP' ,

'DT-DIGTOP')");

它可以正确地传递参数或手动输入查询。在本例中,它返回 4 行,因为在 INVOICE_DETAIL_CODE 字段中找到了 4 行带有 DT-DIGTOP 的行。完美且正确。

当我在 INVOICE_DETAIL_CODE 列中添加我要查找的另一个值 DT-GORGPRF 时,它存在但仅在一行中,查询结果为:

IN ( 'DT-ASUTOP' , 'DT-AVMAH4' , 'DT-BAGTOP' , 'DT-BNDTOP' , 'DT-DIGTOP' , 'DT-FATTUT ' , 'DT-GORGPRF' )");

当我传递字符串参数时只返回 1 行,带有 DT-GORGPRF 的行并忽略最后 4 行。当我手动向 executeQuery 方法键入查询时,我得到了正确的结果。

这毫无意义。我可以获得有关如何解决该问题的意见吗?

最佳答案

在解决这个问题几天后,我们发现我们通过 StringBuilder 构建的动态查询包含一些无效字符,导致了这个问题。为了解决这个问题,我们将查询转换为 Ascii 字符,并删除了 ascii 中存在但不应该存在的所有 13 (/n)。我们注意到,在某些情况下,当使用逗号 (,) 时,StringBuilder 会添加/n 导致这种尴尬行为的字符..!!已解决。

关于java - 为什么在传递 String 参数时得到不正确的结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565360/

相关文章:

mysql - MySQL 的另一个问题 - 简单的注册表显示空白屏幕,没有错误

sql - 同一列的多个 WHERE 子句

sql - 如何将毫秒转换为时间(hh :mm:ss) in Oracle

mysql - 根据经纬度查找用户

java - 仅打印多页 pdf 中的一页

sql - 使用 CROSS JOIN SEQUENCE 生成大型重复表

java - 在信封上绘制文字

mysql - oracle sql开发人员不存储unicode

java - Google App Engine 上的 JQuantlib

java - Maven HeuristicMixedException 与 Wildfly webapp