2012-01-10 129 views
3

这是一个非常基本的MySQL问题,但我找不到答案。假设下面存储过程体;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)结果。这种行为是否正常?如果是这样,我该如何改变它,因为第一次选择只是为了检查,最后一次是我需要的。

(真正的逻辑是与此不同,我只是简化了在这里)

回答

3

你可以做这样的事情,而不是:

SELECT COALESCE(id/id, 0) AS Existing 
    FROM users 
    WHERE id = pid 
    LIMIT 1; 

如果id被发现,你会返回一个1( id/id = 1)。如果没有找到id,您将返回0(id/id IS NULL,并且COALESCE将返回0)。

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; 
+0

好,但如何检查临时表内的元素数量?当我在某处执行select时,它会返回它并忽略其余部分 – 2012-01-10 16:29:36

+0

@paulsimmons如果您选择了变量,我相信 – 2012-01-10 16:31:09

1

的问题是MySQL的“客户端”您正在使用运行存储过程。存储过程将返回所有查询的结果集,但客户端应该支持它。你在phpMyAdmin或其他类似的客户端运行你的查询吗?尝试使用默认客户端 - 命令提示符调用存储过程,您将看到它返回所有查询的结果。请阅读最后一段on this page

现在,这是一些指针。现在介绍如何从程序返回值。您可以使用OUT参数来执行此操作,该参数用于将过程值返回给调用者。请在this page on the MySQL website上阅读更多内容 - 该页面上的示例解释了这一点。

希望这会有所帮助!

+0

我在节点中使用mysql模块,我已将它配置为通过传递* multipleStatements:true *在连接参数中。对于SP中的每个操作,您都会得到一个结果(不一定是行集)。 – 2017-11-06 22:23:40

0

只是用于调试,如果两个选择SQL返回列数相等时,你可以使用union:

选择1, '100' 联盟选择 '3434',2;