Cursor Oracle PLSQL

SQL>
SQL> set serveroutput on format wrapped
SQL>
SQL> CREATE TABLE MyTable (
  2    num_col    NUMBER,
  3    char_col   VARCHAR2(60)
  4    );
Table created.
SQL>
SQL>
SQL> DECLARE
  2    TYPE t_Numbers IS TABLE OF MyTable.num_col%TYPE;
  3    TYPE t_Strings IS TABLE OF MyTable.char_col%TYPE;
  4    v_Numbers t_Numbers := t_Numbers(1);
  5    v_Strings t_Strings := t_Strings(1);
  6    v_Numbers2 t_Numbers;
  7    v_Strings2 t_Strings;
  8
  9    CURSOR c_char IS
 10      SELECT char_col
 11      FROM MyTable
 12      WHERE num_col > 800
 13      ORDER BY num_col;
 14
 15  BEGIN
 16    v_Numbers.EXTEND(1500);
 17    v_Strings.EXTEND(1500);
 18    FOR v_Count IN 1..1000 LOOP
 19      v_Numbers(v_Count) := v_Count;
 20      v_Strings(v_Count) := 'Element #' || v_Count;
 21      IF v_Count > 500 THEN
 22        v_Numbers(v_Count + 500) := v_Count;
 23        v_Strings(v_Count + 500) := 'Element #' || v_Count;
 24      END IF;
 25    END LOOP;
 26
 27    DELETE FROM MyTable;
 28    FORALL v_Count IN 1..1500
 29      INSERT INTO MyTable (num_col, char_col)
 30        VALUES (v_Numbers(v_Count), v_Strings(v_Count));
 31
 32    SELECT num_col, char_col
 33      BULK COLLECT INTO v_Numbers, v_Strings
 34      FROM MyTable
 35      ORDER BY num_col;
 36
 37    DBMS_OUTPUT.PUT_LINE(
 38      'First query fetched ' || v_Numbers.COUNT || ' rows');
 39
 40    SELECT num_col
 41      BULK COLLECT INTO v_Numbers2
 42      FROM MyTable;
 43
 44    DBMS_OUTPUT.PUT_LINE(
 45      'Second query fetched ' || v_Numbers2.COUNT || ' rows');
 46
 47    OPEN c_char;
 48    FETCH c_char BULK COLLECT INTO v_Strings2;
 49    CLOSE c_char;
 50
 51    DBMS_OUTPUT.PUT_LINE(
 52      'Cursor fetch retrieved ' || v_Strings2.COUNT || ' rows');
 53
 54  END;
 55  /
First query fetched 1500 rows
Second query fetched 1500 rows
Cursor fetch retrieved 400 rows
PL/SQL procedure successfully completed.
SQL>
SQL> DECLARE
  2    TYPE t_Numbers IS TABLE OF MyTable.num_col%TYPE
  3      INDEX BY BINARY_INTEGER;
  4    TYPE t_Strings IS TABLE OF MyTable.char_col%TYPE
  5      INDEX BY BINARY_INTEGER;
  6    v_Numbers t_Numbers;
  7    v_Strings t_Strings;
  8  BEGIN
  9    DELETE FROM MyTable;
 10    FOR v_Outer IN 1..10 LOOP
 11      FOR v_Inner IN 1..v_Outer LOOP
 12        INSERT INTO MyTable (num_col, char_col)
 13          VALUES (v_Outer, 'Element #' || v_Inner);
 14      END LOOP;
 15      v_Numbers(v_Outer) := v_Outer;
 16    END LOOP;
 17
 18    FORALL v_Count IN 1..5
 19      DELETE FROM MyTable
 20        WHERE num_col = v_Numbers(v_Count)
 21        RETURNING char_col BULK COLLECT INTO v_Strings;
 22
 23    DBMS_OUTPUT.PUT_LINE('After delete:');
 24    FOR v_Count IN 1..v_Strings.COUNT LOOP
 25      DBMS_OUTPUT.PUT_LINE(
 26        '  v_Strings(' || v_Count || ') = ' || v_Strings(v_Count));
 27    END LOOP;
 28  END;
 29  /
After delete:
  v_Strings(1) = Element #1
  v_Strings(2) = Element #1
  v_Strings(3) = Element #2
  v_Strings(4) = Element #1
  v_Strings(5) = Element #2
  v_Strings(6) = Element #3
  v_Strings(7) = Element #1
  v_Strings(8) = Element #2
  v_Strings(9) = Element #3
  v_Strings(10) = Element #4
  v_Strings(11) = Element #1
  v_Strings(12) = Element #2
  v_Strings(13) = Element #3
  v_Strings(14) = Element #4
  v_Strings(15) = Element #5
PL/SQL procedure successfully completed.
SQL>
SQL> select * from MyTable;
   NUM_COL CHAR_COL
---------- ------------------------------------------------------------
         6 Element #1
         6 Element #2
         6 Element #3
         6 Element #4
         6 Element #5
         6 Element #6
         7 Element #1
         7 Element #2
         7 Element #3
         7 Element #4
         7 Element #5
   NUM_COL CHAR_COL
---------- ------------------------------------------------------------
         7 Element #6
         7 Element #7
         8 Element #1
         8 Element #2
         8 Element #3
         8 Element #4
         8 Element #5
         8 Element #6
         8 Element #7
         8 Element #8
         9 Element #1
   NUM_COL CHAR_COL
---------- ------------------------------------------------------------
         9 Element #2
         9 Element #3
         9 Element #4
         9 Element #5
         9 Element #6
         9 Element #7
         9 Element #8
         9 Element #9
        10 Element #1
        10 Element #2
        10 Element #3
   NUM_COL CHAR_COL
---------- ------------------------------------------------------------
        10 Element #4
        10 Element #5
        10 Element #6
        10 Element #7
        10 Element #8
        10 Element #9
        10 Element #10
40 rows selected.
SQL>
SQL> drop table MyTable;
Table dropped.
SQL>