I'm trying to use an exception handler when the select statement tries to access an invalid item_id. I tried and with this code, it runs but throws nothing. I later found out that cursor will make it run regards if no rows are returned.
Then I did some searching and tried to initiate a count for the loop and if nothing throw the handler but no luck. Error that keeps popping up is the last line. It says it notice ";" but expect LOOP.
So I research again and found out that works with for loops and it works but how do I output the data from the table if I place a correct value for item_id
Code:
DECLARE
CURSOR orderlist IS
SELECT distinct inv_id, b.item_id, item_desc, inv_price
FROM inventory a, item b
WHERE a.item_id=b.item_id AND b.item_id=10
ORDER BY inv_id;
output orderlist%ROWTYPE;
BEGIN
OPEN orderlist;
LOOP
BEGIN
FETCH orderlist INTO output;
EXIT WHEN orderlist%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(output.inv_id || ' ' || output.item_id || ' ' || output.item_desc || ' ' || output.inv_price);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('test');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM');
END;
END LOOP;
CLOSE orderlist;
END;
Code:
DECLARE
CURSOR orderlist IS
SELECT distinct inv_id, b.item_id, item_desc, inv_price
FROM inventory a, item b
WHERE a.item_id=b.item_id AND b.item_id=10
ORDER BY inv_id;
output orderlist%ROWTYPE;
cnt NUMBER;
BEGIN
OPEN orderlist;
cnt := 0;
LOOP
BEGIN
FETCH orderlist INTO output;
EXIT WHEN orderlist%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(output.inv_id || ' ' || output.item_id || ' ' || output.item_desc || ' ' || output.inv_price);
cnt := cnt + 1;
END LOOP;
CLOSE orderlist;
IF cnt = 0 THEN
DBMS_OUTPUT.PUT_LINE('NOTHING FOUND');
END IF;
END;
Code:
DECLARE
--CURSOR orderlist IS
--output orderlist%ROWTYPE;
cnt NUMBER;
BEGIN
--OPEN orderlist;
cnt := 0;
FOR x IN (SELECT distinct inv_id, b.item_id, item_desc, inv_price
FROM inventory a, item b
WHERE a.item_id=b.item_id AND b.item_id=10
ORDER BY inv_id)
LOOP
--BEGIN
--FETCH orderlist INTO output;
--EXIT WHEN orderlist%NOTFOUND;
--DBMS_OUTPUT.PUT_LINE(output.inv_id || ' ' || output.item_id || ' ' || output.item_desc || ' ' || output.inv_price);
cnt := cnt + 1;
END LOOP;
--CLOSE orderlist;
IF cnt = 0 THEN
DBMS_OUTPUT.PUT_LINE('NOTHING FOUND');
END IF;
END;
Comment