从某个值开始将集合一分为二

时间:2019-03-18 14:05:58

标签: oracle parsing plsql collections

我有一个集合A(VARCAHR2的表),如果要从A开始的某行以某个值开头,我想将内容移到另外两个B和C(VARCHAR2的表)中。

为此,我有这部分代码:

...
        for k in 1 .. v_message.count loop

            if substr(v_message(k), 1, 3) = 'AAA' 
                then
                    l_poz := k;
                    dbms_output.put_line('the position there AAA start is at line (' || l_poz || ')');
                    exit;
            end if;
        end loop;

        for k in 1 .. v_message.count loop

            if k < l_poz 
                then 
                    h := h + 1;
                    v_header.extend(1);
                    v_header(h)  := v_message(k);
                    dbms_output.put_line('v_header(' || h || ') = ' || v_header(h));

                else
                    l := l + 1;
                    v_lines.extend(1);
                    v_lines(l)  := v_message(k);
                    dbms_output.put_line('v_lines(' || l || ') = ' || v_lines(l));
            end if;
        end loop;
...

v_message是集合A。

v_header是集合B。

v_lines是集合C。

测试消息应类似于:

  

ABX * xxx#dddd

     

ADF * xxx#dddd

     

SFM * xxx#ffff

     

AAA * xxx#mmmm

     

ABX * yyy#rrrr

     

MMM * jjj#llll

     

ATM * jjj#rrrr

     

SFM * xxx#tttt

我想将此消息拆分为:

  

ABX * xxx#dddd

     

ADF * xxx#dddd

     

SFM * xxx#ffff

  

AAA * xxx#mmmm

     

ABX * yyy#rrrr

     

MMM * jjj#llll

     

ATM * jjj#rrrr

     

SFM * xxx#tttt

我的代码工作正常,但是我想知道是否可以在集合A的单个解析中完成此拆分。

请问有可能吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以在一个循环中完成它,声明一些变量(v_coll),然后执行以下操作:

    v_coll := 'B';

    for k in 1 .. v_message.count loop

        if v_coll = 'B' and substr(v_message(k), 1, 3) = 'AAA' then 
          v_coll := 'C';
        end;

        if v_coll = 'B'
            then 
              -- insert into headers
            else
              -- insert into lines
        end if;
    end loop;