[英]Oracle SQL Developer, using dynamic SQL in function
我有以下腳本,其中包含一個名為'myFunction'的函數。 (還附帶了名為rowValueTmp和rowValueTable的類型聲明,以供您參考)基本上,我需要使用表名作為myFunction的輸入參數。 我發現我需要使用動態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]有什么方法(而不是Dynamic SQL)可以將表名用作myFunction的輸入參數?
2]如果不允許在執行立即執行塊中使用批量收集 ,您有什么建議?
您可以將execute immediately
值返回到bulk collect
:
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;
/
DBMS_ASSERT
謹慎考慮,我建議也使用DBMS_ASSERT
來驗證表參數(如圖所示)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.