2017-07-03 91 views
7

我一直在解決這個特定問題幾天,並且找不到任何解決方案。因此,我在這裏。使用多結果子查詢進行查詢不能與jdbc一起工作

情況:

  • 表1列出了系統
  • 表2上所有的JBoss圖片1:因爲任何給定的JBoss的JBoss和JBoss的n個關係可以有一個或一個以上的JBoss它「講」至。
  • 我有JDBC Java servlet來連接到數據庫,併發出查詢和.jsp頁面顯示結果

編輯:

什麼我打算與查詢做到:我的servlet試圖顯示連接到給定jboss的所有信息。用戶從jsp頁面的jboss名稱列表中選擇一個jboss。然後執行查詢併發生錯誤。

EDIT2:

改變查詢內子選擇一個where in產生相同的誤差測試小程序時

EDIT4:

試圖與查詢作爲創建視圖腳本,然後嘗試從select * from vtest獲得創建視圖中的所有條目,但沒有成功。

問題:

當我嘗試運行以下select和servlet,它導致ORA-01427。如果我在Toad for Oracle中運行此語句,我會得到期望的結果。

select * from table1 where number in (
select jboss2 from table2 where jboss1 = (
select number from table1 where name = 'nam1')) 

問題: 有什麼我與查詢失蹤?是否有可能jdbc無法處理具有多行的子查詢作爲結果,即使查詢本身是正確的?

表1:

+--------+------+-----------+ 
| Number | Name | values... | 
+--------+------+-----------+ 
| 000001 | nam1 | vals1  | 
| 000002 | nam2 | vals2  | 
| 000003 | nam3 | vals3  | 
+--------+------+-----------+ 

表2:

+--------+--------+ 
| JBoss1 | JBoss2 | 
+--------+--------+ 
| 000001 | 000002 | 
| 000001 | 000003 | 
| 000002 | 000003 | 
+--------+--------+ 

結果在蟾蜍/期望的結果:

+--------+------+-----------+ 
| Number | Name | values... | 
+--------+------+-----------+ 
| 000002 | nam2 | vals2  | 
| 000003 | nam3 | vals3  | 
+--------+------+-----------+ 

EDIT3:

相關的Java類。省略不相關的查詢。

class QuickInfoAction implements Action{ 

    @Override 
    public String execute(HttpServletRequest request, HttpServletResponse response) throws ActionException { 
     Connection conn = null; 
     PreparedStatement prep = null; 
     ResultSet rs = null; 
     Map<String,String> queries = Queries.getInfoQueries(request); 

     try { 
      conn = DatabaseConnector.getConnection(); 
      Map<String, Result> res = new HashMap<String, Result>(); 
      for (Map.Entry<String, String> entry: queries.entrySet()) { 
       prep = conn.prepareStatement(entry.getValue()); 
       rs = prep.executeQuery(); 

       while(rs.next()) { 
        res.put(entry.getKey(), ResultSupport.toResult(rs)); 
       }  
      } 

      request.setAttribute("results", res); 

     } catch (Exception e) { 
      throw new ActionException(e.getStackTrace().toString()); 
     } finally { 
      try { 
       conn.close(); 
       prep.close(); 
       rs.close(); 
      } catch (Exception e) { 
       throw new ActionException(e.getStackTrace().toString()); 
      } 
     } 

     return "results"; 
    } 

} 


public static Map<String, String> getInfoQueries(HttpServletRequest request) { 
    String jboss_res = "select jboss.name, jboss.port, jboss.apache_nummer, jboss.bere_mandant_id, " 
      + "maschine.name as maschine, maschine.ip_adresse " 
      + "from jboss " 
      + "inner join maschine on jboss.maschine_nummer = maschine.nummer " 
      + "where jboss.name = '" + request.getParameter("jboss") + "'"; 

    String jboss_db = "select datenbank.nummer, datenbank.name, db_schema.name as schema " 
      + "from datenbank " 
      + "inner join db_schema on datenbank.db_schema_nummer = db_schema.nummer " 
      + "where datenbank.nummer = (" 
       + "select datenbank_nummer " 
       + "from jboss_datenbank " 
       + "where jboss_nummer = (" 
        + "select nummer " 
        + "from jboss " 
        + "where name = '" + request.getParameter("jboss") + "'))"; 

    String jboss_tux = "select tuxedo.*, datenbank.name as datenbank, db_schema.name as schema " 
      + "from tuxedo, datenbank,db_schema " 
      + "where tuxedo.nummer = (" 
       + "select tuxedo_nummer " 
       + "from jboss " 
       + "where name = '" + request.getParameter("jboss") + "') " 
      + "and datenbank.nummer = (" 
       + "select datenbank_nummer " 
       + "from tuxedo_datenbank " 
       + "where tuxedo_nummer = tuxedo.nummer) " 
      + "and db_schema.nummer = (" 
       + "select db_schema_nummer " 
       + "from datenbank " 
       + "where nummer = (" 
        + "select datenbank_nummer " 
        + "from tuxedo_datenbank " 
        + "where tuxedo_nummer = tuxedo.nummer))"; 
    String jboss_corr = "select * from jboss where nummer in (" 
       + "select jboss_nummer_2 from jboss_corr where jboss_nummer_1 in (" 
       + "select nummer from jboss where name = '" + request.getParameter("jboss") + "'))"; 

    Map<String, String> queries = new HashMap<String,String>(); 
    queries.put("jboss", jboss_res); 
    queries.put("datenbank", jboss_db); 
    queries.put("tuxedo", jboss_tux); 
    queries.put("corr", jboss_corr); 

return queries; 

錯誤消息

03.07.2017 11:49:29,863 +0200 WARN [at.itsv.ta2mig.jdbc.TA2MigOracleJDBCConnection] (hs0903 http-/0.0.0.0:8080-2) ORA-01427: Unterabfrage für eine Zeile liefert mehr als eine Zeile 

03.07.2017 11:49:29,864 +0200 INFO [stdout] (hs0903 http-/0.0.0.0:8080-2) error executing action 

03.07.2017 11:49:29,864 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2) dbgr.exception.ActionException: [Ljava.lang.StackTraceElement;@46708550 

03.07.2017 11:49:29,864 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at dbgr.action.QuickInfoAction.execute(QuickInfoAction.java:43) 

03.07.2017 11:49:29,864 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at dbgr.servlet.ControllerServlet.doGet(ControllerServlet.java:28) 

03.07.2017 11:49:29,865 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at dbgr.servlet.ControllerServlet.doPost(ControllerServlet.java:39) 

03.07.2017 11:49:29,865 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 

03.07.2017 11:49:29,865 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 

03.07.2017 11:49:29,865 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) 

03.07.2017 11:49:29,865 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 

03.07.2017 11:49:29,865 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) 

03.07.2017 11:49:29,866 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:854) 

03.07.2017 11:49:29,867 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) 

03.07.2017 11:49:29,867 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) 

03.07.2017 11:49:29,867 +0200 ERROR [stderr] (hs0903 http-/0.0.0.0:8080-2)  at java.lang.Thread.run(Thread.java:744) 
+0

這似乎是問題:'從table1中選擇數字,其中name ='nam1'' ...你確定你的底層數據在兩個地方是相同的嗎? –

+0

@harlequin:請您說出查詢背後的確切要求是什麼?你試圖通過查詢來實現什麼?可能您的查詢本身可以簡化並與Java輕鬆集成。 –

+0

你能否解釋一下你的底層數據是什麼意思,以及爲什麼這個'select'會成爲問題? – harlequin

回答

0

我找到了解決方案。另一個查詢也返回了多個結果。這個查詢不是爲了這麼做而設計的,因此失敗了。這是我的一個疏忽。

0

似乎需要在內部再選擇一個wherê太

select * from table1 where number in (
    select jboss2 from table2 where jboss1 in (
    select number from table1 where name = 'nam1')) 
+0

我試過改變內部選擇那樣無濟於事。它仍然導致相同的錯誤 – harlequin

+0

檢查更好..錯誤ORA-01427。是爲了返回更多的行和ths在clasue必須解決這個問題 – scaisEdge

0

不知道爲什麼與在-在查詢不爲你工作,但是這裏是第二個子查詢被連接替換的查詢:

select * from table1 where number in (
    select jboss2 from table2 
    join table1 on table2.jboss1 = table1.number 
    and table1.name = 'nam1' 
) 
+0

感謝您的查詢版本,但不幸的是我仍然得到相同的錯誤。 – harlequin