簡體   English   中英

Oracle SQL Developer,在函數中使用動態SQL

[英]Oracle SQL Developer, using dynamic SQL in function

我有以下腳本,其中包含一個名為'myFunction'的函數。 (還附帶了名為rowValueTmprowValueTable的類型聲明,以供您參考)基本上,我需要使用表名作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM