Исходя из того, что вы описали, вам не нужен цикл; select
может сделать это сам.
Пример данных: я изменил значения contract
, чтобы было легче отличить guish одно от другого во время тестирования.
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
CONTRACT NUMBER
TYPOLOGY VARCHAR2(10)
SQL> select * From test;
no rows selected
SQL> select * From abc;
CONTRACT TYPOLOGY
---------- ----------
123 TRS
124 TRS
125 TRS
126 TRS
127 TRS
128 TRS
1231 TRS
1232 TRS
1234 TRS
1235 TRS
1236 TRS
1237 TRS
1237 IRS
13 rows selected.
Процедура: Я не вижу большого смысла в том, что вы хотите сделать, но - я думаю, что это всего лишь пример чего-то более сложного. В любом случае: regexp_substr
используется для извлечения первой (топология) и второй (счетчик) части входного параметра.
SQL> create or replace procedure p_test (par_typ in varchar2)
2 is
3 begin
4 insert into test (contract, typology)
5 select a.contract, a.typology
6 from abc a
7 where a.typology = regexp_substr(par_typ, '^\w+')
8 and rownum <= to_number(regexp_substr(par_typ, '\w+$'));
9 end;
10 /
Procedure created.
Тестирование:
SQL> exec p_test('TRS:3');
PL/SQL procedure successfully completed.
SQL> select * From test;
CONTRACT TYPOLOGY
---------- ----------
123 TRS
124 TRS
125 TRS
SQL> exec p_test('IRS:5');
PL/SQL procedure successfully completed.
SQL> select * From test;
CONTRACT TYPOLOGY
---------- ----------
123 TRS
124 TRS
125 TRS
1237 IRS
SQL>
Если, Как вы прокомментировали, входной параметр состоит из нескольких частей, затем разбивает его на более мелкие части (см. FOR LOOP
запрос) и затем использует этот кусок , как я уже показал.
SQL> create or replace procedure p_test (par_typ in varchar2)
2 is
3 begin
4 for cur_r in
5 (select regexp_substr(par_typ, '[^,]+', 1, level) l_typ
6 from dual
7 connect by level <= regexp_count(par_typ, ',') + 1
8 )
9 loop
10 insert into test (contract, typology)
11 select a.contract, a.typology
12 from abc a
13 where a.typology = regexp_substr(cur_r.l_typ, '^\w+')
14 and rownum <= to_number(regexp_substr(cur_r.l_typ, '\w+$'));
15 end loop;
16 end;
17 /
Procedure created.
SQL> exec p_test('IRS:5,TRS:4,REPO:6');
PL/SQL procedure successfully completed.
SQL> select * From test;
CONTRACT TYPOLOGY
---------- ----------
1237 IRS
123 TRS
124 TRS
125 TRS
126 TRS
SQL>