甲骨文创建功能
Oracle Create Function
我尝试创建一个 Oracle 函数,其中 table 名称、列名和字符串是动态参数:
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 ;
/
但它给我错误 "Warning: compiled but with compilation errors"。
我做错了什么?
考虑到
,您需要更改变量的类型
- "The return data type is RAW if the measure column is RAW; otherwise the return value is VARCHAR2" (documentation)
- EXECUTE 需要一个 VARCHAR2:"It must be of type CHAR or VARCHAR2, not NCHAR or NVARCHAR2"
所以:
declare
querystr varchar2(2000) ;
result VARCHAR2(32767);
begin
...
- 对于
Oracle
中的连接字符串,请使用 ||
而不是 +
- 您不需要
execute immediate
查询字符串末尾的 ;
- 您需要使用
''
. 转义 '
...正如@Aleksej 所说
Execute immediate
需要 CHAR or VARCHAR2
; 中的查询字符串
listagg
return 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 ;
/
我尝试创建一个 Oracle 函数,其中 table 名称、列名和字符串是动态参数:
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 ;
/
但它给我错误 "Warning: compiled but with compilation errors"。
我做错了什么?
考虑到
,您需要更改变量的类型- "The return data type is RAW if the measure column is RAW; otherwise the return value is VARCHAR2" (documentation)
- EXECUTE 需要一个 VARCHAR2:"It must be of type CHAR or VARCHAR2, not NCHAR or NVARCHAR2"
所以:
declare
querystr varchar2(2000) ;
result VARCHAR2(32767);
begin
...
- 对于
Oracle
中的连接字符串,请使用||
而不是+
- 您不需要
execute immediate
查询字符串末尾的;
- 您需要使用
''
. 转义
'
...正如@Aleksej 所说
Execute immediate
需要CHAR or VARCHAR2
; 中的查询字符串
listagg
returnraw
或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 ;
/