2015-10-22 1 views
1

Я пытаюсь использовать функцию 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 

Спасибо за любую помощь.

ответ

1

Первая проблема заключается в том, что вы не можете передать таблицу в параметр, используя свой псевдоним. Даже не имеет смысла пытаться это сделать.

Следующий вопрос заключается в том, как получить столбец mynum, который возвращается из table(l_numTypes) в правильный формат для передачи в testNumberPackage.ReturnNum, так как он из NUMBER типа данных, а функция ожидает параметр numtype.

Для этого вам необходимо передать объект с этой колонкой, например: numtype(n.mynum).

следующие работы для меня:

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(numtype(n.mynum))) into l_count from table(l_numTypes) n; --causes the error 

    dbms_output.put_line(l_count); 
end; 
/

5050 

Ясно, как грязи?

+0

Это работает в этом случае, но немного сложно всегда перестраивать тип, когда тип может иметь десятки атрибутов. Невозможно использовать numtype, который уже сохранен в таблице l_numTypes? – Coat

+0

Зачем вам нужно использовать numtype? Выполняя таблицу (l_numtypes), вы в основном преобразуете массив в таблицу, в которой есть столбцы, как определено в записи/объекте, на котором основан массив. Вы пропустили необходимость вообще ссылаться на тип записи. Я думаю, вы можете переусердствовать? Почему бы просто не обратиться непосредственно к столбцу mynum, как это было в предыдущей инструкции select? – Boneist

+0

В этом случае функция testNumberPackage.ReturnNum не сильно влияет на переданный объект, но вы можете представить себе ситуацию, когда функция будет передавать объект и использовать множество атрибутов или функций объектов для выполнения сложного вычисления. – Coat

Смежные вопросы