sqloracle-databaseplsqlsys-refcursor

Best way to check if SYS_REFCURSOR is empty


I have a cursor with values from a select and i want to do something after depending if i had any row found or none.

recs_Table SYS_REFCURSOR;

begin

    open recs_Table for
       select * from table1, table2;


    if recs_Table%found then
        --do this
    else
        --do that
    end if;

end;

This doesnt seem to work, any help?Ty


Solution

  • You need to execute a FETCH against the cursor prior to using the %FOUND attribute. Change your code to something like

    DECLARE
      recs_Table SYS_REFCURSOR;
      nTable_1_value  NUMBER;
      nTable_2_value  NUMBER;
    begin
    
        open recs_Table for
           select * from table1, table2;
    
    
        FETCH recs_Table INTO nTable_1_value, nTable_2_value;
    
        if recs_Table%found then
            --do this
        else
            --do that
        end if;
    
    end;
    

    Note that the way you'll probably need to add variables to the INTO clause of the FETCH statement, one for each column in TABLE1 and TABLE2. Note also that the way this cursor is written you'll probably get more rows returned than you might expect; because there is no join criteria specified you'll get what's called a Cartesian join, where each row in TABLE1 is joined to each row in TABLE2 - thus, the number of rows you'll get back is (# of rows in TABLE1) * (# of rows in TABLE2).

    A potentially simpler way to do this would be to use a cursor FOR loop, as follows:

    DECLARE
      bData_found  BOOLEAN := FALSE;
    begin
      FOR aRow IN (select * from table1, table2)
      LOOP
        -- If the program gets here, it means a row was fetched
    
        -- do this
    
        bData_found := TRUE;
    
        EXIT;  -- if you only care if data was found and don't want to 
               -- process all the rows
      END LOOP;
    
      IF NOT bData_found THEN
        -- do that
      END IF;
    end;
    

    Share and enjoy.