2016-01-21 192 views
0

我在JAVA中有SQL查询问题。Java代码中的SQL查询无法正常工作

JAVA代码:

public boolean zeKontrolaExistujiciZalohyTest(String datum) { 
     try { 
      connected(); 
      boolean existujeZaloha = false; 
      int pocet; 
      ResultSet rs = statement.executeQuery("SELECT count(id) FROM "+table_ze+"\n" + 
          "WHERE TO_CHAR(TO_DATE(datum, 'dd.mm.yyyy'), 'mm.yyyy') = TO_CHAR(TO_DATE('"+datum+"', 'dd.mm.yyyy'), 'mm.yyyy')");    

      rs.next(); 
      pocet = rs.getInt(1); 
      rs.close(); 
      closed(); 
      if (pocet >= 0) { 
       existujeZaloha = true; 
      } else { 
       existujeZaloha = false; 
      } 
      return existujeZaloha; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Dialogs.create() 
       .title("Exception Dialog") 
       .showException(e); 
      return true; 
     } 
    } 

SQL查询在SQL开发者:

SELECT count(id) FROM pbtest.u_zalohy_energie 
WHERE TO_CHAR(TO_DATE(datum, 'dd.mm.yyyy'), 'mm.yyyy') = TO_CHAR(TO_DATE('15.09.2014', 'dd.mm.yyyy'), 'mm.yyyy'); 

当运行JAVA代码,因此导致一个变量为 “pocet = 0”。但是,当我在任何SQL Developer中运行SQL查询时,结果列COUNT(id)为“1”。

当我更改SQL查询时,让我运行JAVA代码回退一个变量“pocet = 1”。

更改SQL代码:

ResultSet rs = statement.executeQuery("SELECT count(id) FROM "+table_ze+"\n" + 
      "WHERE datum = TO_DATE('"+datum+"', 'dd.mm.yyyy')"); 

有谁知道问题出在哪里?

有关信息:我使用Oracle数据库。

谢谢。

+2

如果您有一个日期列,比较日期,而不是字符串。 – jarlh

+0

'datum'是日期还是字符串? –

+0

你可以用Java打印查询并查看它是否打印所需的SQL语句? – Nitish

回答

1

datum是字符串

SELECT count(id) 
FROM pbtest.u_zalohy_energie 
WHERE TO_DATE(datum, 'dd.mm.yyyy') = TO_DATE('15.09.2014', 'dd.mm.yyyy'); 

datum是日期

SELECT count(id) 
FROM pbtest.u_zalohy_energie 
WHERE TRUNC(datum) = TO_DATE('15.09.2014', 'dd.mm.yyyy'); 

如果数据是日期,它可能包含时间成分太多。所以删除它。使用TRUNC()

TRUNC(datum) = TO_DATE('15.09.2014', 'dd.mm.yyyy'); 

Java代码:

ResultSet rs = statement.executeQuery("SELECT count(id) FROM "+table_ze+"\n" + 
      "WHERE TRUNC(datum) = TO_DATE('"+datum+"', 'dd.mm.yyyy')"); 

作为一个侧面说明,使用PreparedStatement and bind variables避免SQL*Injection

0

你的语句有语法错误

ResultSet rs = statement.executeQuery("SELECT count(id) FROM "+table_ze+"\n" + 
"WHERE TO_CHAR(TO_DATE(datum, 'dd.mm.yyyy'), 'mm.yyyy') = TO_CHAR(TO_DATE('"+datum+"', 'dd.mm.yyyy'), 'mm.yyyy')");    

恩ecuted查询将是

SELECT count(id) FROM pbtest.u_zalohy_energie\nWHERE TO_CHAR(TO_DATE(datum, 'dd.mm.yyyy'), 'mm.yyyy') = TO_CHAR(TO_DATE('15.09.2014'', 'dd.mm.yyyy'), 'mm.yyyy')") 

您应该删除“\ n”,因为这不会导致换行符。

尝试,因为

ResultSet rs = statement.executeQuery("SELECT count(id) FROM " + table_ze 
+ " WHERE TO_CHAR(TO_DATE(datum, 'dd.mm.yyyy'), 'mm.yyyy') = TO_CHAR(TO_DATE('"+datum+"', 'dd.mm.yyyy'), 'mm.yyyy')");    

同时考虑从Maheswaran Ravisankar对评论:“...... PreparedStatement和绑定变量,以避免SQL注入*”

0

谢谢你的建议,我解决问题如下:

public boolean zeKontrolaExistujiciZalohy(String datum, String typZalohy, String zalohaNaMesic) { 
     connected(); 
     boolean existujeZaloha = false; 
     int pocet = 0; 
     ResultSet rs; 
     PreparedStatement pstmt = null; 
     try{ 
      statement = connection.createStatement(); 
      String SQL = "SELECT count(id) AS pocet FROM " + table_ze + " WHERE (EXTRACT(MONTH FROM datum)) = (EXTRACT(MONTH FROM to_date(?, 'dd.mm.yyyy'))) " 
        + "AND (EXTRACT(YEAR FROM datum)) = (EXTRACT(YEAR FROM to_date(?, 'dd.mm.yyyy')))" 
        + "AND typ_zalohy = ? " 
        + "AND zaloha_na_mesic = ? "; 
      pstmt = connection.prepareStatement(SQL); 
      pstmt.setString(1, datum); 
      pstmt.setString(2, datum); 
      pstmt.setString(3, typZalohy); 
      pstmt.setString(4, zalohaNaMesic); 
      rs = pstmt.executeQuery(); 
      while(rs.next()){ 
       pocet = rs.getInt("pocet"); 
      } 
      rs.close(); 
      if (pocet > 0) { 
       existujeZaloha = true; 
      } else { 
       existujeZaloha = false; 
      } 
      return existujeZaloha;    
     } 
     catch(SQLException ex){ 
      Dialogs.create() 
       .title("Exception Dialog") 
       .showException(ex); 
      return true; 
     } 
    }