Очень интересно. Не найдено «значение» для 18+, но в 12c вы получаете NULL
.
Я немного сжал твой код:
declare
type TArrNotNull IS table of varchar2(100) NOT NULL;
arrNotNull TArrNotNull := TArrNotNull(1, 2, 3);
begin
begin
arrNotNull(2) := to_number(NULL); -- will throw, because null is not allowed
dbms_output.put_line('arrNotNull(2) is null now');
exception
WHEN others THEN
dbms_output.put_line('arrNotNull(2) couldn''t be set to null');
end;
arrNotNull.Extend;
dbms_output.put_line('arrNotNull(4): >>>' || nvl(arrNotNull(4), 'NULL') || '<<<');
end;
Результат в 12c:
arrNotNull(2) couldn't be set to null
arrNotNull(4): >>>NULL<<<
Результат в 18с (такой же как у тебя):
arrNotNull(2) couldn't be set to null
arrNotNull(4): >>><<<
Также интересно, что расширение на обнуляемое значение Table of
имеет значение NULL в качестве значения по умолчанию:
declare
type TArrNotNull IS table of varchar2(100);
arrNotNull TArrNotNull := TArrNotNull(1, 2, 3);
begin
arrNotNull.Extend;
dbms_output.put_line('arrNotNull(4): >>>' || nvl(arrNotNull(4), 'NULL') || '<<<');
end;
Результат на всех версиях:
arrNotNull(4): >>>NULL<<<