MySQL 存储过程 - 如何引用内部创建的记录集

Posted

技术标签:

【中文标题】MySQL 存储过程 - 如何引用内部创建的记录集【英文标题】:MySQL Stored Procedure - how to reference internally created recordset 【发布时间】:2014-08-18 00:14:43 【问题描述】:

我很好奇如何在同一个存储过程中从辅助查询或 SET 调用中引用现有的存储过程 SELECT 语句。

例如:

CREATE PROCEDURE 'mysp' (OUT sumvalue INT)
BEGIN
    -- This is the core recordset the SP returns
    SELECT * FROM Table

    -- I also want to return a value based on the above recordset
    SET sumvale = SUM(previousselect.values)
END

基本上,我有一个返回详细记录集的 SP,我需要根据该记录集中的数据返回 SUM 和自定义值。问题是我无法弄清楚如何在 SELECT 语句之后引用数据(例如,它是否创建了一个我可以使用的内部引用,例如 @recordset1.X)。

任何帮助将不胜感激。

【问题讨论】:

How to use Table output from stored mysql Procedure 的可能重复项 【参考方案1】:

尝试使用this链接中的光标:

由于 MySql 不允许您从存储过程或函数返回记录集,您可以试试这个:

CREATE DEFINER=`root`@`localhost` PROCEDURE `some_procedure`(out some_id int)
BEGIN
    declare done boolean default false;
    declare id int;
    declare tot decimal(10,2);

    declare some_cursor cursor for 
       select id, total from some_table where id = some_id;

    declare continue handler for not found set done = true;

    open some_cursor;
    loop1: loop
        fetch some_cursor into id, tot;
        if done=true then
            leave loop1;
        end if;

        //do your calculation here or whatever necessary you want to do with the code

    end loop loop1;
END;

【讨论】:

嗯;这似乎过于复杂。注意我可以专门创建一个 SP 来获取值的总和,但我不想创建冗余调用(似乎效率低下)。 SELECT 语句执行后无法在存储过程中引用它的记录集吗?请注意,我们使用 Node.js 作为 Web 处理框架,并且存储过程返回记录集就可以了,所以不确定您所说的“MySql 不允许您从 ... store[d] 过程返回记录集”是什么意思”。他们返回记录集就好了。 是的,过程可以从任何各种 sql 查询返回记录集,但不能通过从另一个存储过程内部调用。我以前也遇到过这种情况,最后我使用游标而不是 mysql 存储的视图。

以上是关于MySQL 存储过程 - 如何引用内部创建的记录集的主要内容,如果未能解决你的问题,请参考以下文章

oracle 如何返回多条记录

在MySQL中如何创建一个带输出参数为一个表类型的存储过程

MySQL 存储过程,获取使用游标查询的结果集

MySQL存储过程和游标

请教一个mysql 存储过程的问题?

使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?