2016-11-01 2 views
0

Я написал хранимую процедуру в MySQL, который выглядит следующим образом (он работает):Как исправить результат состоял из более чем одной ошибки строки

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 ; 

Я пытаюсь вернуть несколько результатов и их отображения. Я пробовал много способов, описанных здесь в Stack и в Интернете, но это мне не помогает. Я редактировал весь свой код и создал простой, чтобы вы могли вставлять его и компилировать. Он должен работать, но с ошибкой. Вот код:

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

'Результат состоял из более t han one row' ... Я думаю, проблема в том, что в запросе внутри сохраненного proc возвращается более одной записи. Вам нужно это исправить. Я быстро исправить, хотя, возможно, и не логически исправлять, было бы добавить 'LIMIT 1' в конец запроса. Но было бы лучше, если бы вы добавили логику, которая ограничивает одну запись в соответствии со звуковой бизнес-логикой. –

+0

Как вернуть и использовать несколько записей, используя процедуру. Я делаю это в первый раз. Я имею в виду, что я хочу получить несколько записей из процедуры и просматривать каждый текст с помощью курсора. – anton86993

+0

Если вы можете сформулировать, что вы хотите сделать с несколькими записями, то, возможно, кто-то может вам помочь. –

ответ

0

Ваша хранимая процедура возвращает более одной строки. Правильная логика вашего запроса выбора внутри хранимой процедуры должна возвращать только одну строку.

here how to return multiple value

+0

Но как работать с несколькими записями, используя хранимую процедуру, которая возвращает несколько наборов данных? – anton86993

0

Не использовать IN или OUT параметр, если вы просто хотите, чтобы отобразить результат. А также вы должны добавить '%%' в предложение LIKE с помощью функции CONCAT. Пожалуйста, попробуйте это:

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

Итак, все, что мне нужно сделать, это удалить выходы и просто использовать процедуру SELECT внутри? – anton86993

+0

Для этого случая да. Но если вы хотите получить скалярный результат или совокупный результат, такой как SUM(), COUNT() или подобное изнутри тела, вы можете использовать параметр OUT для указания его возвращаемого значения. – Hermanto

+0

Пожалуйста, взгляните на это http://dev.mysql.com/doc/refman/5.7/ru/create-procedure.html – Hermanto

1

ResultSet может работать с несколькими records.I нашли некоторые ошибки в code.Try эти шаги

  1. Переместите все закрытым способом, наконец, блокировать.

    try { 
        //do something 
    } catch (Exception e) { 
        //do something 
    } finally { 
        try{ 
         resultSet.close(); 
         statement.close(); 
         connection.close(); 
        } catch (SQLException se) { 
         //do something 
        } 
    } 
    
  2. Вы можете поместить свой результат в список. Смотрите образец

    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. Убедитесь, что запрос является правильным и соединение с базой данных Ok.

+0

Ваше решение помогло мне решить мою проблему. Спасибо! – anton86993

0

Я отправляю правильное решение всех, кто имеет smiliar проблему:

1. Исправленная 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. Исправленная Java код:

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(); 
    } 

} 
Смежные вопросы