如何在PL / SQL中解析逗号分隔的字符串?

时间:2011-08-11 14:55:59

标签: oracle stored-procedures plsql plsqldeveloper

我在PL / SQL脚本中有逗号分隔的字符串(例如data:='a,b,c,d,e'),我需要在脚本中解析。

我想遍历字符串并处理每个项目。就像一个'foreach'循环。

这在PL / SQL中是否可行?有人能指点我一些代码吗?

6 个答案:

答案 0 :(得分:14)

如果你使用的是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.

答案 1 :(得分:4)

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

答案 2 :(得分:2)

简要说明如下:

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;

答案 3 :(得分:0)

适用于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用分隔符字符串(例如',')。

答案 4 :(得分:-1)

用于基本的逗号分隔字符串。执行下面的程序,旨在将记录一次性打破。当p_input_string = p_output_value完成时。默认值为逗号,但您可以传入不同的分隔符 parse_delimited_string(V_string, v_value, ';'); ---以分号分隔

create or replace procedure parse_delimited_string(P_INPUT_STRING IN OUT VARCHAR2,
                                               P_OUTPUT_VALUE OUT VARCHAR2,
                                               P_DELIMITOR IN VARCHAR2 DEFAULT ',') 
is

 /*This Procedure will parse out the first field of a delimited string it will return
 the result and a the orginal string minus the parsed out string.             
 the ideal would be to execute this procedure for each field you want to extract 
 from string. If you don't know how many values you need to parse out you can just
 keep executing this until the p_input_strng equals the P_output_value
 */

begin

IF (instr(P_INPUT_STRING, P_DELIMITOR)) > 0
  THEN
    P_OUTPUT_VALUE := substr(P_INPUT_STRING, 1, (instr(P_INPUT_STRING, P_DELIMITOR)));  
    P_INPUT_STRING := regexp_replace(P_INPUT_STRING, P_OUTPUT_VALUE, '',1,1);
    P_OUTPUT_VALUE := replace(P_OUTPUT_VALUE, P_DELIMITOR, '');
    IF NVL(P_INPUT_STRING, ' ') = ' '
      THEN
        P_INPUT_STRING := P_OUTPUT_VALUE;
    END IF;    

  ELSE
    P_OUTPUT_VALUE := P_INPUT_STRING;
  END IF;

end parse_delimited_string;

答案 5 :(得分:-1)

declare

type vartype is varray(10) of number;

x1 vartype;

total integer;

begin
x1 := vartype (1,2,3,4);

total := x1.count;

for i in 1 .. total  loop 

dbms_output.put_line(x1(i));        

end loop;

end;


/