假设我有多个存储过程在 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 中的另一个存储过程中使用存储过程输出。但如果您的子查询不需要参数,最好的选择(在我看来)是 VIEW:
CREATE VIEW myView AS select id from example;
然后您可以将视图作为表引用(也可以在其他存储过程中):
SELECT * from example2 WHERE id IN (select id from myView);
对于如何将表从一个存储过程返回到另一个存储过程,这个现有的 Stack Exchange 答案帮助了我:
https://dba.stackexchange.com/a/270887/61926
它通过使用已知名称的临时表(至少每个连接是唯一的)来工作。