web-dev-qa-db-ja.com

PL / SQLでカンマ区切りの文字列を解析する方法は?

PL/SQLスクリプトにコンマ区切りの文字列(例:data:= 'a、b、c、d、e')があり、スクリプト内で解析する必要があります。

文字列をループして各項目を処理したいと思います。 「foreach」ループのように。

これはPL/SQLで可能ですか?誰かが私にいくつかのコードを指摘できますか?

16
TERACytE

Oracle 10Gまたは11Gを使用している場合は、組み込みのApex関数apex_util.string_to_tableが必要です。

SQL> declare
  2    v_array apex_application_global.vc_arr2;
  3    v_string varchar2(2000);
  4  begin
  5  
  6    -- Convert delimited string to array
  7    v_array := apex_util.string_to_table('alpha,beta,gamma,delta', ',');
  8    for i in 1..v_array.count
  9    loop
 10      dbms_output.put_line(v_array(i));
 11    end loop;
 12  
 13    -- Convert array to delimited string
 14    v_string := apex_util.table_to_string(v_array,'|');
 15    dbms_output.put_line(v_string);
 16  end;
 17  /
alpha
beta
gamma
delta
alpha|beta|gamma|delta

PL/SQL procedure successfully completed.
14
Tony Andrews

Oracle 11g:

SELECT   num_value
  FROM   (    SELECT   TRIM (REGEXP_SUBSTR (num_csv,
                                            '[^,]+',
                                            1,
                                            LEVEL))
                          num_value
                FROM   (    SELECT   '1,2,3,4,5,6,7,8,9,10' num_csv FROM DUAL)
          CONNECT BY   LEVEL <= regexp_count (num_csv, ',', 1) + 1)
 WHERE   num_value IS NOT NULL
4
Julfcar Ali

以下の簡単な例を示します。

declare
  string_to_parse varchar2(2000) := 'abc,def,ghi,klmno,pqrst';
  l_count number;
  l_value   varchar2(2000);
begin
  string_to_parse := string_to_parse||',';
  l_count := length(string_to_parse) - length(replace(string_to_parse,',',''));
  -- In Oracle 11g use regexp_count to determine l_count
  for i in 1 .. l_count loop 
    select regexp_substr(string_to_parse,'[^,]+',1,i)
    into l_value
    from dual;
    dbms_output.put_line(l_value);
  end loop;
end;
2
java.nazif

Oracle 10gおよび11gで機能する単純なトークナイザーSQLステートメントは、次のように記述できます。

WITH string AS (
      SELECT pv_string value 
        FROM dual)
SELECT DISTINCT upper(trim(regexp_substr (value, '[^' || pv_separator || ']+', 1, ROWNUM))) value,
       level
  FROM string
CONNECT BY LEVEL <= LENGTH(regexp_replace (value, '[^' || pv_separator || ']+')) + 1
  ORDER BY level;

置換できる場所pv_string解析する文字列( 'a、b、c、d、e'など)とpv_separator区切り文字列(例: '、')。

1
Guillaume