在MySQL的存储过程的OUT参数中返回结果集

Zby*_*nek 6 mysql stored-procedures resultset

我在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;
Run Code Online (Sandbox Code Playgroud)

我希望在procedure中添加一个输出参数: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;
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

谢谢,Zbynek

Sco*_*yes 2

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

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

作为旁白:

DECLARE Uname VARCHAR(45);
SET @Uname := UserName;
Run Code Online (Sandbox Code Playgroud)

这两行彼此无关。局部变量“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;
Run Code Online (Sandbox Code Playgroud)