Oracle创建函数

bar*_*acı 3 oracle plsql dynamic-sql

我尝试创建一个 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 ;
/
Run Code Online (Sandbox Code Playgroud)

但它给了我错误“警告:已编译但有编译错误”。

我究竟做错了什么?

Pra*_*een 5

  1. 对于Oracle使用中的连接字符串||,不+
  2. 您不需要在查询字符串;的末尾execute immediate
  3. 你需要'使用 来逃避''

...正如@Aleksej 所说

  1. Execute immediate需要查询字符串CHAR or VARCHAR2
  2. 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 ;
/
Run Code Online (Sandbox Code Playgroud)