0

私は数日間問題に苦しんでいます。Oracle DB(10g)にいくつかのテーブルがあります。1つは優先度でソートされた注文のリストを示し、もう1つは製品の在庫を示しています。私がやりたいのは、優先順位に基づいて利用可能な製品を注文に割り当てることです。私の質問は次のとおりです。

  • 各注文は1つの製品のみを受け取ります。利用可能な存在に基づいて、製品を受け取ることができる注文のみを選択するにはどうすればよいですか?
  • 手順をより効率的にするために、製品を選択しながら在庫の変更を保存し、手順の最後に更新を適用する方法はありますか?

どちらのテーブルにも数千の項目があるため、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

うん、手順はトランザクションを処理するための最良の方法でしょう。

カーソルを開き、注文した注文テーブルを入力します。カーソルをループして、注文を処理するときに在庫テーブルを更新します。

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 に答える