0

我已经为一个问题苦苦挣扎了好几天。我在 Oracle DB (10g) 中有几个表,一个显示按优先级排序的订单列表,另一个显示产品库存。我想要做的是根据优先级将可用产品分配给订单。我的问题是:

  • 每个订单将只收到一种产品。如何根据可用的存在只选择可以接收产品的订单?
  • 为了使程序更有效率,有没有办法在选择产品时存储库存更改,并在程序结束时应用更新?

这两个表都有数千个项目,所以我认为 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 
4

1 回答 1

0

是的,程序将是处理交易的最佳方式。

打开一个游标并用您订购的订单表填充它。当您完成订单时,遍历游标并更新 Inventory 表。

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;
于 2012-06-07T18:31:36.987 回答