Read an Oracle Ref Cursor Dynamically

by Granville Bonyata on November 16, 2013


DECLARE

   v_ref_cursor SYS_REFCURSOR;
 v_cursor_id                  INTEGER;
 v_column_count               NUMBER;
 v_desc_tab                   DBMS_SQL.desc_tab;
 v_fetch                      NUMBER;
   
 v_date_value                 DATE;
 v_number_value               NUMBER;
 v_char_value                 VARCHAR2(4000);
   
BEGIN

   OPEN v_ref_cursor FOR
   SELECT *
     FROM user_tables
    WHERE ROWNUM < 3;      v_cursor_id := DBMS_SQL.to_cursor_number(v_ref_cursor);    DBMS_SQL.describe_columns (v_cursor_id, v_column_count, v_desc_tab);    --Define the header    FOR i IN 1..v_column_count LOOP       DBMS_OUTPUT.PUT_LINE ('Column name: '||v_desc_tab(i).col_name);       DBMS_OUTPUT.PUT_LINE ('Column type: '||v_desc_tab(i).col_type);       DBMS_OUTPUT.PUT_LINE ('Column length: '||v_desc_tab(i).col_max_len);        IF v_desc_tab (i).col_type IN (12,178,179,180,181,231)       THEN       DBMS_SQL.DEFINE_COLUMN (v_cursor_id, i, v_date_value);    ELSIF v_desc_tab (i).col_type IN (2)       THEN       DBMS_SQL.DEFINE_COLUMN (v_cursor_id, i, v_number_value);    ELSE       DBMS_SQL.DEFINE_COLUMN (v_cursor_id, i, v_char_value, 4000);    END IF;     END LOOP; --Read the rows LOOP    v_fetch := DBMS_SQL.FETCH_ROWS (v_cursor_id);    EXIT WHEN v_fetch = 0;        IF v_fetch > 0
      THEN
      FOR i IN 1..v_column_count LOOP
       IF v_desc_tab (i).col_type IN (12,178,179,180,181,231)
          THEN
          DBMS_SQL.COLUMN_VALUE (v_cursor_id, i, v_date_value);
          dbms_output.put_line('v_date_value: '||v_date_value);
       ELSIF v_desc_tab (i).col_type IN (2)
          THEN
          DBMS_SQL.COLUMN_VALUE (v_cursor_id, i, v_number_value);
          dbms_output.put_line('v_number_value: '||v_number_value);
       ELSE
          DBMS_SQL.COLUMN_VALUE (v_cursor_id, i, v_char_value);
          dbms_output.put_line('v_char_value: '||v_char_value);
       END IF;
      
      END LOOP;
  END IF;
END LOOP;

   DBMS_SQL.CLOSE_CURSOR(v_cursor_id);

END;

Previous post:

Next post: