2017-05-21 8 views
1
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; 
/ 

不完全または不正な形式であると私はそれが間違っているところ親切に示唆次のエラーメッセージオラクル、PL/SQL関数の戻り値の型、ネストした表のエラータイプが

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

を取得しています。私は 各部門の従業員の数を得て、それを出力として与えようとしています(RETURNnested_table)。

+0

'nt_dname'は関数の戻り値の型です - これは' nt_dname_dname'でなければなりません、つまりあなたが定義したコレクション型ですか?関数内では 'nt_dname'という名前の変数を宣言しますが、' nt_dname'の型ですが、どこにでも宣言されていない 't_d'を返そうとします。私はいくつかの名前と種類が混ざっていると思う。 –

答えて

0

以下のコンパイル、私はそれをテストしていないにもかかわらず:

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; 
個人的に

dnament_dname_dnamet_dは少し混乱しているように私は、少なくとも私には、命名の全てを見直します。

+0

Thansks。クリアされました。今それは働いている.. – user8043289

関連する問題