我有以下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;
/
现在我想从where子句中调用此函数,如
SELECT customer_id,
name_remark,
wbs_id,
service_circuit_id,
sum(actual_minutes) TOTAL_USAGE,
min(first_connection_time) DATE_FROM,
max(first_connection_time) DATE_TO,
sum(amount) AMOUNT
FROM temp
FROM customer_id IN (SELECT FUN_CUSTID('CUST00001,CUST00002') FROM DUAL)
GROUP BYcustomer_id, name_remark, wbs_id, service_circuit_id
ORDER BY customer_id;
当我直接运行这个函数并在上层查询中替换值代替函数调用时,它的工作完善了一些记录但是上层查询无法工作。
如何在where子句中调用函数?
答案 0 :(得分:0)
您的函数在v_condition
中生成其输出为('A','B',.....)
这是select
查询中Oracle的整个字符串,不适用于IN
。考虑使用动态SQL。 Oracle将函数的输出视为一个单值('A','B',.....)
,因此IN
子句将被解析为 -
IN ('('A','B',.....)',...)
这不是你想要的。你想要下面的东西
IN ('A','B',.....)
这可以通过动态SQL来实现。