Oracle创建功能

时间:2016-04-18 07:30:44

标签: oracle plsql dynamic-sql

我尝试创建一个Oracle函数,其中表名,列名和where字符串是动态参数:

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

  1. 对于Oracle中的联接字符串,使用||而非+
  2. ;查询字符串
  3. 后,您不需要execute immediate
  4. 您需要使用'转义''
  5. ......正如@Aleksej所说

    1. Execute immediate需要CHAR or VARCHAR2;
    2. 中的查询字符串
    3. listagg返回rawVARCHAR2
    4. 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 ;
      /
      

答案 1 :(得分:1)

考虑到

,您需要更改变量的类型
  • "如果度量列为RAW,则返回数据类型为RAW;否则返回值为VARCHAR2" (documentation
  • EXECUTE需要一个VARCHAR2:"它必须是CHAR或VARCHAR2类型,而不是NCHAR或NVARCHAR2"

所以:

declare 
  querystr varchar2(2000) ;
  result VARCHAR2(32767);
begin
  ...