2012-06-07 48 views
0

我一直在努力奮鬥幾天,出現問題。我在Oracle數據庫(10g)中有幾張表,其中顯示按優先級排序的訂單列表,另一個列表顯示產品庫存。我想要做的是根據優先級將可用產品分配給訂單。我的問題是:PL/SQL根據其他表中某一行的值選擇多個項目

  • 每個訂單將只收到一個產品。我如何才能根據可用的存在選擇可以接收產品的訂單?
  • 爲了使程序更有效率,是否有一種方法可以在選擇產品時存儲庫存變更,並在程序結束時應用更新?

這兩個表都會有成千上萬的項目,所以我認爲PL/SQL存儲過程會更有效率。

感謝您的時間和幫助。 PS:這是我的表格的一個例子。

Orders 
------------------------------------------- 
| ID  | Priority  |  Product 
------------------------------------------- 
| Order1 | 50   |  1 
| Order7 | 48   |  3 
| Order3 | 45   |  1 
| Order2 | 40   |  1 
| Order9 | 30   |  2 
| Order4 | 15   |  3 


Inventory 
------------------------------------------- 
| ProductID | Qty  
------------------------------------------- 
| 1   | 2 
| 2   | 4 
| 3   | 1 

運行存儲過程後,我需要獲得以下結果並需要更新清單。

------------------------------------------- 
| ID  | Priority  |  Product 
------------------------------------------- 
| Order1 | 50   |  1 
| Order7 | 48   |  3 
| Order3 | 45   |  1 
| Order9 | 30   |  2 

Updated Inventory 
------------------------------------------- 
| ProductID | Qty  
------------------------------------------- 
| 1   | 0 
| 2   | 3 
| 3   | 0 
+0

到目前爲止你有什麼? – tbone

回答

0

是的,一個程序將是處理交易的最佳方式。

打開遊標並使用您訂購的訂單表進行填充。在完成訂單時循環瀏覽光標並更新庫存表。

CREATE OR REPLACE PROCEDURE update_oders (status OUT BOOLEAN) 
IS 
    CURSOR orders 
    IS 
      SELECT id, priority, product 
      FROM orders 
     ORDER BY priority DESC; 
BEGIN 
    status := FALSE; 

    FOR cur_rec IN orders 
    LOOP 
     BEGIN 
      SELECT COUNT (*) 
       INTO inventory_count 
       FROM inventory 
      WHERE productid = cur_rec.product; 

      IF inventory_count > 0 
      THEN 
       BEGIN 
        UPDATE inventory 
         SET qty = qty - 1 
        WHERE productid = cur_rec.product; 

        INSERT INTO filledorder (id, priority, product) 
         VALUES (id, priority, product); 
       EXCEPTION 
        WHEN OTHERS 
        THEN 
         --log error about problem.. 
         ROLLBACK; 
       END; 
      ELSE 
       -- log some error or order inventory? 
       NULL; 
      END IF; 
     EXCEPTION 
      WHEN NO_DATA_FOUND 
      THEN 
       --log data; 
       NULL; 
     END; 
    END LOOP; 

    COMMIT; 
    status := TRUE; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     -- log 
     ROLLBACK; 
     status := FALSE; 
END; 
+0

爲什麼程序更高效?一般來說SQL比PL/SQL更有效率。 – Ben

+0

因爲這有兩個方面 - 你需要更新一個表並且插入另一個表或者返回已完成訂單的遊標。 –

+0

非常感謝。這似乎是我正在尋找的。我會執行它並告訴你它是否按預期工作。 – Alex

相關問題