Tôi đã làm việc về vấn đề cụ thể này ngay bây giờ trong một vài ngày và không thể tìm thấy bất kỳ giải pháp nào. Vì vậy, tôi đây.truy vấn với truy vấn con nhiều kết quả không hoạt động với jdbc
Tình hình:
- Table1 liệt kê tất cả JBoss trên hệ thống
- Table2 phác họa 1: n mối quan hệ của JBoss và JBoss từ bất kỳ JBoss nhất định có thể có một hoặc nhiều JBoss nó 'nói' đến.
- Tôi có một servlet Java với JDBC để kết nối với cơ sở dữ liệu và vấn đề thắc mắc và các trang .jsp để hiển thị các kết quả
EDIT:
gì tôi dự định sẽ làm gì với truy vấn: Servlet của tôi đang cố gắng hiển thị tất cả thông tin được kết nối với một jboss đã cho. Người dùng chọn một jboss từ danh sách các tên jboss từ một trang jsp. Sau đó truy vấn được thực hiện và lỗi xảy ra.
EDIT2:
Thay đổi truy vấn để subselect bên trong để một where in
kết quả trong những lỗi tương tự khi kiểm tra applet
EDIT4:
Cố gắng tạo ra một cái nhìn với truy vấn như kịch bản, sau đó cố gắng để có được tất cả các mục từ chế độ xem được tạo với select * from vtest
mà không thành công.
Vấn đề:
Khi tôi cố gắng chạy select
sau với servlet, nó kết quả trong ORA-01.427. Nếu tôi chạy câu lệnh này trong Toad for Oracle
tôi nhận được kết quả mong muốn.
select * from table1 where number in (
select jboss2 from table2 where jboss1 = (
select number from table1 where name = 'nam1'))
Các Câu hỏi: Có một cái gì đó tôi là thiếu với các truy vấn? Có thể rằng jdbc
không thể xử lý các truy vấn con với nhiều hàng là kết quả, ngay cả khi chính truy vấn đó là chính xác?
Bảng 1:
+--------+------+-----------+
| Number | Name | values... |
+--------+------+-----------+
| 000001 | nam1 | vals1 |
| 000002 | nam2 | vals2 |
| 000003 | nam3 | vals3 |
+--------+------+-----------+
Bảng 2:
+--------+--------+
| JBoss1 | JBoss2 |
+--------+--------+
| 000001 | 000002 |
| 000001 | 000003 |
| 000002 | 000003 |
+--------+--------+
quả trong kết quả Toad/mong muốn:
+--------+------+-----------+
| Number | Name | values... |
+--------+------+-----------+
| 000002 | nam2 | vals2 |
| 000003 | nam3 | vals3 |
+--------+------+-----------+
EDIT3:
Các lớp Java có liên quan. Đã loại bỏ các truy vấn không liên quan.
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;
Thông báo lỗi
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)
Điều này có vẻ là vấn đề: 'chọn số từ bảng1 nơi name = 'nam1'' ... bạn có chắc dữ liệu cơ bản của bạn giống nhau ở cả hai nơi không? –
@harlequin: Bạn vui lòng cho biết yêu cầu chính xác đằng sau truy vấn của bạn là gì? Những gì bạn đang cố gắng đạt được thông qua truy vấn? Có thể truy vấn của bạn có thể được đơn giản hóa và tích hợp dễ dàng với java. –
Bạn có thể giải thích ý nghĩa của bạn với dữ liệu cơ bản và tại sao 'select' này sẽ là vấn đề? – harlequin