在另一个存储过程中获取存储过程结果集

问题描述 投票:0回答:2

假设我有多个存储过程在 IN 子句中使用相同的子查询。子查询选择 ID 列表。我的反应是继续创建一个包含此子查询的新存储过程,以在单个位置定义它,并在其他过程中使用它。现在我意识到,在调用存储过程时,我无法从子查询中获取结果集...我进行了搜索,发现除了定义临时表之外没有其他选择,我发现获取几个 Id 太过分了。有什么我遗漏的或者我根本无法在 MYSQL 中执行此操作吗?

为了说明我的问题:

CREATE PROCEDURE subquery()
BEGIN   
    SELECT id from example; # returns a list of IDs
END;

CREATE PROCEDURE procedure1()
BEGIN   
    SELECT * from example2 WHERE id IN (CALL subquery()); # No go, syntax error
END;

CREATE PROCEDURE procedure2()
BEGIN
    SET @resultSet = CALL subquery();
    SELECT * from example2 WHERE id IN (@resultSet); # No go, syntax error
END;

当然,真正的子查询是一大块 SQL,我更喜欢将其维护在一个地方。

据我了解,我不能使用函数,因为它们只返回标量值,并且我不能使用 OUT 参数,因为它们不允许结果集。

除了乘法子查询或使用here定义的临时表之外,我还有什么选择?

mysql stored-procedures
2个回答
1
投票

不幸的是,您不能在 MySQL 中的另一个存储过程中使用存储过程输出。但如果您的子查询不需要参数,最好的选择(在我看来)是 VIEW:

CREATE VIEW myView AS select id from example;

然后您可以将视图作为表引用(也可以在其他存储过程中):

SELECT * from example2 WHERE id IN (select id from myView);

0
投票

对于如何将表从一个存储过程返回到另一个存储过程,这个现有的 Stack Exchange 答案帮助了我:

https://dba.stackexchange.com/a/270887/61926

它通过使用已知名称的临时表(至少每个连接是唯一的)来工作。

© www.soinside.com 2019 - 2024. All rights reserved.