home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a524 / 37.ddi / demo / examp14.sql < prev    next >
Encoding:
Text File  |  1991-03-04  |  1.7 KB  |  48 lines

  1. rem 
  2. rem $Header: examp14.sql,v 1002100.1 89/03/29 14:32:21 rcs Exp $ examp14.sql Copyr (c) 1989 Oracle
  3. rem 
  4. rem V6PLS10021,DISK$DEV9:[PLS.DEMO.10021]
  5. /*
  6. ** This block accumulates 1000 units of part number 5469 from various bins.
  7. ** Each bin contains units of only one part number.  The block goes through
  8. ** each bin that contains units of the desired part number, removing all
  9. ** the units in that bin until it has 1000 units.
  10. **
  11. ** Copyright (c) 1989 by Oracle Corporation
  12. */
  13. DECLARE
  14.     CURSOR bin_cur(part_number NUMBER) IS SELECT amt_in_bin FROM bins
  15.         WHERE part_num = part_number AND 
  16.             amt_in_bin > 0
  17.             ORDER BY bin_num
  18.             FOR UPDATE OF amt_in_bin;
  19.     bin_amt        bins.amt_in_bin%TYPE;
  20.     total_so_far    NUMBER(5) := 0;
  21.     AMOUNT_NEEDED    CONSTANT NUMBER(5) := 1000;
  22.     bins_looked_at    NUMBER(3) := 0;
  23. BEGIN
  24.     OPEN bin_cur(5469);
  25.     WHILE total_so_far < AMOUNT_NEEDED LOOP
  26.         FETCH bin_cur INTO bin_amt;
  27.         EXIT WHEN bin_cur%NOTFOUND;
  28.              /* If we exit, there's not enough to *
  29.               * satisfy the order.                */
  30.         bins_looked_at := bins_looked_at + 1;
  31.         IF total_so_far + bin_amt < AMOUNT_NEEDED THEN
  32.             UPDATE bins SET amt_in_bin = 0
  33.                 WHERE CURRENT OF bin_cur;  
  34.                     -- take everything in the bin
  35.             total_so_far := total_so_far + bin_amt;
  36.         ELSE        -- we finally have enough
  37.             UPDATE bins SET amt_in_bin = amt_in_bin
  38.                 - (AMOUNT_NEEDED - total_so_far)
  39.                 WHERE CURRENT OF bin_cur;
  40.             total_so_far := AMOUNT_NEEDED;
  41.         END IF;
  42.     END LOOP;
  43.     CLOSE bin_cur;
  44.     INSERT INTO temp VALUES (null, bins_looked_at, '<- bins looked at');
  45.     COMMIT;
  46. END;
  47. /
  48.