home *** CD-ROM | disk | FTP | other *** search
- rem
- rem $Header: examp14.sql,v 1002100.1 89/03/29 14:32:21 rcs Exp $ examp14.sql Copyr (c) 1989 Oracle
- rem
- rem V6PLS10021,DISK$DEV9:[PLS.DEMO.10021]
- /*
- ** This block accumulates 1000 units of part number 5469 from various bins.
- ** Each bin contains units of only one part number. The block goes through
- ** each bin that contains units of the desired part number, removing all
- ** the units in that bin until it has 1000 units.
- **
- ** Copyright (c) 1989 by Oracle Corporation
- */
- DECLARE
- CURSOR bin_cur(part_number NUMBER) IS SELECT amt_in_bin FROM bins
- WHERE part_num = part_number AND
- amt_in_bin > 0
- ORDER BY bin_num
- FOR UPDATE OF amt_in_bin;
- bin_amt bins.amt_in_bin%TYPE;
- total_so_far NUMBER(5) := 0;
- AMOUNT_NEEDED CONSTANT NUMBER(5) := 1000;
- bins_looked_at NUMBER(3) := 0;
- BEGIN
- OPEN bin_cur(5469);
- WHILE total_so_far < AMOUNT_NEEDED LOOP
- FETCH bin_cur INTO bin_amt;
- EXIT WHEN bin_cur%NOTFOUND;
- /* If we exit, there's not enough to *
- * satisfy the order. */
- bins_looked_at := bins_looked_at + 1;
- IF total_so_far + bin_amt < AMOUNT_NEEDED THEN
- UPDATE bins SET amt_in_bin = 0
- WHERE CURRENT OF bin_cur;
- -- take everything in the bin
- total_so_far := total_so_far + bin_amt;
- ELSE -- we finally have enough
- UPDATE bins SET amt_in_bin = amt_in_bin
- - (AMOUNT_NEEDED - total_so_far)
- WHERE CURRENT OF bin_cur;
- total_so_far := AMOUNT_NEEDED;
- END IF;
- END LOOP;
- CLOSE bin_cur;
- INSERT INTO temp VALUES (null, bins_looked_at, '<- bins looked at');
- COMMIT;
- END;
- /
-