我一直在解決這個特定問題幾天,並且找不到任何解決方案。因此,我在這裏。使用多結果子查詢進行查詢不能與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)
這似乎是問題:'從table1中選擇數字,其中name ='nam1'' ...你確定你的底層數據在兩個地方是相同的嗎? –
@harlequin:請您說出查詢背後的確切要求是什麼?你試圖通過查詢來實現什麼?可能您的查詢本身可以簡化並與Java輕鬆集成。 –
你能否解釋一下你的底層數據是什麼意思,以及爲什麼這個'select'會成爲問題? – harlequin