【问题标题】:Why do I have an incorrect result set when I pass a String parameter?为什么我传递字符串参数时结果集不正确?
【发布时间】:2014-12-22 17:30:24
【问题描述】:

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

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

当我通过 String 参数执行此查询时,我得到 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 作为 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 和 a.INVOICE_DETAIL_CODE IN('DT-ASUTOP','DT-AVMAH4','DT-BAGTOP','DT-BNDTOP', 'DT-DIGTOP' , 'DT-FATTUT ' , 'DT-GORGPRF' )");

是的,我打印了String Parameter,内容完全一样,虽然输出不同。

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

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

'DT-DIGTOP')");

它可以正确传递参数或手动输入查询。在这种情况下,它返回 4 行,因为在 INVOICE_DETAIL_CODE 字段中找到了 4 行带有 DT-DIGTOP 的行。完美无缺。

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

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

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

这毫无意义。我可以就如何解决这个问题提供意见吗?

【问题讨论】:

  • 我的猜测是当你在java中运行它时你只读取第一行。
  • 不,我的代码会打印 ResultSet 中的所有值。当我通过参数传递查询时,它会打印 1 行。当我传递查询时,直接键入它会打印 5 行,因为它应该...
  • fwiw - 您可能在 DT-FATTUT 之后有一个杂散空间。
  • 我删除了构造查询字符串的方法上的所有空格,结果完全一样。 =/
  • START_DATE 是关键字...

标签: java sql oracle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 java 代码中删除 (') 并测试。

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

    【讨论】:

    • 不起作用,如果我删除 (') SQL 假设 - 是减法信号。我现在正在尝试 (\')
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多