删除PL / SQL表中的空值

时间:2015-11-15 18:37:52

标签: oracle collections plsql

我有一个PL / SQL表,只有在运行时生成的工作日

 L_busdays(1)=27-NOV-15
 L_busdays(3)=25-NOV-15
 L_busdays(4)=24-NOV-15
 L_busdays(5)=23-NOV-15
 L_busdays(8)=20-NOV-15
 L_busdays(9)=19-NOV-15

这是在运行时生成的,因为它们是假日和周末,所以缺少L_busdays(2)L_busdays(6)L_busdays(7)等值。

我需要生成另一个PL / SQL表,以便我可以在下面的数据上来回反复:

L_busdays(1)=27-NOV-15
L_busdays(2)=25-NOV-15
L_busdays(3)=24-NOV-15
L_busdays(4)=23-NOV-15
L_busdays(5)=20-NOV-15
L_busdays(6)=19-NOV-15

我无法实现它。我总是没有找到缺失值的数据错误,即使我通过处理找不到的数据分配给另一个表,另一个表也有主要数据的确切副本击败了整个目的。请帮我怎么做。这在运行时是必需的。

for j in 1..L_busdays.COUNT 
loop 
  begin 
    L_busdays_sec(l):=L_busdays(j); 
  exception 
    when no_data_found then 
      null; 
  end; 
  l:=l+1; 
end loop; 

1 个答案:

答案 0 :(得分:3)

您不必创建新集合来导航稀疏集合(例如工作日)(除非您出于其他目的需要它)。只需使用NEXT()方法转到下一个条目,然后PRIOR()向后转。

declare
    type l_days_nt is table of date 
        index by pls_integer;
    L_busdays l_days_nt;
    idx pls_integer;
begin
    -- populate collection
    L_busdays(1):=to_date('27-NOV-15');
    L_busdays(3):=to_date('25-NOV-15');
    L_busdays(4):=to_date('24-NOV-15');
    L_busdays(5):=to_date('23-NOV-15');
    L_busdays(8):=to_date('20-NOV-15');
    L_busdays(9):=to_date('19-NOV-15');
    dbms_output.put_line('navigate collection forwards ...');
    idx := L_busdays.first();
    while idx is not null
    loop 
       dbms_output.put_line('idx #'||idx||'='||to_char(L_busdays(idx))); 
       idx := L_busdays.next(idx);
    end loop; 
    dbms_output.put_line('.... and backwards'); 
    idx := L_busdays.last();
    while idx is not null
    loop 
       dbms_output.put_line('idx #'||idx||'='||to_char(L_busdays(idx))); 
       idx := L_busdays.prior(idx);
    end loop; 
end;
/

PL / SQL文档中有很多关于收集方法的内容。 Find out more.