MySQL存储过程返回Select查询结果

3

这是一个非常基础的MySQL问题,但我找不到答案。假设以下存储过程主体:

DECLARE Existing INT DEFAULT 0;
SELECT SQL_CALC_FOUND_ROWS name FROM users WHERE id = pid LIMIT 1;
SELECT FOUND_ROWS() INTO Existing;
Select Existing;

当我运行它时,它总是返回第一个SELECT的结果。但是,我希望它返回最后一个(SELECT Existing)的结果。这种行为是否正常?如果是,我应该如何更改它,因为第一个SELECT只是用于检查,我需要的是最后一个SELECT的结果。
(实际逻辑与此不同,我只是在这里简化了它)
4个回答

3
你可以尝试这样做代替原来的方法:
SELECT COALESCE(id/id, 0) AS Existing
    FROM users 
    WHERE id = pid 
    LIMIT 1;

如果找到id,将返回1(id/id=1)。如果未找到id,则将返回0(id/id为NULL,而COALESCE将返回0)。

1
问题在于你使用的MySQL“客户端”来运行存储过程。存储过程将返回所有查询结果集,但客户端必须支持它。你是在phpMyAdmin或其他类似的客户端中运行查询吗?尝试使用默认客户端——命令提示符调用存储过程,你会看到它返回所有查询的结果。请阅读最后一段此页面
现在让我们来谈谈如何从存储过程中返回值。你可以使用OUT参数将值从存储过程传递回调用者。请在MySQL网站上的此页面上阅读更多信息——该页面上的示例解释了这一点。
希望这能帮到你!

我正在使用Node中的mysql模块,通过在连接参数中传递multipleStatements: true来配置它返回多个结果集。对于存储过程中的每个操作,您将获得一个结果(不一定是行集)。 - Jeff Lowery

0

仅用于调试,如果两个选择SQL返回的列数相等,您可以使用UNION:

SELECT 1,'100' UNION SELECT '3434',2;


0
你可以创建表变量,填充数据,然后从中进行选择。
CREATE PROCEDURE my_proc () BEGIN 

CREATE TEMPORARY TABLE TempTable (myid int, myfield varchar(100)); 
INSERT INTO TmpTable SELECT tblid, tblfield FROM Table1; 

SELECT * FROM TEMPORARY;

好的,但是如何检查临时表中元素的数量?当我在某个地方执行选择操作时,它会返回并忽略其余部分。 - user192936
@paulsimmons 如果你是选择变量,我认为不会。 - Bassam Mehanni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接