mysql - 存储过程 - 循环结果并将其存储在临时表中

标签 mysql sql stored-procedures

我遇到的问题是 Mysql 工作台在“DELARE tempOrder_id int;”附近报告 SQL 语法错误,并用红色下划线声明,尽管我似乎看不到错误,但也没有'目前还无法对此进行测试,因此如果您发现任何其他错误或更有效的运行方法,请说明。应该很容易理解我从查询中获取 id,然后使用该 id 运行一个新查询并将其存储在表中,以便我可以返回它

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `DLP_orders ` ()
BEGIN
    Create temporary table if not exists MyReturnTable
        (id int, order_id int, total_tickets int, product_id int, product_name varchar(255), PRIMARY KEY (id)) ENGINE=MEMORY;

    DECLARE tempOrder_id int;
    DECLARE order_Cursor;

    SELECT o.id FROM orders as o
        INNER JOIN orders_items as oi
            ON o.id = oi.order_id
        INNER JOIN contracts as c
            ON c.id = oi.contract_id
    WHERE (o.created BETWEEN '2013-01-01 00:00:00' AND '2013-02-02 23:59:59' OR o.updated BETWEEN '2013-01-01 00:00:00' AND '2013-02-02 23:59:59') AND (c.supplier_id = 95 || c.supplier_id = 255);

    OPEN order_Cursor;
    FETCH NEXT FROM order_Cursor INTO @tempOrder_id;

    WHILE @@FETCH_STATUS = 0
        BEGIN
            INSERT INTO MyReturnTable (order_id, total_tickets,  product_id, product_name)
                SELECT o.id, oi.total_tickets, p.id, p.name FROM orders as o
                    INNER JOIN orders_items as oi
                        ON o.id = oi.order_id
                    INNER JOIN products as p
                        ON p.id = oi.product_id
                    INNER JOIN contracts as c
                        ON c.id = oi.contract_id
                WHERE o.id = @tempOrder_id;

            FETCH NEXT FROM order_Cursor INTO @tempOrder_id;
        END;

    CLOSE order_Cursor;
    DEALLOCATE order_Cursor;

    SELECT * FROM MyReturnTable;
END$$

最佳答案

这是我经过一些调整后的解决方案

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `DLP_orders` ()
BEGIN
    DECLARE tempOrder_id int;
    DECLARE order_Cursor CURSOR FOR
    SELECT o.id FROM orders as o
        INNER JOIN orders_items as oi
            ON o.id = oi.order_id
        INNER JOIN contracts as c
            ON c.id = oi.contract_id
    WHERE (o.created BETWEEN '2013-01-01 00:00:00' AND '2013-02-02 23:59:59' OR o.updated BETWEEN '2013-01-01 00:00:00' AND '2013-02-02 23:59:59') AND (c.supplier_id = 95 || c.supplier_id = 255);

    OPEN order_Cursor;
    FETCH NEXT FROM order_Cursor INTO tempOrder_id;

    WHILE @@FETCH_STATUS = 0 DO
            INSERT INTO MyReturnTable (order_id, total_tickets,  product_id, product_name)
                SELECT o.id, oi.total_tickets, p.id, p.name FROM orders as o
                    INNER JOIN orders_items as oi
                        ON o.id = oi.order_id
                    INNER JOIN products as p
                        ON p.id = oi.product_id
                    INNER JOIN contracts as c
                        ON c.id = oi.contract_id
                WHERE o.id = @tempOrder_id;

            FETCH NEXT FROM order_Cursor INTO tempOrder_id;
    END WHILE;

    CLOSE order_Cursor;

    SELECT * FROM MyReturnTable;
END

关于mysql - 存储过程 - 循环结果并将其存储在临时表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20971494/

相关文章:

mysql - 使用多重内部连接在 MySQL 中塑造数据集

sql - 根据最大值选择列

sql - Postgres 数组作为 where 子句的函数输入

sql - 如何在oracle时间戳中添加第二个

mysql - 我可以在 MySQL 中执行可选的 LEFT JOIN 吗?

c# - 使用无名参数执行存储过程

并发数据库调用的 PHP/Mysql 问题

MySQL - 错误 2013 : Lost Connection to MySQL server during Query - Localhost

php - PDO 查询不起作用,但生成的 SQL 在 PHPMyAdmin 上运行

sql-server - 在 SQL Server 中查找树的叶节点