如何从存储过程中获取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游标值的主要内容,如果未能解决你的问题,请参考以下文章