Вы можете использовать цикл WHILE
с FIRST
, NEXT
, LAST
для обработки разреженных коллекций (где элементы были удалены), а также вам необходимо проверить наличие неинициализированных элементов в коллекции:
PROCEDURE SOME_PROCEDURE(
I_OBJECT IN C_SOME_OBJECT
)
IS
i PLS_INTERGER;
BEGIN
-- Check that the collection is not NULL
IF I_OBJECT IS NULL THEN
RETURN;
END IF;
i := I_OBJECT.FIRST;
WHILE i IS NOT NULL LOOP
IF I_OBJECT(i) IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE( i || ' = (' I_OBJECT(i).attr1 || ', ' || I_OBJECT(i).attr2 || ')' );
ELSE
DBMS_OUTPUT.PUT_LINE( i || ' IS NULL' );
END;
END LOOP;
END;
/
Тогда вы можете назвать это:
DECLARE
o C_SOME_OBJECT := C_SOME_OBJECT();
BEGIN
o.EXTEND(4);
o(1) := SOME_OBJECT( '1.1', '1.2' );
-- o(2) IS NULL
o.DELETE(3); -- o(3) has been removed
o(4) := SOME_OBJECT( '4.1', '4.2' );
SOME_PROCEDURE( o );
END;
/
Выходы:
1 = (1.1, 1.2)
2 IS NULL
4 = (4.1, 4.2)
Проблемы с FOR ... LOOP
:
Использование FOR i IN 1 .. o.COUNT LOOP
:
DECLARE
o C_SOME_OBJECT := C_SOME_OBJECT(
SOME_OBJECT( '1.1', '1.2' ),
SOME_OBJECT( '2.1', '2.2' ),
SOME_OBJECT( '3.1', '3.2' ),
SOME_OBJECT( '4.1', '4.2' )
);
BEGIN
o.DELETE(1);
FOR i IN 1 .. o.COUNT LOOP
IF I_OBJECT(i) IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE( i || ' = (' I_OBJECT(i).attr1 || ', ' || I_OBJECT(i).attr2 || ')' );
ELSE
DBMS_OUTPUT.PUT_LINE( i || ' IS NULL' );
END;
END LOOP;
END;
/
Выходы:
1 IS NULL
2 = (2.1, 2.2)
3 = (3.1, 3.2)
Выводит элемент 1, который не существует, и не выводит элемент 4, который существует.
Использование FOR i IN o.FIRST .. o.LAST LOOP
:
DECLARE
o C_SOME_OBJECT := C_SOME_OBJECT(
SOME_OBJECT( '1.1', '1.2' ),
SOME_OBJECT( '2.1', '2.2' ),
SOME_OBJECT( '3.1', '3.2' ),
SOME_OBJECT( '4.1', '4.2' )
);
BEGIN
o.DELETE(2);
FOR i IN o.FIRST .. o.LAST LOOP
IF I_OBJECT(i) IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE( i || ' = (' I_OBJECT(i).attr1 || ', ' || I_OBJECT(i).attr2 || ')' );
ELSE
DBMS_OUTPUT.PUT_LINE( i || ' IS NULL' );
END;
END LOOP;
END;
/
Выходы:
1 = (1.1, 1.2)
2 IS NULL
3 = (3.1, 3.2)
4 = (4.1, 4.2)
Это выводит 4 элемента (включая удаленный 2-й элемент), когда o.COUNT
составляет только 3.