mysql - 在 select 语句中使用存储过程的结果 [MySql]

标签 mysql sql database stored-procedures

我有一个返回多个值(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)

我可以将存储过程重写为存储函数,该函数将值作为带有分隔符的连接字符串返回,并解析查询中的值,但我想找到一个更干净的解决方案。

最佳答案

您无法访问另一个查询中的存储过程返回的结果集中的值。它们仅发送给客户。结果集看起来像一个表,但它不是一个表。

但是,有一个解决方法,如下所述:

How to use Table output from stored MYSQL Procedure

它不能准确地带您到达您需要去的地方,但它可以让您尽可能接近目的地。

否则,您可以编写三个存储函数,它们都运行完全相同的逻辑,但将其结果缓存在 session 变量中,因此无论哪个函数先执行,都会为其他两个函数做好准备,因此它们复杂的逻辑仅在一次执行中执行一次给定的输入值,然后重新执行下一个输入值,因为它与缓存的不同。

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

如果您对任何给定函数使用唯一的变量名称,它们不会发生冲突。函数是串行执行的,而不是并行执行的,即使对于返回多行的语句的同一行上的数据也是如此。

关于mysql - 在 select 语句中使用存储过程的结果 [MySql],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623681/

相关文章:

带有 DATEDIFF 的 MySQL 查询

mysql - 使用groovy脚本迁移数据库

php - SQL,带有小数条目的 varchar 字段 = ORDER BY 排序不正确

php - 如何在 Yii 中使用 CListView 自定义 dataProvider

sql - 将 GROUP BY 结果插入另一个表

mysql - 将不同的数据库复制到不同的从站

database - 更新 Laravel 列中的字段

php - Codeigniter 从表中删除记录,其中 page_id 和 user_id

php - MySQL 中的动态搜索查询

sql - 我如何加速此 SQL 查询?