Запись не является коллекцией, поэтому ваше объяснение слегка запутано. Из документов (которые вы, вероятно, уже просматривали:
В коллекции внутренние компоненты всегда имеют один и тот же тип данных и называются элементами . ... Чтобы создать переменную коллекции, нужно либо определить тип коллекции, а затем создать переменную этого типа или использовать %TYPE
.
В записи внутренние компоненты могут иметь разные типы данных и называются полями . Вы можете получить доступ к каждому полю переменной записи по его имени ... Чтобы создать переменную записи, вы должны либо определить тип RECORD
, а затем создать переменную этого типа или использовать %ROWTYPE
или %TYPE
.
Итак, глядя на то, что вы сказали:
Вот то, что, как я считаю, здесь заявлено:
TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
Это запись , а не коллекция. В этом случае у него есть одно поле с именем gla_sub
, которое действительно объявляется с использованием типа данных столбца id
из таблицы tblName
. Использование %type
означает, что в некоторой степени вам не нужно знать, что на самом деле является типом данных, и вам, возможно, не придется менять свой код, если он изменяется (если размер столбца varchar2
равен например, увеличился).
v_closes_sc array_rec_type;
Правильно - создается переменная вновь созданного типа.
TYPE v_sc_type is TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;
- это коллекция, а именно ассоциативный массив . Это разреженный массив, члены которого являются экземпляром типа записи, объявленного выше, с числовым индексом. Это также может быть объявлено с использованием типа напрямую, как:
TYPE v_sc_type is TABLE OF array_rec_type INDEX BY BINARY_INTEGER;
sc_array v_sc_type;
Правильно - создается новая переменная этого только что объявленного типа таблицы.
Наличие типа записи с одним полем кажется немного бессмысленным, так как вы можете иметь коллекцию, основанную на типе данных столбца таблицы. Ваш существующий код будет ожидать этой структуры, поэтому ее изменение не совсем тривиально.