2014-10-08 65 views
2

我有以下腳本,它包含一個名爲'myFunction'的函數。 (聲明類型名爲rowValueTmprowValueTable也附加爲您的信息)基本上,我需要使用表名稱作爲myFunction的輸入參數。我發現我需要使用動態SQL才能使用表名作爲參數(如果有其他替代方法,請糾正我)。所以下面的代碼是我到目前爲止嘗試過的。Oracle SQL Developer,在函數中使用動態SQL

create or replace type rowValueTmp as object (
    month number, 
    year number 
); 
/ 
create or replace type rowValueTable as table of rowValueTmp; 
/  
create or replace FUNCTION myFunction (TABLENAME in VARCHAR2) 
    return rowValueTable as 
     v_ret rowValueTable; 
    begin 
     execute immediate ' 
     select rowValueTmp(month, year) 
     bulk collect into v_ret 
     from '||TABLENAME;  
     return v_ret; 
    end myFunction; 
/
select * from table(myFunction('SCHEMA.TEST')); 

但是,這個代碼給我一個錯誤,我認爲是因爲使用「批量收集」在執行即時塊發生這個錯誤。

ORA-03001: unimplemented feature 

如果我取代內容執行即時爲以下,上述腳本工作..

select rowValueTmp(month, year) 
bulk collect into v_ret 
from SCHEMA.TEST; 

問題
1]有什麼辦法(而不是動態SQL),我可以使用表名作爲輸入參數myFunction
2]如果我不允許使用批量收集立即執行塊,您有什麼建議? ,我會建議使用DBMS_ASSERT驗證表參數,以及(如圖所示)

CREATE OR REPLACE FUNCTION myfunction (tablename IN VARCHAR2) 
    RETURN rowvaluetable AS 
    v_ret rowvaluetable; 
    v_table VARCHAR2 (61) := DBMS_ASSERT.sql_object_name (tablename); 
BEGIN 
    EXECUTE IMMEDIATE ' 
     select rowValueTmp(month, year) 
     from ' || v_table 
     BULK COLLECT INTO v_ret; 

    RETURN v_ret; 
END myfunction; 
/

在慎重起見的興趣:

+0

'EXECUTE IMMEDIATE'SELECT * FROM bulk_collect_test'BULK COLLECT INTO l_tab;',http://www.dba-oracle.com/plsql/t_plsql_dynamic.htm – Sebas 2014-10-08 21:36:11

回答

4

您可以返回從execute immediately值轉換爲bulk collect

+0

哇......這就是那麼簡單..... ..... 謝謝!!!!!!! – Adrian 2014-10-08 21:46:24