返回多个记录集的 MySQL 存储过程

标签 mysql sql stored-procedures mysql-workbench

我在我的数据库 (MySQL) 中创建了一些存储过程,如下所示。

存储过程 1

CREATE PROCEDURE sp_Name1(
    param1,
    param2,
    ...... 
)
BEGIN
   .....
   some code
   IF cond THEN 
       call sp_Name2  //Calling 2nd procedure from here.

       Update SomeTable .....

       SELECT '1' As Result;
   END IF
END

存储过程2

CREATE PROCEDURE sp_Name2(
    param1,
    param2,
    ...... 
)
BEGIN
   .....
   some code
   IF cond THEN 
       SELECT '2' As Result;

       SELECT '3' As Result;
   END IF
END

现在我调用我的第一个存储过程如下:

Call sp_Name1(param1, param2, ... );

在这里,我在 MySQL Workbench 中获得了 4 个结果集。 2 个结果来自 sp_Name2,第 3 个来自 sp_Name1 中的更新语句,第 4 个来自 select 语句,也在 sp_Name1 中。在这里,我只查找最后一个结果集。有时结果序列按预期的顺序出现,这意味着结果可能会像 Result 1, Result 2, Result 4, Result 3 这样(在这种情况下我无法判断哪个结果集对我有用,因为最后一个结果集可能被改变)。

如何抑制不需要的结果集?

编辑: 我有用例供您更好地理解。

CREATE PROCEDURE sp_LoginUser( IN Username  varchar(50) , IN password varchar(50) )
BEGIN
    IF EXISTS( SELECT 1 FROM Users where name = UserName and Pwd = password)
       SET userid = 0;
       SET loginid = 0;
       SELECT userid INTO userid
       FROM users
       WHERE name = UserName and Pwd = password;
       IF userid > 0 THEN
           CALL sp_Login(userid);
           SET loginid = LAST_INSERT_ID();         
       END IF;
       //only this result i am expecting.
       IF loginid > 0 THEN
           SELECT userid as userid, loginid AS loginid;
       ELSE
           SELECT 0 userid, 0 loginid;
       END IF;
    END IF;
END

CREATE PROCEDURE sp_Login( IN Userid int )
BEGIN
    INSERT Logins ( userid, datetime )
    VALUES ( Userid, now() );

    SELECT LAST_INSERT_ID() AS loginid;
END

现在,当我的用户请求登录并在我的登录页面上输入他/她的用户名和密码时,我会在我的服务器上调用 sp_LoginUser()。在许多情况下,我必须单独调用 sp_Login()。

在上述情况下,我可以在 sp_Login() 过程中将一个参数(例如 loginid)设置为 INOUT,将 LAST_INSERT_ID() 分配给它,删除 SELECT 语句并在 sp_LoginUser() 中检索。 但是当我需要单独调用 sp_Login() 时,我必须在我的代码中声明一些变量来检索值。

最佳答案

如果您不想要这些结果集,请不要选择它们。

关于返回多个记录集的 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629558/

相关文章:

sql-server - 如何从 SQL Server 存储过程返回多个数据表?

java - JPA - 将对象保存在一起

php - Cakephp 3 在 frozentime 对象中给出日期和时间字段

php - 当 php 代码没有达到 release-mysql-lock 阶段时会发生什么?

sql - 识别指向彼此的数据库记录

c# - SQL Server CLR 和 T-SQL 存储过程与调用者是否相同?

MySQL 存储过程变量返回 NULL

mysql - 如何在mysql中对同一个表和sum(值)使用联合查询?

php - 我的论坛搜索不能只是搜索主题

php - 函数在 mysql 中显示数据截断列的警告