Oracle遍历列上的值

时间:2019-05-07 15:31:11

标签: sql oracle

所以我有一些像这样的数据

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过程/游标实现此目标的最佳方法。

关于, 瑞安

2 个答案:

答案 0 :(得分:1)

使用普通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

答案 1 :(得分:0)

在以下过程中使用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 here.

您知道在编写任何PL / SQL代码之前(例如,请参阅@krokodilko的答案),您应该“尽可能使用SQL”。