CREATE OR REPLACE PROCEDURE TEST_DEBUG IS
-- A record type that is used to store the product specific data required by bill_calc.
-- The record is populated in get_portfolio
TYPE prod_rec IS RECORD
(
prod_id NUMBER(10,0),
description VARCHAR2(240)
);
-- A nested table collection of the product records above.
TYPE prod_set IS TABLE OF prod_rec;
TYPE price_rec IS RECORD
(
price_id NUMBER(5,0),
version_id NUMBER(3,0),
amount NUMBER(10,0),
start_date DATE,
end_date DATE
);
-- A nested table collection of the prices for any one product
TYPE price_list IS TABLE OF price_rec;
-- A nested table collection. It stores the sets of all prices for all products
TYPE price_set IS TABLE OF price_list;
CURSOR c_prods
IS
SELECT 123 prod_id, 'Product A' DESCRIPTION FROM DUAL
UNION
SELECT 321 prod_id, 'Product B' DESCRIPTION FROM DUAL;
CURSOR c_prices_1
IS
SELECT 555 price_id, 1 version_id, 1000 amount, DATE '2010-09-01' start_date, DATE '2011-09-01' end_date FROM DUAL
UNION
SELECT 555 price_id, 2 version_id, 1050 amount, DATE '2011-09-01' start_date, DATE '2012-09-01' end_date FROM DUAL
UNION
SELECT 555 price_id, 3 version_id, 1150 amount, DATE '2012-09-01' start_date, NULL end_date FROM DUAL;
CURSOR c_prices_2
IS
SELECT 777 price_id, 1 version_id, 670 amount, DATE '2010-09-01' start_date, DATE '2012-09-01' end_date FROM DUAL
UNION
SELECT 777 price_id, 2 version_id, 700 amount, DATE '2012-09-01' start_date, NULL end_date FROM DUAL;
l_price_list price_list := NEW price_list();
l_my_prods prod_set := NEW prod_set();
l_my_prices price_set := NEW price_set();
l_prod prod_rec;
i NUMBER;
j NUMBER;
BEGIN
-- some code just to populate the structures
FOR prod_rec IN c_prods
LOOP
l_my_prods.EXTEND;
l_my_prods(l_my_prods.LAST) := prod_rec;
END LOOP;
FOR price_list IN c_prices_1
LOOP
l_price_list.EXTEND;
l_price_list(l_price_list.LAST) := price_list;
END LOOP;
l_my_prices.EXTEND;
l_my_prices(1) := l_price_list;
l_price_list.DELETE;
FOR price_list IN c_prices_2
LOOP
l_price_list.EXTEND;
l_price_list(l_price_list.LAST) := price_list;
END LOOP;
l_my_prices.EXTEND;
l_my_prices(2) := l_price_list;
-- end of population
i := l_my_prods.FIRST;
WHILE i IS NOT NULL
LOOP
DBMS_OUTPUT.PUT_LINE('Product: ' || i || ' - ' || l_my_prods(i).prod_id || ' - ' || l_my_prods(i).description);
j := l_my_prices(i).FIRST;
WHILE j IS NOT NULL
LOOP
DBMS_OUTPUT.PUT_LINE(' Product Price: ' || l_my_prices(i)(j).price_id || ' - ' || l_my_prices(i)(j).version_id
|| ' - ' || l_my_prices(i)(j).amount || ' - ' || l_my_prices(i)(j).start_date);
j := l_my_prices(i).NEXT(j);
END LOOP;
i := l_my_prods.NEXT(i);
END LOOP;
END;
/