Как задать параметр по умолчанию с типом ассоциативной коллекции?
Создаю тип данных RECORD и с ним создаю ассоциативную коллекцию. Хочу передавать эту коллекцию в процедуру как параметр по умолчанию.
Пробую с NULL, вот упрощённый пример:
declare
type rec is record (a int, b int);
type tab is table of rec index by pls_integer;
procedure proc (t tab default null) is
begin
null; /*
Логика процедуры */
end;
begin
proc;
end;
/
Но компилятор даёт ошибку:
Error report -
ORA-06550: line 5, column 35:
PLS-00382: expression is of the wrong type
Свободный перевод вопроса Can we use a table type parameter as a default null parameter in PLSQL? от участника @Dinidu Hewage
Ответы (1 шт):
TL;DR Ассоциативная коллекция не может быть NULL. При обьявлении она пустая, но не NULL. Из документации:
5.2 Associative Arrays
Like a database table, an associative array:Is empty (but not null) until you populate it
Для параметра по умолчанию можно задать пустую коллекцию. Для ассоциативной коллекции не сушествует функции конструктора, но можно указать любую функцию, которая возвращает пустую коллекцию:
declare
type rec is record (a int, b int);
type tab is table of rec index by pls_integer;
procedure proc (t tab default cast (null as tab)) is
begin null;
if t.count > 0 then null;
/* Логика процедуры */ end if;
end;
function emptytab return tab is
ret tab;
begin return ret; end;
procedure proc2 (t tab default emptytab) is
begin null;
if t.count > 0 then null;
/* Логика процедуры */ end if;
end;
begin null;
end;
/
PL/SQL procedure successfully completed.
Начиная с 19c в качестве конструктора можно использовать Qualified Expressions:
declare
type tab is table of int index by pls_integer;
procedure proc (t tab default tab ()) is
begin null;
if t.count > 0 then null;
/* Логика процедуры */ end if;
end;
begin null;
end;
/
PL/SQL procedure successfully completed.