2014-10-06 70 views
0

我正在創建一個返回表作爲結果的函數。該函數基本上是在兩個表之間進行比較,並返回兩個表包含不同數據的數據集。
P_min_idp_max_id是可以忽略的,一旦這個函數正常工作,將來會實現。
我修改了原始代碼http://www.adp-gmbh.ch/ora/plsql/coll/return_table.html。錯誤消息在以下代碼中註釋。PL/SQL - 從函數返回表

create or replace function return_objects(
    p_min_id in number, 
    p_max_id in number 
) 
return t_nested_table as 
    v_ret t_nested_table; 
begin 
    select *    // Error(8,7): PL/SQL: SQL Statement ignored 
    into 
    v_ret 
    from 
    (
    select 
    * 
    from 
    (
     select * from 
     (
     select * from SCHEMA.TEST    
     minus 
     select * from SCHEMA.TEST_1 
    ) 
     union all 
     select * from 
     (
     select * from SCHEMA.TEST_1 
     minus 
     select * from SCHEMA.TEST 
    ) 
    ) 
) 
return v_ret;   

end return_objects; 

會意識到,如果你能解決我的代碼,但我想知道爲什麼這個代碼不應該工作。請給我一些關鍵詞,以便我可以研究。或相關網站以供參考。

+0

@Glenn - 我假設你的意思是分號,而不是逗號。你也錯過了''into''中的'bulk collect'。 – 2014-10-06 22:17:22

回答

4

在SQL語句結束後添加分號,並使用bulk collect填充嵌套表。這裏有一個工作示例:

create or replace type t_nested_table is table of varchar2(100); 

create or replace function return_objects(
    p_min_id in number, 
    p_max_id in number 
) 
return t_nested_table as 
    v_ret t_nested_table; 
begin 
    select * 
    bulk collect into v_ret 
    from 
    (
    select 'A' from dual union all 
    select 'B' from dual 
); 

    return v_ret; 

end; 
/

select return_objects(1,2) from dual; 

UPDATE

基於問題的編輯也有特權的問題。您的用戶可能通過角色訪問表,但要創建一個功能,這些權限應該直接授予您的用戶。

+0

再次感謝您的答案!我編輯後意識到這個特權問題,所以我刪除了它:)謝謝! – Adrian 2014-10-07 18:17:37