2016-11-01 3 views
0

ich gespeicherte Prozedur in MySQL geschrieben, die wie folgt aussieht (es funktioniert):Wie das Ergebnis zu beheben bestand aus mehr als eine Zeile Fehler

DELIMITER // 

CREATE PROCEDURE getBrandRows(
    IN pBrand VARCHAR(30), 
    OUT pName VARCHAR(150), 
    OUT pType VARCHAR(200), 
    OUT pRetailPrice FLOAT) 
BEGIN 
    SELECT p_name, p_type, p_retailprice INTO pName, pType, pRetailPrice 
    FROM part 
    WHERE p_brand LIKE pBrand; 
END// 

DELIMITER ; 

Ich versuche, sie mehrere Ergebnisse zurückgeben und anzuzeigen. Ich habe viele Möglichkeiten ausprobiert, die hier auf Stack und im Internet beschrieben sind, aber das hilft mir nicht. Ich habe meinen gesamten Code bearbeitet und einen einfachen erstellt, damit Sie ihn einfügen und kompilieren können. Es sollte aber mit Fehler funktionieren. Hier ist der Code:

package javamysqlstoredprocedures; 

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 

public class JavaMySqlStoredProcedures { 

    private final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver"; 
    private final String DB_URL = "jdbc:mysql://anton869.linuxpl.eu:3306/" 
      + "anton869_cars?noAccessToProcedureBodies=true"; 
    private final String DB_USER = "xxx"; 
    private final String DB_PASSWORD = "xxx"; 

    class CallStoredProcedureAndSaveXmlFile extends SwingWorker<Void, Void> { 

     @Override 
     public Void doInBackground() { 
      displaySql(); 
      return null; 
     } 

     @Override 
     public void done() { 
     } 

     private void displaySql() { 
     try { 
      System.out.println("Connecting to MySQL database..."); 
      Class.forName(DEFAULT_DRIVER); 
      try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, 
        DB_PASSWORD)) { 
       System.out.println("Connected to MySQL database"); 
       CallableStatement cs = conn.prepareCall("{CALL getBrandRows(" 
         + "?, ?, ?, ?)}"); 
       cs.setString(1, "Brand#13"); 
       cs.registerOutParameter(2, Types.VARCHAR); 
       cs.registerOutParameter(3, Types.VARCHAR); 
       cs.registerOutParameter(4, Types.FLOAT); 

       boolean results = cs.execute(); 
       while (results) { 
        ResultSet rs = cs.getResultSet(); 
        while (rs.next()) { 
         System.out.println("p_name=" + rs.getString("p_name")); 
         System.out.println("p_type=" + rs.getString("p_type")); 
         System.out.println("p_retailprice=" + rs 
           .getFloat("p_retailprice")); 
        } 
        rs.close(); 
        results = cs.getMoreResults(); 
       } 
       cs.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     } 

    } 

    public JavaMySqlStoredProcedures() { 
     new CallStoredProcedureAndSaveXmlFile().execute(); 
    } 

    public static void main(String[] args) { 
     JavaMySqlStoredProcedures jmssp = new JavaMySqlStoredProcedures(); 
    } 

} 
+0

'Ergebnis bestand aus mehr t han one row "... Ich denke, das Problem ist, dass die Abfrage in Ihrem gespeicherten Prozess mehr als einen Datensatz zurückgibt. Sie müssen das beheben. Ich repariere schnell, wenn auch vielleicht nicht logisch korrekt, würde "LIMIT 1" am Ende der Abfrage hinzufügen. Aber es wäre besser für Sie, Logik hinzuzufügen, die auf eine Aufzeichnung in Übereinstimmung mit einer gesunden Geschäftslogik beschränkt ist. –

+0

Zurückgeben und Bearbeiten mehrerer Datensätze mit Prozedur. Ich mache das zum ersten Mal. Ich meine, ich möchte mehrere Datensätze von der Prozedur bekommen und durch jedes Rów wie mit dem Cursor schauen. – anton86993

+0

Wenn Sie artikulieren können, was Sie mit mehreren Datensätzen machen möchten, kann Ihnen vielleicht jemand helfen. –

Antwort

0

Ihre gespeicherte Prozedur gibt mehr als eine Zeile zurück. Einfach die Logik hinter Ihrer Select-Abfrage innerhalb der gespeicherten Prozedur korrigieren, sie sollte nur eine Zeile zurückgeben.

here how to return multiple value

+0

Aber wie auf mehreren Datensätzen mit gespeicherten Prozedur, die mehrere Datensätze zurückgeben? – anton86993

0

nicht IN oder OUT-Parameter verwenden, wenn Sie einfach nur Ergebnis angezeigt werden soll. Außerdem sollten Sie '%%' in Ihrer LIKE-Klausel mit Hilfe der CONCAT-Funktion hinzufügen. Bitte versuchen Sie dieses:

