[英]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.