甲骨文创建功能

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

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

我做错了什么?

最佳答案

  1. 对于 Oracle 中的连接字符串,使用 || 而不是 +
  2. 你不需要;立即执行查询字符串的末尾
  3. 您需要使用 '' 转义 '

...正如@Aleksej 所说

  1. 立即执行需要CHAR或VARCHAR2中的查询字符串;
  2. listagg 返回 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 ;
/

关于甲骨文创建功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687840/

相关文章:

java - 如何使用可变长度字符串标记列

database - Oracle impdp : UDI-00013 Message 13 not found

oracle - 在执行查询之前验证结果

oracle - 如何从 PL/SQL 中的表列表中查找空表?

postgresql - 使用 format() 执行 INSERT 会引发错误

postgresql - 使用 PostgreSQL 触发器对数据进行动态审计

java - 2014 年 5 月 Oracle 诉 Google 的判决可能阻碍了 37 个 Java API 包是什么?

oracle - 无法从 Windows 服务连接到 Oracle(错误 : ORA-12154: TNS:could not resolve service name (12154) )

sql - 错误(2,7): PLS-00428: an INTO clause is expected in this SELECT statement

sql - 在没有动态 SQL 的情况下对多个表运行相同的查询