l oop sql результат на основе переданного списка параметров и сохранение результата в таблице в oracle - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть список параметров, например, типология со значением TRS: 5, IRS: 10 (значение разделено двоеточием, 1-е значение - типология, а 2-е - записи для выборки из таблицы)

я хотел l oop sql в зависимости от количества переданных параметров и сохранения результата в таблице,

, поэтому, исходя из значения параметра ниже sql, следует l oop 2 раза и сохранить результат в таблице

typology1=TRS,IRS
rownumber1=5,10
for loop in ( select contract,typolgy from table ABC 
              where typology =: typology1 
                and rownum=:rownumber1)
<store value in a table>
end

AB C данные таблицы:

Contract Typolgy
123      TRS
123      TRS
123      TRS
123      TRS
123      TRS
123      TRS
1231     TRS
1232     TRS
1234     TRS
1235     TRS
1236     TRS
1237     TRS
1237     IRS

1 Ответ

2 голосов
/ 22 февраля 2020

Исходя из того, что вы описали, вам не нужен цикл; 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...