0

アカウントを調整するために API (クライアントが提供) を呼び出すために使用している次の PL/SQL コードがあります。

このブロックを書く際に何か問題があったり、より良い方法やアプローチがあれば、コードを改善したいと思います。

PS 残念ながら、私たちのクライアントはまだ製品に Oracle 8i を使用しています。

PLSQLコード

DECLARE
    v_account_id account_adjustments.account_id%TYPE;
    v_adj_no     account_adjustments.adj_no%TYPE;
    v_old_qty    product_warehouse.new_qty%TYPE;
    v_new_qty    product_warehouse.new_qty%TYPE;
BEGIN
    v_old_qty := NULL;
    v_new_qty := NULL;

    FOR acnt IN (SELECT *
                 FROM   temp_table a) LOOP
        SELECT a.new_qty
        INTO   v_old_qty
        FROM   product_warehouse a
        WHERE  ( a.product_no = acnt.product_no );

        Adjust_accounts (in_service_product_no => acnt.product_no,
                         in_service_qty => acnt.qty,
                         out_account_id => v_account_id,
                         out_adj_no => v_adj_no);

        SELECT b.new_qty
        INTO   v_new_qty
        FROM   product_warehouse b
        WHERE  ( b.product_no = acnt.product_no );

        INSERT INTO account_year_todate
                    (product_no,
                     account_id,
                     adj_no,
                     qty_bad,
                     qty_warehouse,
                     qty_factory)
        VALUES      ( acnt.product_no,
                     v_account_id,
                     v_adj_no,
                     acnt.qty,
                     v_old_qty,
                     v_new_qty );
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
      dbms_output.Put_line ('exceptions '
                            || SQLERRM);

      ROLLBACK;
END; 
4

1 に答える 1

1

変更すべき点:

  • SELECT *For ループ カーソルを、実際に必要な列に置き換えます。
  • あなたの例外ブロックは、私がサイレントキラーと呼んでいるものです。例外をログに記録せず、再発生させないため、例外を抑制する以外は何もしないため、デバッグの悪夢です。代わりに、すべての例外をput_lineバッファにリダイレクトするだけです。常にバッファ出力を表示する IDE からプログラムを実行するか、SQL*Plus を介してプログラムを実行します。適切なログ システムに変更します。
  • 何が何を意味するのかわかりAdjust_accountsません。おそらく、これら 2 つの select ステートメントを減らして、呼び出しているストアド プロシージャを使用して金額を返すことができますか?
于 2012-08-13T07:12:39.020 に答える