在 Oracle 中使用 First..Last 和 1..count 有什么区别?

Use*_*r27 2 oracle plsql data-collection

在 Oracle 中使用First..Last1..count在 Oracle 中的区别是什么?

FOR i IN l_collection.FIRST..l_collection.LAST LOOP
Run Code Online (Sandbox Code Playgroud)

或者

FOR i IN 1..l_collection.COUNT LOOP
Run Code Online (Sandbox Code Playgroud)

Bal*_*app 6

firstlast返回第一个索引和最后一个索引。count返回集合中元素的数量。这些不一定提供引用集合中元素的正确方法,因为您可以拥有稀疏集合,其中索引值不连续(请参见下面的示例)。

declare
  type t_numbers is table of number index by pls_integer;
  l_numbers t_numbers;
begin
  l_numbers(1) := 5;
  l_numbers(4) := 6;
  for i in l_numbers.first..l_numbers.last loop
    dbms_output.put_line(i);
  end loop;
end;
/

1
2
3
4

declare
  type t_numbers is table of number index by pls_integer;
  l_numbers t_numbers;
begin
  l_numbers(1) := 5;
  l_numbers(4) := 6;
  for i in 1..l_numbers.count loop
    dbms_output.put_line(i);
  end loop;
end;
/

1
2
Run Code Online (Sandbox Code Playgroud)

我希望你明白为什么两个版本都失败了。只有当您有密集的集合(索引值是连续的)时,这些才能正常工作。对于稀疏集合,两种方法都会失败,您应该使用WHILE循环:

declare
  type t_numbers is table of number index by pls_integer;
  l_index number;
  l_numbers t_numbers;
begin
  l_numbers(1) := 5;
  l_numbers(4) := 6;
  l_index := l_numbers.first;
  while (l_index is not null)
  loop
    dbms_output.put_line(l_index);
    l_index := l_numbers.next(l_index);
  end loop;
end;
/

1
4
Run Code Online (Sandbox Code Playgroud)