甲骨文创建功能

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
  ...
  1. 对于 Oracle 中的连接字符串,请使用 || 而不是 +
  2. 您不需要 execute immediate 查询字符串末尾的 ;
  3. 您需要使用 ''.
  4. 转义 '

...正如@Aleksej 所说

  1. Execute immediate 需要 CHAR or VARCHAR2;
  2. 中的查询字符串
  3. listagg return rawVARCHAR2

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 ;
/