Разделить коллекцию на две части, начиная с определенного значения - PullRequest
0 голосов
/ 18 марта 2019

У меня есть коллекция A (таблица VARCAHR2), и я хочу переместить содержимое в два других, B и C (таблицы VARCHAR2), если определенная строка из A начинается с определенного значения.

Для этого у меня есть эта часть кода:

...
        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 # мммм

ABX * гггг # рррр

ммм * jjj # llll

банкомат * jjj # рррр

SFM * ххх # тттт

и я хочу разделить это сообщение на:

ABX * xxx # dddd

ADF * xxx # dddd

SFM* xxx # ffff

и

AAA * xxx # мммм

ABX * ггг # рррр

ммм * jjj # llll

ATM * jjj # rrrr

SFM * xxx # tttt

Мой код работает нормально, но мне интересно, можно ли сделать это разделение за один разизколлекция А.

Возможно ли это, пожалуйста?

1 Ответ

1 голос
/ 18 марта 2019

Да, вы можете сделать это за один цикл, объявить некоторую переменную (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;
...