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>