我有一个存储过程,我需要将其调用到 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
('00ab16ae-7402-441d-b9' 在第 77 行books
不,您不能在子查询中调用过程。您只能在子查询中使用 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