it-swarm.com.de

Wie para kommagetrennte Zeichenfolge in PL/SQL?

Ich habe eine durch Kommas getrennte Zeichenfolge in einem PL/SQL-Skript (z. B. Daten: = 'a, b, c, d, e'), die ich innerhalb des Skripts analysieren muss.

Ich möchte die Zeichenkette durchlaufen und jedes Element bearbeiten. Wie eine Foreach-Schleife.

Ist das in PL/SQL möglich? Kann mir jemand etwas Code verweisen?

15
TERACytE

Wenn Sie Oracle 10G oder 11G verwenden, sollten Sie über eine integrierte Apex-Funktion apex_util.string_to_table verfügen:

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

Es ist kurz, ein einfaches Beispiel, das folgt:

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

Eine einfache Tokenizer-SQL-Anweisung für Oracle 10g und 11g könnte folgendermaßen geschrieben werden:

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;

Wo Sie pv_string durch die Zeichenfolge ersetzen können (z. B. 'a, b, c, d, e') und pv_separator durch die Trennzeichenfolge (z. B. ',').

0
Guillaume