DELIMITER // 

CREATE PROCEDURE getBrandRows(
    pBrand VARCHAR(30) 
) 

BEGIN 

    SELECT p_name, p_type, p_retailprice INTO pName, pType, pRetailPrice 
    FROM part 
    WHERE p_brand LIKE CONCAT("%", pBrand, "%"); 

END// 

DELIMITER ; 
+0

Also alles, was ich tun muss, ist, Ausgänge zu entfernen und einfach SELECT innerhalb der Prozedur zu verwenden? – anton86993

+0

Für diesen Fall ja. Wenn Sie jedoch skalare Ergebnisse oder Summenergebnisse wie SUM(), COUNT() oder ähnliches von innerhalb des Körpers erhalten möchten, können Sie den OUT-Parameter verwenden, um seinen Rückgabewert anzugeben. – Hermanto

+0

Bitte werfen Sie einen Blick auf diese http://dev.mysql.com/doc/refman/5.7/en/create-procedure.html – Hermanto

1

ResultSet mehrere records.I einige Fehler umgehen kann in Ihrem code.Try

diese Schritte
  1. Bewegen Sie alle schließen Methode zu blockieren, um schließlich gefunden.

    try { 
        //do something 
    } catch (Exception e) { 
        //do something 
    } finally { 
        try{ 
         resultSet.close(); 
         statement.close(); 
         connection.close(); 
        } catch (SQLException se) { 
         //do something 
        } 
    } 
    
  2. Sie können Ihr Ergebnis in Liste eintragen. Siehe Beispiel

    List<YourObject> list = new ArrayList<YourObject>(); 
    while (rs.next()) { 
        YourObject obj = new Your Object(); 
        obj.setName(rs.getString("p_name")); 
        obj.setType(rs.getString("p_type")); 
        obj.setRetailPrice(rs.getFloat("p_retailprice")); 
        list.add(obj); 
        } 
    
  3. Stellen Sie sicher, Ihre Anfrage korrekt ist, und die Datenbankverbindung ist Ok.

+0

Ihre Lösung hat mir geholfen, mein Problem zu lösen. Vielen Dank! – anton86993

0

ich richtige Lösung für alle bin Entsendung die smiliar Problem:

1. wurde korrigiert, Stored Procedure:

DELIMITER // 

CREATE PROCEDURE getBrandRows(
    IN pBrand VARCHAR(30)) 
BEGIN 
    SELECT p_name, p_type, p_retailprice 
    FROM part 
    WHERE p_brand = pBrand; 
END// 

DELIMITER ; 

2. Korrigierte Java-Code:

package javamysqlstoredprocedures; 

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 

public class JavaMySqlStoredProcedures { 

    private final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver"; 
    private final String DB_URL = "jdbc:mysql://anton869.linuxpl.eu:3306/" 
      + "anton869_cars?noAccessToProcedureBodies=true"; 
    private final String DB_USER = "xxx"; 
    private final String DB_PASSWORD = "xxx"; 

    class CallStoredProcedureAndSaveXmlFile extends SwingWorker<Void, Void> { 

     @Override 
     public Void doInBackground() { 
      displaySql(); 
      return null; 
     } 

     @Override 
     public void done() { 
     } 

     private void displaySql() { 
      Connection conn = null; 
      CallableStatement cs = null; 
      ResultSet rs = null; 
      try { 
       System.out.println("Connecting to MySQL database..."); 
       Class.forName(DEFAULT_DRIVER); 
       conn = DriverManager.getConnection(DB_URL, DB_USER, 
         DB_PASSWORD); 
       System.out.println("Connected to MySQL database"); 

       cs = conn.prepareCall("{CALL getBrandRows(?)}"); 
       cs.setString(1, "Brand#13"); 

       boolean results = cs.execute(); 
       while (results) { 
        rs = cs.getResultSet(); 
        while (rs.next()) { 
         System.out.println("p_name=" + rs.getString("p_name")); 
         System.out.println("p_type=" + rs.getString("p_type")); 
         System.out.println("p_retailprice=" + rs.getFloat(
           "p_retailprice")); 
        } 
        results = cs.getMoreResults(); 
       } 
      } catch (SQLException | ClassNotFoundException e) { 
      } finally { 
       try { 
        if (rs != null) rs.close(); 
        if (cs != null) cs.close(); 
        if (conn != null) conn.close(); 
       } catch (SQLException e) { 
       } 
      } 
     } 

    public JavaMySqlStoredProcedures() { 
     new CallStoredProcedureAndSaveXmlFile().execute(); 
    } 

    public static void main(String[] args) { 
     JavaMySqlStoredProcedures jmssp = new JavaMySqlStoredProcedures(); 
    } 

} 
Verwandte Themen