2017-07-03 22 views
7

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) 
+0

Đ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? –

+0

@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. –

+0

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

Trả lời

0

Tôi đã tìm ra giải pháp. Một truy vấn khác cũng trả lại nhiều kết quả. Truy vấn này không được thiết kế để làm như vậy, do đó không thành công. Đó là một sự giám sát về phía tôi.

0

dường như bạn cần một e wher trong cho subselect bên trong quá

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

Tôi đã thử thay đổi lựa chọn bên trong như thế để không có kết quả. Nó vẫn kết quả trong cùng một lỗi – harlequin

+0

kiểm tra tốt hơn .. lỗi ORA-01427. là để trở về nhiều hơn sau đó một hàng và thứ trong clasue phải giải quyết vấn đề này – scaisEdge

0

Không chắc lý do tại sao các truy vấn với nơi-in không làm việc cho bạn , nhưng đây là truy vấn trong đó truy vấn phụ thứ hai được thay thế bằng cách tham gia:

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

Cảm ơn phiên bản truy vấn nhưng tiếc là tôi vẫn nhận được cùng một lỗi. – harlequin

Các vấn đề liên quan