2012-06-07 44 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

相关问题