Функции Oracle-PL/SQL с вложенной таблицей возвращаемого типа. Тип ошибки неполный или неверный

CREATE TYPE dname AS OBJECT
(
  depno      NUMBER,
  cnt_dname  NUMBER
);
/

CREATE TYPE nt_dname_dname AS TABLE of dname;
/

CREATE OR REPLACE FUNCTION f1 RETURN nt_dname 
AS    
    nt_dname        t_d     := t_d();
    n               NUMBER  := 0;
BEGIN
    FOR x IN 
    (
        SELECT  department_id, count(employee_id)
        FROM    employees
        GROUP BY department_id
    )
    LOOP
        nt_dname.EXTEND;
        n               := n+1;
        nt_dname(n)     := dname(x.depno,x.cnt_dname);
    END LOOP; 

    RETURN t_d;
END;
/   

Я получаю следующее сообщение об ошибке

Error: PL/SQL: Compilation unit analysis terminated
Error(1,20): **PLS-00320: the declaration of the type of this expression is 
incomplete or malformed**

Пожалуйста, предложите, где это не так. Я пытаюсь получить количество сотрудников в каждом отделе и дать его в качестве выходного (RETURN nested_table).

1 ответ

Решение

Следующие компиляции, хотя я не проверял это:

create or replace function f1
    return nt_dname_dname
as
    t_d nt_dname_dname := nt_dname_dname();
    n   number := 0;
begin
    for r in (
        select department_id as depno
             , count(employee_id) as cnt_dname
        from   employees
        group  by department_id
    )
    loop
        t_d.extend;
        n := n + 1;
        t_d(n) := dname(r.depno, r.cnt_dname);
    end loop;

    return t_d;
end;

Лично я бы пересмотрел все названия, так как dname, nt_dname_dname а также t_d немного сбивают с толку, по крайней мере для меня.

Другие вопросы по тегам