【问题标题】:Return result set in OUT parameter of Stored Procedure in MySQL返回 MySQL 中存储过程的 OUT 参数中的结果集
【发布时间】:2025-11-30 22:00:01
【问题描述】:

我在 MySQL 中有一个过程,它有两个 IN 参数:userLogin(VARCHAR) 和 userPassword(VARCHAR),以及两个 OUT 参数:userID (INT) 和 userRights(VARCHAR)。

该过程的工作原理如下:检查具有给定登录名和密码的用户是否在数据库中,如果是,则返回他的 ID、userRights 和设置。权限可以连接成一个字符串,但我想避免连接并随后解析 websettings,因为数据的结构更复杂。

现在,我的过程只返回 userID 和 userRights,如果成功,我运行另一个 select 语句来获取设置。

当前程序:

DELIMITER $$
CREATE PROCEDURE `proc_login_user`(IN UserName VARCHAR(45), IN Pwd VARCHAR(250), OUT Uid INT, OUT Rights VARCHAR(100))
BEGIN
    DECLARE Uname VARCHAR(45);
    DECLARE Pass VARCHAR(250);
    DECLARE UserId INT;
    SET @Uname := UserName;
    SET @Pass := Pwd;
    SET @UserId = (SELECT ID FROM `users` WHERE Login = @Uname AND Password = @Pass);    
    SET Uid = @UserId;
    SET Rights = /* some SELECT GROUP_CONCAT statement to create string */
END;

我希望在过程中再添加一个输出参数:userSettings,它应该是一个结果集。

类似这样的:

DELIMITER $$
CREATE PROCEDURE `proc_login_user`(IN UserName VARCHAR(45), IN Pwd VARCHAR(250), OUT Uid INT, OUT Rights VARCHAR(100), OUT Settings)
BEGIN
    DECLARE Uname VARCHAR(45);
    DECLARE Pass VARCHAR(250);
    DECLARE UserId INT;
    SET @Uname := UserName;
    SET @Pass := Pwd;
    SET @UserId = (SELECT ID FROM `users` WHERE Login = @Uname AND Password = @Pass);    
    SET Uid = @UserId;
    SET Rights = /* some SELECT GROUP_CONCAT statement to create string */
    SET Settings = SELECT * FROM `settings` WHERE UserID = @UserId;
END;

任何帮助将不胜感激。

谢谢, 兹比尼克

【问题讨论】:

  • 为什么不在存储过程中简单地执行选择?为什么要将 select 语句的结果放入参数中(顺便说一句,我认为这根本不可能)
  • @ZoharPeled 我需要验证用户是否有效,如果有效,则检索他的戒指、设置等并将它们返回给我的应用程序。我可以(目前)做的比一系列查询(验证 -> 获取权限 -> 获取设置),但在一个查询中包含所有这些会很好
  • 这不能回答我的问题。我在问你为什么要使用 out 参数获取记录集?为什么SET Settings = SELECT * FROM settings WHERE UserID = @UserId; 而不是简单的SELECT * FROM settings WHERE UserID = @UserId;
  • @ZoharPeled 因为我需要先验证用户。现在我连续三个查询。如果一开始没有验证用户,那么选择设置、权限等是没有意义的
  • 然后在存储过程中进行。在 Sql Server 中,我会写 IF @UserId IS NOT NULL 并在该条件之后执行其余的查询。我不知道 MySql 的具体语法,但我确信可以使用简单的if...

标签: mysql stored-procedures resultset


【解决方案1】:

MySQL 不允许变量包含结果集或表;它们只是单个标量值。

在存储过程中,您可以简单地运行 SELECT,结果集将返回给客户端。您不能在 MySQL 中的其他存储例程中使用该结果集,但调用该过程的应用程序可以像使用任何其他查询结果一样使用它。

顺便说一句:

DECLARE Uname VARCHAR(45);
SET @Uname := UserName;

这两行没有任何关系。局部变量“Uname”和用户变量“@Uname”是完全不同的东西。在这种特殊情况下,您不需要任何一个。您可以在查询中直接引用 IN/OUT 变量(只要确保这些变量与表中的列名不同,否则可能会得到意想不到的结果。)

DELIMITER $$
CREATE PROCEDURE `proc_login_user`(IN UserName VARCHAR(45), IN Pwd VARCHAR(250), OUT Uid INT, OUT Rights VARCHAR(100))
BEGIN
    SELECT ID INTO Uid FROM `users` WHERE Login = UserName AND Password = Pwd;    
    /* some SELECT GROUP_CONCAT INTO Rights statement to create string */
    SELECT * FROM `settings` WHERE UserID = Uid;
END;

【讨论】:

    最近更新 更多