代码之家  ›  专栏  ›  技术社区  ›  J. Chomel

使用Oracle PL/SQL For循环遍历逗号分隔的字符串

  •  13
  • J. Chomel  · 技术社区  · 9 年前

    我正在编写一段代码,需要对字符串的内容进行迭代,每个值用 , .

    e、 我有我的 elements

    v_list_pak_like varchar2(4000) := 'PEBO,PTGC,PTTL,PTOP,PTA';
    

    如何将它放入Array/Cursor以在循环中迭代?

    for x in (elements)
    loop
       -- do my stuff
    end loop;
    

    我正在寻找一种非常简单的方法,如果可能的话,避免声明关联数组。

    是否可以创建一个函数 它将返回可用作 for 循环(与while相反,可用于 https://stackoverflow.com/a/19184203/6019417 )?

    提前致谢。

    3 回复  |  直到 8 年前
        1
  •  29
  •   Lalit Kumar B    9 年前

    你可以很容易地做到 SQL语句 .有多种方法可以做到这一点,请参见 Split comma delimited string into rows in Oracle

    然而,如果你真的想在 PL/SQL ,然后你可以这样做:

    SQL> set serveroutput on
    SQL> DECLARE
      2    str VARCHAR2(100) := 'PEBO,PTGC,PTTL,PTOP,PTA';
      3  BEGIN
      4    FOR i IN
      5    (SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) l
      6    FROM dual
      7      CONNECT BY LEVEL <= regexp_count(str, ',')+1
      8    )
      9    LOOP
     10      dbms_output.put_line(i.l);
     11    END LOOP;
     12  END;
     13  /
    PEBO
    PTGC
    PTTL
    PTOP
    PTA
    
    PL/SQL procedure successfully completed.
    
    SQL>
    
        2
  •  4
  •   J. Chomel    9 年前

    感谢Lalit的伟大指示,我能够创建一个函数,可以从我的 for 循环:

    创建类型和函数

    CREATE OR REPLACE TYPE t_my_list AS TABLE OF VARCHAR2(100);
    CREATE OR REPLACE
           FUNCTION comma_to_table(p_list IN VARCHAR2)
             RETURN t_my_list
           AS
             l_string VARCHAR2(32767) := p_list || ',';
             l_comma_index PLS_INTEGER;
             l_index PLS_INTEGER := 1;
             l_tab t_my_list     := t_my_list();
           BEGIN
             LOOP
               l_comma_index := INSTR(l_string, ',', l_index);
               EXIT
             WHEN l_comma_index = 0;
               l_tab.EXTEND;
               l_tab(l_tab.COUNT) := TRIM(SUBSTR(l_string,l_index,l_comma_index - l_index));
               l_index            := l_comma_index + 1;
             END LOOP;
             RETURN l_tab;
           END comma_to_table;
    /
    

    那怎么称呼我 对于 循环:

    declare
      v_list_pak_like varchar2(4000) := 'PEBO,PTGC,PTTL,PTOP,PTA';
    begin
        FOR x IN (select * from (table(comma_to_table(v_list_pak_like)) ) )
        loop
            dbms_output.put_line(x.COLUMN_VALUE);
        end loop;
    end;
    /
    

    请注意默认名称 COLUMN_VALUE 由Oracle提供,这是我想要使用结果所必需的。

    预期结果:

    PEBO
    PTGC
    PTTL
    PTOP
    PTA
    
        3
  •  2
  •   Izik    5 年前
    declare
        type array_type is table of VARCHAR2(255) NOT NULL;
        my_array array_type := array_type('aaa','bbb','ccc');
    begin
        for i in my_array.first..my_array.last loop
            dbms_output.put_line( my_array(i) );
        end loop;
    end;
    

    在第一行中,您定义了所需的任何类型的表。

    然后创建该类型的变量,并用一种构造函数给它赋值。

    我在声明中初始化了它,但它也可以在Pl-Sql的主体中完成。

    然后从第一个索引到最后一个索引循环遍历数组。