2017-08-09 75 views
3

我已經定義了包規範中的記錄類型,表類型和函數。無法從函數返回表類型PLSQL

TYPE name_RECORD IS RECORD (
name VARCHAR2(244), 
surname VARCHAR2(244)); 

TYPE name_TABLE IS TABLE OF name_RECORD; 

function f_deps 
    (i_id_dept IN employees.id_department%type) 
    return name_TABLE; 

並寫了封裝體內返回表類型的函數。

function f_deps 
    (i_id_dept IN employees.id_department%type) 
    return name_TABLE is 

CURSOR c1 IS (select * from employees); 
t_name name_TABLE; 
rec_name name_RECORD; 

BEGIN 
t_name := name_TABLE(); 
for i in c1 
LOOP 

    select name, surname BULK COLLECT INTO t_name from employees where id_department = i_id_dept ;    

END LOOP; 

return t_name; 

END f_deps; 

功能編譯正常,但是當我嘗試這樣的執行功能:

select * from table(PACKAGE_employees.f_deps ('6')) ; 

我得到這個錯誤:

ORA-00902: invalid datatype 
00902. 00000 - "invalid datatype" 
*Cause:  
*Action: 
Error at Line: 29 Column: 22 

更新:我已經定義類型的CREATE TYPE語句在命令行中,像Bob Jarvis所建議的那樣,但我仍然得到相同的錯誤消息

create or replace type name_RECORD as object (
name VARCHAR2(244), 
surname VARCHAR2(244)); 

create or replace type name_TABLE AS TABLE OF name_RECORD; 
+0

包中創建的類型不能在SELECT語句中使用。 SELECT語句只能使用使用CREATE TYPE創建的類型。祝你好運。 –

+0

好的,謝謝你的回答。 – Tom

+1

在12C中並非如此 - 但類型需要在包**規範**中定義而非正文。但我認爲只在PL/SQL內部,而不是從命令行。 –

回答

1

看來,你不能選擇直接在SQL這樣的使用功能:

select * from table(PACKAGE_employees.f_deps ('6')) ; 

但你可以這樣做:

declare 
    coll package_employees.name_table; 
begin 
    coll := package_employees.f_deps ('6'); 
    for r in (select * from table(coll)) loop 
    dbms_output.put_line(r.name); 
    end loop; 
end; 

你的功能代碼是不正確的,雖然,它應該更多這樣的:

function f_deps 
    (i_id_dept IN integer) 
    return name_TABLE is 
t_name name_TABLE; 
rec_name name_RECORD; 

BEGIN 

    select name_record(name, surname) 
    BULK COLLECT INTO t_name 
    from employees where id_department = i_id_dept ;    

return t_name; 

END f_deps; 

  • 沒有光標和循環需要
  • 您需要name_record類型的值構造批量收集到的name_record的集合。
+0

好的,謝謝你的回答。但有什麼辦法可以從查詢結果中查看函數的表類型,就像數據庫中的普通表一樣? – Tom

+0

是的 - 但你的功能代碼是錯誤的。看到我更新的答案。 –

+0

我對代碼進行了更改,但是當我編譯它時,出現錯誤消息:錯誤(195,4):PL/SQL:ORA-00913:值太多 – Tom