我有一个存储过程,它返回多个值(1行)。我需要在选择查询中使用该存储过程的结果。
下面是我希望它的伪代码(这样的语法不存在,但让我们假设它允许将我的存储过程返回的3个值保存到C,D和E中):
SELECT
t1.A, t1.B,
MyStoredProc(t1.A) AS (C, D, E)
FROM
t1
ORDER BY
D
LIMIT
1
(在客户端,我需要获得A,B,C,D和E)
我可以将存储过程重写为存储函数,该函数将值作为带分隔符的连接字符串返回并解析查询中的值,但我希望找到更清晰的解决方案。
答案 0 :(得分:2)
您无法从另一个查询中的存储过程返回的结果集中访问这些值。它们只发送给客户。结果集看起来像一个表,但它不是表。
但是,有一种解决方法,如下所述:
How to use Table output from stored MYSQL Procedure
它无法准确到达您需要去的地方,但它可以让您尽可能地接近。
否则,您可以编写三个存储的函数,它们都运行完全相同的逻辑位,但是将它们的结果缓存在会话变量中,因此无论哪个函数首先执行都将为其他两个函数设置,所以它们复杂的逻辑只执行一次给定输入值,然后为下一个输入值重新执行,因为它与缓存的输入值不同。
IF NOT @__cached__function_input <=> input_arg THEN
SET @__cached__function_input = input_arg;
SELECT complicated, logic, things INTO @__cached__a, @__cached__b, @__cached__c;
END IF;
RETURN @__cached__a; # in function "a" -- return b in b and c in c
如果对任何给定函数使用唯一变量名,则不会发生冲突。函数是串行执行的,而不是并行执行的,即使对于返回多行的语句的同一行上的数据也是如此。