ORA-06533 is raised when PL/SQL code reads or writes a nested table or varray element whose index is greater than the collection's current number of elements. These collections grow only through EXTEND, so element 3 of a two-element collection does not exist yet, even for assignment. The predefined exception is SUBSCRIPT_BEYOND_COUNT. Extend the collection before assigning, and check COUNT or EXISTS before reading.
Reproduce the Error
Example:
declare type num_list is table of number; v_list num_list := num_list(10, 20); begin v_list(3) := 30; end; / declare type num_list is table of number; v_list num_list := num_list(10, 20); begin dbms_output.put_line(v_list(3)); end; /
Output:
declare * ERROR at line 1: ORA-06533: Subscript beyond count ORA-06512: at line 5 declare * ERROR at line 1: ORA-06533: Subscript beyond count ORA-06512: at line 5
Writing and reading element 3 both fail, because the collection has two elements.
Fix: EXTEND First, and Check Before Reading
Example:
set serveroutput on
declare
type num_list is table of number;
v_list num_list := num_list(10, 20);
begin
v_list.extend; -- make room for element 3
v_list(3) := 30;
for i in 1 .. v_list.count loop
dbms_output.put_line(i || ': ' || v_list(i));
end loop;
if v_list.exists(4) then
dbms_output.put_line(v_list(4));
else
dbms_output.put_line('No element 4');
end if;
end;
/Output:
1: 10 2: 20 3: 30 No element 4 PL/SQL procedure successfully completed.
EXTEND adds element 3, the loop stays within 1 to COUNT, and EXISTS tests an index without raising an error.
Associative Arrays Behave Differently
An associative array has no count limit: any index can be assigned, and reading a missing one raises NO_DATA_FOUND:
Example:
-- an associative array has no count limit: a missing key raises NO_DATA_FOUND instead declare type num_map is table of number index by pls_integer; v_map num_map; begin v_map(1) := 10; v_map(100) := 30; -- allowed, no EXTEND needed dbms_output.put_line(v_map(2)); end; /
Output:
declare * ERROR at line 1: ORA-01403: no data found ORA-06512: at line 7
Things to Know
- EXTEND(n) adds n elements at once, which is faster than one EXTEND per element in a loop.
- After DELETE of single elements, a nested table has gaps; loop with FIRST and NEXT instead of 1 to COUNT.
Related Guides
Conclusion
ORA-06533 means an index above the collection's COUNT. Call EXTEND before assigning new elements, loop within COUNT, and use EXISTS to test an index safely.
