MySQL 存储过程可以返回行流而不将它们存储在临时表中吗?

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

我正在编写一个存储过程,它将执行 SELECT,用游标循环遍历它,执行一些稍微复杂的处理,然后以修改后的形式返回一些行。

执行此操作的一种方法是创建一个临时表,将处理结果插入其中,然后使用

select * from temp_table;

完成该过程

我想知道是否可以跳过该部分并将计算的行直接流式传输到客户端,而不涉及临时存储的开销。

mysql
2个回答
2
投票

存储过程中的每个无界

SELECT
都会向线路写入一个单独的结果集。将它们组合成单个结果集的唯一方法是使用临时表,然后在完成后从其中
SELECT

否则,客户端必须通过调用

more_results
来迭代多个结果集,这会告诉您是否有更多结果可用。当你的程序完成时它返回 false。

MySQL 用于实际写入这些多个结果集的机制非常轻量级,因此这取决于这是否适合您想要做的事情,这在您的应用程序中是否有用。


0
投票

是,通过定义输出参数

CREATE DEFINER=`root`@`localhost` PROCEDURE `Jahr_Monat`(

IN  in_jahr int,
OUT out_mon_int int,
OUT out_monat VARCHAR(50),
OUT out_mon int, 
OUT out_quartal int,
OUT out_halbjahr int, 
OUT out_jahr int
)
BEGIN
    IF in_jahr IS NULL THEN
        SET in_jahr=YEAR(CURRENT_DATE()); 
    END IF;
    Select 1  `Mon_int`,'Januar'    `Monat`, 'JAN'    `MON`,1  `Quartal`,1  `Halbjahr`,in_jahr `Jahr` UNION
    Select 2  `Mon_int`,'Februar'   `Monat`, 'FEB'   `MON`,1  `Quartal`,1  `Halbjahr`,in_jahr `Jahr` UNION
    Select 3  `Mon_int`,'März'      `Monat`, 'MÄR'      `MON`,1  `Quartal`,1  `Halbjahr`,in_jahr `Jahr` UNION
    Select 4  `Mon_int`,'April'     `Monat`, 'APR'     `MON`,2  `Quartal`,1  `Halbjahr`,in_jahr `Jahr` UNION
    Select 5  `Mon_int`,'Mai'       `Monat`, 'MAI'       `MON`,2  `Quartal`,1  `Halbjahr`,in_jahr `Jahr` UNION
    Select 6  `Mon_int`,'Juni'      `Monat`, 'JUN'      `MON`,2  `Quartal`,1  `Halbjahr`,in_jahr `Jahr` UNION
    Select 7  `Mon_int`,'Juli'      `Monat`, 'JUL'      `MON`,3  `Quartal`,2  `Halbjahr`,in_jahr `Jahr` UNION
    Select 8  `Mon_int`,'August'    `Monat`, 'AUG'    `MON`,3  `Quartal`,2  `Halbjahr`,in_jahr `Jahr` UNION
    Select 9  `Mon_int`,'September' `Monat`, 'SEP' `MON`,3  `Quartal`,2  `Halbjahr`,in_jahr `Jahr` UNION
    Select 10 `Mon_int`,'Oktober'   `Monat`, 'OKT'   `MON`,4  `Quartal`,2  `Halbjahr`,in_jahr `Jahr` UNION
    Select 11 `Mon_int`,'November'  `Monat`, 'NOV'  `MON`,4  `Quartal`,2  `Halbjahr`,in_jahr `Jahr` UNION
    Select 12 `Mon_int`,'Dezembr'   `Monat`, 'DEZ'   `MON`,4  `Quartal`,2  `Halbjahr`,in_jahr `Jahr` 
    ;

END

CALL Jahr_Monat(NULL, @out_mon_int,
@out_monat,
@out_mon , 
@out_quartal ,
@out_halbjahr , 
@out_jahr )  ;

Mon_int Monat MON Quartal Halbjahr Jahr 1 一月 1 1 2024 2 月 2 日 2024 年 2 月 1 日 3 三月 1 1 2024 4 月 4 日 2024 年 4 月 2 1 日 5 麦麦 2 1 2024 6 六月 2024 年 6 月 2 1 日 7 月 7 月 3 2 2024 八月 8 八月 3 2 2024 九月 9 日 九月 3 2 2024 10 十月 OKT 4 2 2024 十一月 11 十一月 4 2 2024 12 十二月 DEZ 4 2 2024

© www.soinside.com 2019 - 2024. All rights reserved.