我可以在 FROM 子句中调用存储过程吗 - MYSQL,如果不能,有什么选择?

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

我有一个存储过程,我需要将其调用到 select 语句中以添加额外的过滤。

我已经尝试创建一个临时表并将数据插入其中,但我无法让它工作。

CREATE temporary table reporting.test
(
  bookid varchar(60), 
  title varchar(80), 
  age int, 
  author varchar(60), 
  description text
)


INSERT INTO reporting.test (  bookid , title , age , author , description )
SELECT bookid , title , age , author , description from 
  (
  call  `reporting`.`books`('00ab16ae-7402-441d-b9a2-45a3f4793adf', 'Booktitle', 'Author')
  )

我看过下面的例子;但我似乎也无法正常工作。

SELECT *
FROM (
call  `reporting`.`books`('00ab16ae-7402-441d-b9a2-45a3f4793adf', 'Booktitle', 'Author')
) AS reporting.test

我的存储过程有 3 个参数,它就像调用语句一样工作。 我需要使用动态 SQL 吗?

尝试执行语句时,我收到以下错误:

错误代码:1064。你的SQL语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在 'call

reporting
.
books
('00ab16ae-7402-441d-b9' 在第 77 行

mysql
1个回答
0
投票

不,您不能在子查询中调用过程。您只能在子查询中使用 SELECT。

原因是程序返回了多个结果。结果可能不同(即数量和数据类型不同的列)。

例子:

CREATE PROCEDURE p()
BEGIN
  SELECT id, txt, created_at FROM table1;

  SELECT user_id, COUNT(*) FROM table2;
END

子查询不可能返回多个结果。

所以调用过程的唯一选择是使用 CALL 作为顶级语句。

如果需要过滤结果的行,那么就需要写一个循环来处理行。这通常在应用程序代码中完成。您不能在存储过程中执行此操作,因为 DECLARE CURSOR 仅适用于 SELECT 语句,不适用于 CALL 语句(同样是因为过程返回多结果)。

另一个选项是调用存储函数而不是存储过程。存储函数可以接受参数,您可以在子查询中使用 SELECT 调用它,但存储函数仅返回单个标量值,而不返回多列、多行或多个结果。

SELECT *
FROM (
  SELECT `reporting`.`myfunction`(...) AS f
) AS reporting.test
© www.soinside.com 2019 - 2024. All rights reserved.