簡體   English   中英

存儲過程-遍歷結果並將它們存儲在臨時表中

[英]Stored procedure - looping through results and store them in a temporary table

我遇到的問題是Mysql工作台在' DELARE tempOrder_id int;附近報告了SQL語法錯誤DELARE tempOrder_id int; '雖然我似乎看不到錯誤,但帶有紅色下划線的聲明,也尚未能夠對此進行測試,因此,如果您發現任何其他錯誤或更有效的方式運行此命令,請說。 容易理解,我從查詢中獲取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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM