2013-06-05 33 views
1

這裏是我的Java方法:如何通過使用MySql存儲過程和「select」關鍵字遍歷ResultSet?

public static List<Company> selectCompanies() { 

    List<Company> companies=new ArrayList<Company>(); 
    CallableStatement cs = null; 
    Connection conn = null; 
    String url = "jdbc:mysql://localhost:3306/java?user=root&password=root"; 
    try { 
     conn = DriverManager.getConnection(url); 
     cs = conn.prepareCall("{call select_companies()}"); 
     ResultSet rs=cs.executeQuery(); 
     while(rs.next()){ 
      Company company=new Company(); 
      company.setId(rs.getInt(1)); 
      company.setName(rs.getString(2)); 
      companies.add(company);   } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     try { 
      cs.close(); 
      conn.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    return companies; 

} 

這裏存儲在MySQL數據庫的程序:

CREATE PROCEDURE select_companies() 
    BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE o_id SMALLINT; 
    DECLARE o_name VARCHAR(52); 
    DECLARE cur1 CURSOR FOR SELECT ID,NAME FROM b_company; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN cur1; 
    read_loop: LOOP 
    FETCH cur1 INTO o_id, o_name; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    END LOOP; 

    CLOSE cur1; 

當我嘗試運行java代碼,我不斷收到「的結果集是從UPDATE.No數據」例外。我是新來的存儲過程,我不知道我在這裏失蹤。

+2

這個問題是不是在Java方面,是在你的MySQL存儲過程。你永遠不會將遊標或結果集返回到外部世界。 –

回答

1

由於Luiggi也提到了你需要返回的結果,你的情況我承擔其o_ido_name

CREATE PROCEDURE select_companies() 
    BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE o_id SMALLINT; 
    DECLARE o_name VARCHAR(52); 
    DECLARE cur1 CURSOR FOR SELECT ID,NAME FROM b_company; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN cur1; 
    read_loop: LOOP 
    FETCH cur1 INTO o_id, o_name; 
    SELECT o_id, o_name; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    END LOOP; 

    CLOSE cur1; 
+0

非常感謝您的幫助。 – cek

+0

不用擔心:)很高興我能幫上忙 – Stephan