== Why is this an issue?

The ``++FOR++`` loop at first seems like a convenient way of iterating over the elements of a collection, but doing so will raise a ``++VALUE_ERROR++`` exception if the collection is empty. Looping instead from 1 to ``++COUNT++`` doesn't work either if the collection is sparse; that leads to a ``++ORA-01403: no data found++`` error. 


Instead, a ``++WHILE++`` loop should be used.


=== Noncompliant code example

[source,sql]
----
DECLARE
  TYPE fooType IS TABLE OF VARCHAR2(42);
  foo fooType := new fooType('Strawberry', 'Apple', 'Banana');
BEGIN
  foo.DELETE(2);                                -- The collection is now sparse

  FOR i IN 1 .. foo.COUNT                       -- Noncompliant - leads to ORA-01403: no data found
  LOOP
    DBMS_OUTPUT.PUT_LINE(i || ' = ' || foo(i));
  END LOOP;
END;
/
----


=== Compliant solution

[source,sql]
----
DECLARE
  TYPE fooType IS TABLE OF VARCHAR2(42);
  foo fooType := new fooType('Strawberry', 'Apple', 'Banana');
  i PLS_INTEGER;
BEGIN
  foo.DELETE(2);                                -- The collection is now sparse

  i := foo.FIRST;

  WHILE (i IS NOT NULL)                         -- Compliant - works as expected
  LOOP
    DBMS_OUTPUT.PUT_LINE(i || ' = ' || foo(i));
    i := foo.NEXT(i);
  END LOOP;
END;
/
----

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Use a "WHILE" loop instead.


endif::env-github,rspecator-view[]
