0

重複の可能性:
plsqlで文字列を分割する関数はありますか?

私は次のオラクル関数を持っています

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句で関数を呼び出す方法は?

4

1 に答える 1

0

これはクエリ内の Oracle の 1 つの文字列全体であり、 では機能しないため、関数は で出力を生成しv_conditionます。これには動的 SQL の使用を検討してください。Oracle は、関数の出力を 1 つの単一の値として扱うため、句は次のように解析されます。('A','B',.....)selectIN('A','B',.....)IN

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

これはあなたが望むものではありません。以下のようなものが欲しい

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

これは、動的 SQL によって実現できます。

于 2012-09-10T16:07:08.783 に答える