Я пытаюсь использовать функцию sum с функцией пакета, но работает с ошибкой «недопустимый идентификатор». Вот несколько примеров кода с помощью функции, вызывающей ошибки откомментировалНедопустимый идентификатор при попытке использовать функцию пакета в выражении суммирования
create or replace type numType as object
(
myNum number
)
;
/
create or replace type numTypes is table of numType;
/
create or replace package testNumberPackage as
function ReturnNum(in_numType numType) return number;
end;
/
create or replace package body testNumberPackage as
function ReturnNum(in_numType numType) return number is
begin
return in_numType.myNum;
end;
end;
/
declare l_numTypes numTypes;
l_count number;
begin
l_numTypes := numTypes();
for i in 1 .. 100 loop
l_numTypes.extend(1);
l_numTypes(l_numTypes.last) := numType(i);
end loop;
select sum(n.myNum) into l_count from table(l_numTypes) n;
select sum(testNumberPackage.ReturnNum(n)) into l_count from table(l_numTypes) n; --causes the error
dbms_output.put_line(l_count);
end;
/
Точная ошибка для этого кода
ORA-06550: line 11, column 42
PL/SQL: ORA-00904: "N": invalid identifier
ORA-6550: line 11, column 3:
PL/SQL: SQL Statement ignored
Спасибо за любую помощь.
Это работает в этом случае, но немного сложно всегда перестраивать тип, когда тип может иметь десятки атрибутов. Невозможно использовать numtype, который уже сохранен в таблице l_numTypes? – Coat
Зачем вам нужно использовать numtype? Выполняя таблицу (l_numtypes), вы в основном преобразуете массив в таблицу, в которой есть столбцы, как определено в записи/объекте, на котором основан массив. Вы пропустили необходимость вообще ссылаться на тип записи. Я думаю, вы можете переусердствовать? Почему бы просто не обратиться непосредственно к столбцу mynum, как это было в предыдущей инструкции select? – Boneist
В этом случае функция testNumberPackage.ReturnNum не сильно влияет на переданный объект, но вы можете представить себе ситуацию, когда функция будет передавать объект и использовать множество атрибутов или функций объектов для выполнения сложного вычисления. – Coat