【问题标题】:Oracle sql query works in sql developer but not in javaOracle sql 查询在 sql developer 中有效,但在 java 中无效
【发布时间】:2019-12-06 21:31:01
【问题描述】:

我在数据表中有过滤器,当用户输入某个值时,它应该返回与该过滤器匹配的结果列表。我希望它不区分大小写。 我通过 Java 字符串连接为准备好的语句创建查询字符串,如下所示:

public static List<Logger> getAll(int from, int to, Map<String, Object> filters, String sortField,
        SortOrder sortOrder) {
    Connection con = null;
    PreparedStatement ps = null;
    List<Logger> lista = new ArrayList<>();
    String upit = "Select * from (select m.*,rownum r from (";
    String upitZaFilterISort = "select m.* from eps_stage.MDM_OSB_LOG m";

    try {
        con = DataConnect.getConnection();
        int upper = from + to;

        if (filters.size() > 0) {
            upitZaFilterISort = upitZaFilterISort.concat(" where 1=1");
            Set<String> keys = filters.keySet();

            // To get all key: value
            for (String key : keys) {
                if (key.equalsIgnoreCase("status") || key.equalsIgnoreCase("mbr")
                        || key.equalsIgnoreCase("pib") || key.equalsIgnoreCase("jmbg")
                        || key.equalsIgnoreCase("poruka_tip") || key.equalsIgnoreCase("aplikacija")
                        || key.equalsIgnoreCase("operacija")) {
                    upitZaFilterISort = upitZaFilterISort.concat(
                            " AND UPPER(" + key.toString() + ") LIKE '" + filters.get(key).toString().toUpperCase() + "%'");
                } 
            }
            }
        }

        String sort = "";

        ps = con.prepareStatement(upit + upitZaFilterISort + ") m ) where r>=? and r<=?");

        ps.setInt(1, from);
        ps.setInt(2, upper);

        System.out.println(upit+ upitZaFilterISort + sort+") m " + ") where r>=? and r<=?");

        ResultSet resultSet = ps.executeQuery();

在这一行有问题:

upitZaFilterISort = upitZaFilterISort.concat(
        " AND UPPER(" + key.toString() + ") LIKE '" + filters.get(key).toString().toUpperCase() + "%'");

当我使用区分大小写的比较时,它会起作用:

upitZaFilterISort = upitZaFilterISort.concat(
        " AND " + key.toString() + " LIKE '" + filters.get(key).toString() + "%'");

串联查询后:

Select * from (select m.*,rownum r from (select m.* from eps_stage.MDM_OSB_LOG m where 1=1 AND UPPER(poruka_tip) LIKE 'V%') m ) where r>=1 and r<=20

当我在 Oracle SQL Developer 中运行它时,它返回了预期的结果,但在我的应用程序中它返回了一个空结果集。

Java 是否在我不期望的地方加上引号?如果需要,我会提供更多信息。

【问题讨论】:

  • 请显示您尝试过的代码以及您收到的任何错误消息。
  • UPPER() 的参数应该是列名还是文字?如果是后者,则需要引用。此外,如果是后者,那么我对您声称您打算将其用于准备好的语句感到困惑,因为在这种情况下,您绕过了通过参数而不是语句设置值的自然的最佳实践方法通过字符串连接。除了许多其他事情之外,这将绕过担心引用的需要。
  • 无论如何,当它在您的应用程序中不起作用时,实际上会发生什么?结果不正确? (那么你期待什么,为什么?)抛出异常? (那么异常消息是什么?)总的来说,请提供一个minimal reproducible example 来模拟问题。
  • @JohnBollinger 这是一个列名。区分大小写的比较完美地工作并返回所需的结果,不区分大小写不返回任何内容.. 帖子编辑并添加了更多代码和解释
  • 我不知道为什么它在 Sql Developer 中有效,所以我还要求您添加一个可重现的示例。同时,我确实看到了一些我宁愿避免的做法:1. SQL 查询中的连接(搜索“Sql Injection”)2. UPPER 出现在条件的左侧,但是不是正确的:我会把它放在两边,为了统一 3. 在 Java 类中构建查询是我宁愿避免的事情,因为你混合了两种截然不同的语言,降低了整体可读性。如果可能,将您的查询外部化。

标签: java sql oracle oracle-sqldeveloper


【解决方案1】:

回复:https://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_globalization.htm#CCHIJBCG,“更改所有会话的 NLS 参数值”部分

请检查 NLC_COMP 的会话设置,它可能设置为 LINGUISTIC。下面的链接可以让您在 SQL Developer 中到达那里。如果设置为 LINGUISTIC,则您的 SQL Developer 会话将执行不区分大小写的搜索,这可能会解释会话之间的差异。

另外,同意 Filippo 推荐的做法。

【讨论】:

    【解决方案2】:

    试试这个:

    1. 检查用户是否具有进行语句所需的所有权限

    2. 端口可能只有一个打开的连接。因此,您只能使用 java 或 oracle sql developer。尝试断开与 sql developer 的连接并运行您的 java 程序。如果它不起作用,请告诉我。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多