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',.....)