SQL-запрос, выполняемый ResultSet в Java, возвращает значения, отличные от тех, которые выполняются в базе данных. - PullRequest
0 голосов
/ 21 февраля 2019

Это запрос, который я выполняю в базе данных:

    SELECT CD_MAT, SUM(QT_MAT_UTIL) AS QT_MAT_UTIL FROM T476 
    WHERE (CD_UN_EXEC_SERV= 'X10' OR CD_UN_EXEC_SERV IN (SELECT 
    A.CD_UN_ORGANIZ FROM T016 A WHERE A.CD_UN_ORGANIZ_HIE ='X10'))
    AND MM_RA_EXEC = 6 AND AA_RA_EXEC = 2016
    AND CD_MAT = 15210001010
    GROUP BY CD_MAT
    ORDER BY 1 ASC, 2 DESC;

И вот результат, который я получаю, когда запускаю его в IBM Acess:

IBM Acess result

И этот результат правильный.


Но когда я запускаю тот же запрос в Java с помощью ResultSet, я получаю следующий результат:

result java's ResultSet is giving me


Понятия не имею, почему это происходит.Кто-нибудь знает, что я делаю неправильно?


Это мой Java-код (я абсолютно уверен, что переменные верны):

  public ArrayList<Map<String, Object>> myProblematicMethod(String cod, Integer first, Integer last) throws Excecao {

ArrayList<Map<String, Object>> lista;
lista = new ArrayList<>();

try {

  StringBuffer sql = new StringBuffer();
  sql.append("SELECT CD_MAT , SUM(QT_MAT_UTIL) AS QT_MAT_UTIL FROM T476 ");
  sql.append(" WHERE (CD_UN_EXEC_SERV = ? OR CD_UN_EXEC_SERV ");
  sql.append(" IN (SELECT A.CD_UN_ORGANIZ FROM T016 A ");
  sql.append(" WHERE A.CD_UN_ORGANIZ_HIE = ?)) ");
  sql.append(" AND MM_RA_EXEC= ? AND AA_RA_EXEC= ? ");
  sql.append(" AND CD_MAT = 15210001010 ");
  sql.append(" GROUP BY CD_MAT ORDER BY 1 ASC, 2 DESC ");

  PreparedStatement ps = this.banco.criarPS(sql.toString());

  ps.setString(1, cod);
  ps.setString(2, cod);
  ps.setInt(3, first);
  ps.setInt(4, last);

  ResultSet resultSet = this.banco.consultarSQL(ps);

  while (resultSet.next()) {
    LinkedHashMap<String, Object> materiais = new LinkedHashMap<>();

    // campos presentes em todas as consultas realizadas
    materiais.put("cod", resultSet.getString("CD_MAT"));
    materiais.put("qnt", resultSet.getBigDecimal("QT_MAT_UTIL"));

    lista.add(materiais);
  }

      } catch (SQLException e) {
        e.printStackTrace();
        throw new Excecao(e.getErrorCode(), e.getSQLState() + " - " + e.getMessage());
      }

  return lista;
  }

Java невернуть мне любое исключение, и нет другого столбца с тем значением, которое он возвращает.Я использую Java 1.8.0_65.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я решил это, не используя preparestatement для установки переменных в запросе, теперь я помещаю их в запрос, используя простое добавление StringBuilder, и оно разрешается.

(я использую PrepareStatement в других классах, и этоотлично работает)

0 голосов
/ 21 февраля 2019

Вы не выполняете в Java тот же запрос, который вы хотите.В PreparedStatement в Java вам не хватает части 'AND CD_MAT = 15210001010'.

...