如何从存储过程中获取mysql游标值

Posted

技术标签:

【中文标题】如何从存储过程中获取mysql游标值【英文标题】:How to fetch mysql cursore value from stored procedure 【发布时间】:2013-02-16 09:09:45 【问题描述】:

如何在java程序中获取mysql游标值。

这是我的mysql存储过程

delimiter //
CREATE PROCEDURE cursor_student()
BEGIN
DECLARE row_count INT DEFAULT 0;
DECLARE exit_flag INT DEFAULT 0;
DECLARE sid varchar(30);
DECLARE sname varchar(50);
DECLARE rst CURSOR FOR 
    SELECT sid, sname FROM student WHERE class = '11th';

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_flag=1;

OPEN rst;
fetch_loop: LOOP

    FETCH rst INTO sid, sname;  
    IF exit_flag THEN 
        LEAVE fetch_loop;
    END IF;
    SET row_count = row_count +1;
END LOOP;
CLOSE rst;  
SELECT 'number of rows fetched =', row_count;
END;

这是我的simlpe java程序来读取上面的存储过程

import java.sql.CallableStatement;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class StoredProcedure 

public static void main(String[] args) 
    Connection dbConnection = null;
    String url = "jdbc:mysql://localhost:3306/";
    String db = "test";
    String driver = "com.mysql.jdbc.Driver";
    ResultSet rs = null;
    CallableStatement callableStatement = null;
    String getDBUSERCursorSql = "call cursor_student";
    try 
        Class.forName(driver);
        dbConnection = DriverManager.getConnection(url + db, "root", "");
        try 

            callableStatement = dbConnection.prepareCall(getDBUSERCursorSql);


            callableStatement.executeUpdate();

            rs = callableStatement.getResultSet();

            while (rs.next()) 


                System.out.println("sid "+rs.getString(1)  +"  name  "+rs.getString(2));
            
         catch (Exception e) 
            e.printStackTrace();
        
     catch (Exception e) 
        e.printStackTrace();
    

上述java程序的输出是

  sid number of rows fetched =  name  6

但我想显示 sid 和 sname 的值

+------+-------+
| sid  | sname |
+------+-------+
| 1    | asdf  |
| 2    | dff   |
| 3    | gggg  |
| 4    | tttt  |
| 5    | mmmm  |
| 6    | .uyy  |
+------+-------+

【问题讨论】:

重新标记为 [mysql]。我认为问题出在mysql 方面 @user000001 所以java代码是正确的。 未经测试我不能这么说。但根据您的输出,结果集似乎充满了SELECT 'number of rows fetched =', row_count; 的输出。这使我相信问题出在存储过程中。不过我可能是错的。我的 SQL 知识有限。 【参考方案1】:

我认为你的 SP 有问题。

您能否根据此 SP 示例进行更改?我还没有执行,但我想是的

DROP PROCEDURE IF EXISTS  mysql_cursor_example $$
CREATE PROCEDURE mysql_cursor_example ( IN in_name VARCHAR(255) )
BEGIN
  -- First we declare all the variables we will need
  DECLARE l_name    VARCHAR(255);
  -- flag which will be set to true, when cursor reaches end of table
  DECLARE exit_loop BOOLEAN;         

  -- Declare the sql for the cursor
  DECLARE example_cursor CURSOR FOR
    SELECT name status_update
    FROM employees
    WHERE name = name_in;

  -- Let mysql set exit_loop to true, if there are no more rows to iterate
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;

  -- open the cursor
  OPEN example_cursor;

  -- marks the beginning of the loop
  example_loop: LOOP

    -- read the name from next row into the variable l_name
    FETCH  example_cursor INTO   l_name;

    -- check if the exit_loop flag has been set by mysql, 
    -- if it has been set we close the cursor and exit 
    -- the loop
    IF exit_loop THEN
        CLOSE example_cursor;
        LEAVE example_loop;
    END IF;

  END LOOP example_loop;
END $$

DELIMITER ;

【讨论】:

以上是关于如何从存储过程中获取mysql游标值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 %ROWTYPE 获取游标值

如何存储将返回ref光标的函数的结果?

如何在过程中的表中插入游标值

python pymysql.cursors如何从mysql存储过程中获取INPUT返回结果

从java中的mysql存储过程中获取参数

如何从存储过程中获取结果,过程运行良好但 php 返回 null