2014-01-07 46 views
0

我遇到的問題是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$$ 
+0

語法錯誤不會立即彈出給我......但彈出的是絕對沒有理由使用遊標......可以通過連接和子查詢來完成並且將會複雜得多。 –

+0

你能解釋一下,我剛剛加入的問題是,其中supplier_id子句還過濾了結果,該結果匹配的訂單ID不是我想要的,因爲order_id不是唯一的 – Ciaran

+0

即時通訊不是和專家的MYSQL程序員,但我認爲你的你的代碼中缺少的東西。例如,你不實際定義任何遊標。我用[這個例子](http://www.kbedell.com/2009/03/02/a-simple-example-of-a-mysql-stored-procedure-that-uses-a-cursor/)當我想做一個存儲過程。 – Melon

回答

1

這是我的解決辦法應該很容易的調整

-- -------------------------------------------------------------------------------- 
-- 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 
相關問題