Database 在where子句内调用oracle函数

Database 在where子句内调用oracle函数,database,oracle,Database,Oracle,可能重复: 我有以下oracle功能 create or replace function FUN_CUSTID(t in varchar2) RETURN VARCHAR2 IS TYPE str_array2 IS TABLE OF VARCHAR2(100); v_names str_array2; v_condition varchar2(1000); BEGIN v_condition := '('; select REGEXP_SUBSTR(t, '[^

可能重复:

我有以下oracle功能

create or replace
function FUN_CUSTID(t in varchar2)
  RETURN VARCHAR2
IS
  TYPE str_array2 IS TABLE OF VARCHAR2(100);
  v_names str_array2;
  v_condition varchar2(1000);
BEGIN
   v_condition := '(';
   select REGEXP_SUBSTR(t, '[^ ,]+', 1, rownum) 
      bulk collect into v_names
      from DUAL
      connect by level <= length (regexp_replace(t, '[^ ,]+'))  + 1;

  FOR indx in v_names.FIRST..v_names.LAST LOOP 

    if (indx = v_names.LAST) then
     v_condition := v_condition || '''' || v_names(indx) ||'''';
    else
      v_condition := v_condition || '''' || v_names(indx) ||''',';
    end if;
  v_condition := v_condition || ')';
   END LOOP;

   return v_condition;
end FUN_CUSTID;
/
当我直接运行这个函数并在upper query中用值替换函数调用时,它的工作非常完美,有一些记录,但upper query无法工作


如何在where子句中调用函数?

您的函数在
v_条件下作为
('A','B',…)
生成其输出,这是
select
查询中Oracle的一个完整字符串,在
中不会使用
。考虑使用动态SQL进行此操作。Oracle将函数的输出作为一个单独的值处理为
('A','B',…)
,因此
子句中的
将被解析为-

IN ('('A','B',.....)',...) 
这不是你想要的。你想要下面这样的东西吗

IN ('A','B',.....)

这可以通过动态SQL实现。

您的函数只生成一个包含大量引号字符的字符串。您要做的是将原始字符串转换为元素的“表”。有很多方法可以做到这一点:最合适的方法取决于您的Oracle版本和otehr考虑因素。请参阅我链接的问题中的答案。是否正在寻找将逗号分隔列表传递给SQL的方法?(我假设您正在尝试让函数从原始csv字符串返回元素数组)。
IN ('A','B',.....)