我有以下腳本,它包含一個名爲'myFunction'的函數。 (聲明類型名爲rowValueTmp和rowValueTable也附加爲您的信息)基本上,我需要使用表名稱作爲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;
/
在慎重起見的興趣:
'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