Почему я не могу удалить элемент из коллекции (массива) PLSQL - PullRequest
0 голосов
/ 12 октября 2018

В этом обработчике я удаляю элемент NULL:

if p_arr(i) is null then
    p_arr.delete(p_arr(i));
end if;

, но нулевой элемент все еще в коллекции.Как я могу это исправить?Задача состоит в том, чтобы отсортировать элементы в коллекции, но условие состоит в том, что в коллекции может быть значение NULL.Я должен удалить их.

declare   
p_arr dbms_sql.Number_Table;   
i pls_integer;  

procedure do_sort(p_arr in out dbms_sql.Number_Table, p_asc in boolean 
default null, p_nulls_last in boolean default null) is   
x pls_integer;  
p_temp number;

begin  

for i in -1..p_arr.COUNT - 2 

loop   
  if p_arr(i) is null then
    p_arr.delete(p_arr(i));
  end if;        

end loop;  

end; 

begin   
p_arr(-1) := 0;   
p_arr(0) := -2;   
p_arr(1) := 10.1;   
p_arr(2) := null;    
p_arr(3) := 10.1;   
p_arr(4) := -1;  

do_sort(p_arr); 

i := p_arr.first;   

while i is not null loop   
  dbms_output.put_line('arr('||i||') = '||nvl(to_char(p_arr(i)), 
'null')||';');   
i := p_arr.next(i);   
end loop;   

end; 

1 Ответ

0 голосов
/ 12 октября 2018

Это потому, что вы передаете сам элемент в качестве аргумента delete, а не индекс

p_arr.delete(p_arr(i)) эквивалентен p_arr.delete(NULL) - так что он просто ничего не удаляет.

Итак, измените его на p_arr.DELETE(i), оно будет работать.

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