我尝试创建一个 Oracle 函数,其中表名、列名和字符串是动态参数:
CREATE OR REPLACE FUNCTION MYSCHEMA.myFunctionName(
tableName in nvarchar2,
columnName in nvarchar2,
whereStr in nvarchar2)
RETURN nvarchar2
IS nActive nvarchar2(2000);
BEGIN
declare
querystr nvarchar2(2000) ;
result nvarchar2(2000);
begin
querystr :='
select listagg('+columnName+','+','+') within group (order by '+columnName+')
from '+tableName+' where 1 = 1 '+whereStr+';';
EXECUTE IMMEDIATE querystr
INTO result;
nActive := result;
RETURN ( nActive );
end;
END ;
/
但它给我错误“警告:已编译但有编译错误”。
我做错了什么?
最佳答案
- 对于
Oracle
中的连接字符串,使用||
而不是+
- 你不需要
;
在立即执行
查询字符串的末尾 - 您需要使用
''
转义'
。
...正如@Aleksej 所说
立即执行
需要CHAR或VARCHAR2
中的查询字符串;listagg
返回raw
或VARCHAR2
CREATE OR REPLACE FUNCTION MYSCHEMA.myFunctionName(
tableName in varchar2,
columnName in varchar2,
whereStr in varchar2)
RETURN varchar2
BEGIN
declare
querystr varchar2(2000) ;
result varchar2(2000);
begin
querystr :='
select listagg('|| columnName || ', '','') within group (order by ' ||columnName ||')
from ' || tableName || ' where 1 = 1 ' || whereStr;
EXECUTE IMMEDIATE querystr INTO result;
return result;
end;
END ;
/
关于甲骨文创建功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687840/