我在MySQL中有一个过程,它有两个in参数:userLogin(VARCHAR)和userPassword(VARCharr),以及两个OUT参数:userID(INT)和userRights(VARCHAR)。
过程如下:检查具有给定登录名和密码的用户是否在数据库中,如果是,则返回他的ID、userRights和设置。权限可以连接到一个字符串中,但我希望避免连接并随后解析Web设置,因为数据的结构更复杂。
现在,我的过程只返回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;
如有任何帮助,我们将不胜感激。
谢谢,Zbynek
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;