0

ここで問題が発生しました。私は2つのテーブルpp_gabunganjharga. Jhargaは予算の値pp_gabunganを保存するために使用されますが、書籍の調達のデータを保存するために使用されます。カーソルを使用してテーブルのeksフィールドを自動的に更新する必要があります。pp_gabunganたとえば、 を含む合計価格sum of (eks*harga)が 未満でbudgetある限り、eks フィールドの値を 1 増やす必要があります。しかし問題は、このコードは機能しますが、更新は 1 回だけです。sum(eks*harga)が 未満である限り、インクリメントを停止すべきではありませんbudget。ループを追加する必要があるかどうか助けてもらえますか? はいの場合..どうあるべきですか?これが私のコードです:

DECLARE
bb jharga.budget%type;
tharga jharga.budget%type;

 CURSOR eksupdate IS
   SELECT 
isbn,judul,frekuensi,stok,harga,prioritas,eks,kelompok,bobot
   FROM  pp_gabungan 
   FOR UPDATE OF eks NOWAIT;
   autoeks eksupdate%ROWTYPE;
BEGIN
   OPEN eksupdate;   -- rows are locked.
   select budget into bb from jharga;
   select sum(eks*harga) into tharga from pp_gabungan;
     LOOP
       FETCH eksupdate INTO autoeks;      
       --EXIT WHEN eksupdate%NOTFOUND;
       tharga:=(autoeks.eks*autoeks.harga);
      IF  tharga <= bb  THEN
         UPDATE pp_gabungan 
          SET eks = autoeks.eks+1
          WHERE CURRENT OF eksupdate ;
       END IF;
       exit when tharga > bb;
     END LOOP;
     --COMMIT;  -- rows are unlocked.
   CLOSE eksupdate;
end;
4

1 に答える 1

0

あなたの要件を正しく理解している場合は、すべての行の合計が予算内であるeks限り、すべての行の列を 1ずつ増やしてください。eks*harga最初のパスの後、まだ予算が残っている場合は、プロセスを最初からやり直したいと考えています。

FORこの構文に慣れているので、ループを使用してカーソルを開くように変更しました。

DECLARE
  bbs       jharga.budget%TYPE;
  tharga    jharga.budget%TYPE;
  balance   NUMBER;

  CURSOR eksupdate
  IS
     SELECT        isbn, judul, frekuensi, stok, harga, prioritas, eks,
                   kelompok, bobot
              FROM pp_gabungan
     FOR UPDATE OF eks NOWAIT;
BEGIN
  --get the allotted budget
  SELECT budget
    INTO bbs
    FROM jharga;

  --get the total amount
  SELECT SUM (eks * harga)
    INTO tharga
    FROM pp_gabungan;

  balance := bbs - tharga;                              -- the balance amount

  --as long as the balance is more than zero , the cusor will be repeatedly called.
  -- also note that i've given a name to the loop, loop1
  <<loop1>>
  WHILE balance > 0
  LOOP

     --for loop to open/fetch the cursor, this has been given name loop2
     <<loop2>>
     FOR i IN eksupdate
     LOOP
        --if the balance amount is less than that of harga, exit from both the loops
        EXIT loop1 WHEN balance < i.harga;

        --if balance amount is more than harga, update the eks by 1
        UPDATE pp_gabungan
           SET eks = autoeks.eks + 1
         WHERE CURRENT OF eksupdate;

        --decrease the balance by harga
        balance := balance - i.harga;
     END LOOP loop2;
  END LOOP loop1;

  COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
     ROLLBACK;
     DBMS_OUTPUT.put_line (SQLERRM);
END;
于 2013-06-03T06:36:42.257 に答える