在where子句中调用oracle函数

时间:2012-09-10 15:37:39

标签: database oracle

  

可能重复:
  Is there a function to split a string in plsql?

我有以下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子句中调用函数?

1 个答案:

答案 0 :(得分:0)

您的函数在v_condition中生成其输出为('A','B',.....)这是select查询中Oracle的整个字符串,不适用于IN。考虑使用动态SQL。 Oracle将函数的输出视为一个单值('A','B',.....),因此IN子句将被解析为 -

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

这不是你想要的。你想要下面的东西

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

这可以通过动态SQL来实现。