Using exception handling in a Loop w/ Cursor

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Beeb
    New Member
    • May 2010
    • 4

    Using exception handling in a Loop w/ Cursor

    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.
    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;
    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.
    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;
    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
        
      --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;
  • Beeb
    New Member
    • May 2010
    • 4

    #2
    Never mind I figured it out. Here's my code incase anyone has the same question
    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=1
        ORDER BY inv_id;
      output orderlist%ROWTYPE;
      error EXCEPTION;
    BEGIN
      OPEN orderlist;
      LOOP
        FETCH orderlist INTO output;
        IF orderlist%NOTFOUND
          THEN
             RAISE error;
          END IF;
        DBMS_OUTPUT.PUT_LINE(output.inv_id || ' ' || output.item_id || ' ' || output.item_desc || ' ' || output.inv_price);
      END LOOP;
      CLOSE orderlist;
      EXCEPTION
       WHEN error THEN
        DBMS_OUTPUT.PUT_LINE('Invalid Item ID');
    END;

    Comment

    Working...