Oracle перебирает значения по столбцам - PullRequest
2 голосов
/ 07 мая 2019

Итак, у меня есть некоторые данные, подобные этому

NO| ID    | PID | COUNT
1 | 00033 | P4  | 1
2 | 00033 | P3  | 3
3 | 00033 | P2  | 2

Я хочу перебрать ID и PID на основе значений счетчика, например:

NO| ID    | PID
1 | 00033 | P4
2 | 00033 | P3
3 | 00033 | P3
4 | 00033 | P3
5 | 00033 | P2
6 | 00033 | P2

Как наилучшим способом добиться этогоиспользуя Oracle PL / SQL процедуру / курсор.

С уважением, Rian

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Использовать простой SQL:

SELECT row_number() OVER ( ORDER BY t."ID", t."PID" DESC ) as NO, 
       t."ID", t."PID"
FROM Table1 t
CROSS APPLY(
  SELECT 1 FROM dual
  CONNECT BY level <= t."COUNT"
)
ORDER BY t."ID", t."PID" DESC

демо: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=d0840879efd2ef4dbc9caef4d1ff6a50

0 голосов
/ 07 мая 2019

Решение с CURSOR FOR LOOP и вложенным циклом FOR, в процедуре:

Таблица

create table nipc ( no, id, pid, count )
as
select 1 , '00033' , 'P4'  , 1 from dual union all
select 2 , '00033' , 'P3'  , 3 from dual union all
select 3 , '00033' , 'P2'  , 2 from dual ;

Процедура

create or replace procedure nloops
is
begin
  for r in ( select no, id, pid, count from nipc )
  loop
    for iter in 1 .. r.count
    loop
      dbms_output.put_line( r.no || ' | ' || r.id || ' | ' || r.pid  ) ; 
    end loop ;
  end loop ;
end ;
/

Тест с анонимным блоком

SQL> set serveroutput on
SQL> begin
  2    nloops ;
  3  end;
  4  /
1 | 00033 | P4
2 | 00033 | P3
2 | 00033 | P3
2 | 00033 | P3
3 | 00033 | P2
3 | 00033 | P2

PL/SQL procedure successfully completed.

DBfiddle здесь.

Вы знаете, что вам следует "использовать SQL, когда это возможно", прежде чем писать какой-либо код PL / SQL (например, см. Ответ @ krokodilko).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...