Muitas vezes temos que trabalhar com tabelas de memória para manipular dados. Existem vários tipos de tabela, sendo a mais comumente utilizada a que indexa os registro por um inteiro binário (binary_integer).
Para o uso desta tabela, encontramos um pequeno problema quando temos que deletar um registro qualquer desta tabela, visto que ai, a mesma acaba perdendo a sequencia da indexação... veja o exemplo:
SQL> DECLARE
2 TYPE T_A IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
3 V_A T_A;
4 BEGIN
5 FOR I IN 1..10
6 LOOP
7 V_A(I) := 'A - '||I;
8 END LOOP;
9 V_A.DELETE(3);
10 FOR I IN V_A.FIRST..V_A.LAST
11 LOOP
12 DBMS_OUTPUT.PUT_LINE( V_A(I));
13 END LOOP;
14 END;
15 /
A - 1
A - 2
DECLARE
*
ERRO na linha 1:
ORA-01403: no data found
ORA-06512: at line 12
Neste exemplo, eu criei uma tabela de memória, e inicializei com 10 registros. Logo após, deletei o terceiro registro, para simular, e mandei mostrar os registros constantes na tabela. Note que no momento que o programa chegou no registro faltante, ele deu um erro de no data found.
Sendo assim, mesmo usando a varredura da tabela de memória do first para o last, ele ainda varre todos os indices, inclusive aquele que já foi deletado!!!
Isto pode ser resolvido facilmente, usando a função exists da tabela de memória, como no exemplo abaixo:
SQL> DECLARE
2 TYPE T_A IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
3 V_A T_A;
4 BEGIN
5 FOR I IN 1..10
6 LOOP
7 V_A(I) := 'A - '||I;
8 END LOOP;
9 V_A.DELETE(3);
10 FOR I IN V_A.FIRST..V_A.LAST
11 LOOP
12 IF V_A.EXISTS(I) THEN
13 DBMS_OUTPUT.PUT_LINE( V_A(I));
14 END IF;
15 END LOOP;
16 END;
17 /
A - 1
A - 2
A - 4
A - 5
A - 6
A - 7
A - 8
A - 9
A - 10
Procedimento PL/SQL concluído com sucesso.
quinta-feira, 15 de outubro de 2009
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário