2017-07-03 2 views
7

Ich habe an diesem speziellen Problem jetzt für ein paar Tage gearbeitet und kann keine Lösungen finden. Also, hier bin ich.Abfrage mit Multiple-Ergebnis-Unterabfrage funktioniert nicht mit JDBC

Die Situation:

  • Tabelle 1 listet alle JBoss auf dem System
  • Table2 Abbildungen eine 1: n-Beziehung von JBoss und JBoss seit einem bestimmten JBoss eine oder mehrere JBoss es spricht "haben kann zu.
  • ich ein Java-Servlet mit JDBC muß die Datenbank und die Ausgabe von Abfragen und .jsp Seiten verbinden die Ergebnisse

EDIT anzuzeigen:

Was ich mit der Frage zu tun beabsichtigen zu tun: Mein Servlet versucht, alle Informationen anzuzeigen, die mit einem bestimmten jboss verbunden sind. Der Benutzer wählt einen jboss aus der Liste der jboss-Namen von einer jsp-Seite aus. Dann wird die Abfrage ausgeführt und der Fehler tritt auf.

EDIT2:

Ändern der Abfrage inneren subselect zu einem where in Ergebnisse in dem gleichen Fehler, wenn das Applet Testen

Edit4:

Versuchte eine Ansicht mit der Abfrage der Erstellung als Skript und versucht dann, alle Einträge aus der erstellten Ansicht mit select * from vtest ohne Erfolg zu erhalten.

Das Problem:

Wenn ich versuche, die folgenden select mit dem Servlet zu laufen, kommt es zu ORA-01427. Wenn ich diese Anweisung in Toad for Oracle ausführen, bekomme ich das gewünschte Ergebnis.

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

Die Frage: Gibt es etwas, das ich mit der Abfrage bin fehlt? Ist es möglich, dass jdbc Unterabfragen mit mehreren Zeilen als Ergebnis nicht verarbeiten kann, auch wenn die Abfrage selbst korrekt ist?

Tabelle 1:

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

Tabelle 2:

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

Ergebnis in Kröten/Wunschergebnis:

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

EDIT3:

Relevante Java-Klassen. Nicht relevante Abfragen wurden weggelassen.

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; 

Fehlermeldung

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

Dies scheint das Problem zu sein: 'wählen Sie Nummer aus Tabelle1, wo Name = 'nam1'' ... sind Sie sicher, dass Ihre zugrunde liegenden Daten an beiden Orten identisch sind? –

+0

@harlequin: Würden Sie bitte sagen, was ist die genaue Anforderung hinter Ihrer Abfrage? Was versuchen Sie über die Abfrage zu erreichen? Möglicherweise kann Ihre Abfrage selbst mit Java vereinfacht und integriert werden. –

+0

Könnten Sie bitte erklären, was Sie mit den zugrunde liegenden Daten meinen und warum dieses 'select' das Problem wäre? – harlequin

Antwort

0

Ich fand die Lösung. Eine andere Abfrage hat auch mehr als ein Ergebnis zurückgegeben. Diese Abfrage wurde nicht entworfen und ist daher fehlgeschlagen. Es war ein Versehen meinerseits.

0

scheinen Sie in für die innere subselect eine wher e brauchen auch

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

Ich habe versucht, die innere Auswahl so zu ändern, ohne Erfolg. Es ergibt sich immer noch der gleiche Fehler – harlequin

+0

überprüfen besser .. der Fehler ORA-01427. ist für die Rückkehr mehr als ein Zeilen und th in clasue muss dieses Problem lösen – scaisEdge

0

nicht sicher, warum die Abfrage mit, wo-in nicht für Sie arbeiten , aber hier ist eine Abfrage, bei der die zweite Unterabfrage durch einen Join ersetzt wird:

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

Danke für die Abfrage-Version, aber leider bekomme ich immer noch den gleichen Fehler. – harlequin

Verwandte Themen