Manipulando parâmetros do tipo Array
Boa tarde !
Estou passando um array como parâmetro mas não consigo excluir ou incluir dados. Você poderia me dar uma dica de como poderia fazer isso ?
Antônio
Camarada, pelo que conversamos o problema está em como você definiu o parâmetro de sua procedure. Vamos a uma explicação prática executando o código abaixo:
DECLARE
TYPE tArray IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
vArray tArray;
--
-- Delete the first array line
--
PROCEDURE delete_array
(
p_array IN tArray
)
IS
BEGIN
p_array.DELETE(1);
DBMS_OUTPUT.PUT_LINE('First line deleted…');
END delete_array;
BEGIN
-- Feed the Array
vArray(1) := 'TESTE-1';
vArray(2) := 'TESTE-2';
-- Delete the first array line
delete_array(vArray);
-- Read the Array
FOR x IN vArray.FIRST..vArray.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('Value: ' || vArray(x));
END LOOP;
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.put_line('Erro: ' || DBMS_UTILITY.format_error_stack);
END;
ORA-06550: linha 14, coluna 6:
PLS-00363: a expressão 'P_ARRAY' não pode ser usada como um destino de designação
ORA-06550: linha 14, coluna 6:
PL/SQL: Statement ignored
Observe que ao tentar manipular o array vindo do parâmetro de entrada, o erro acima se apresentou.
Vamos dar uma pesquisada sobre este erro:
Resumindo, uma variável de entrada (IN) em procedures são constantes, portanto não podem ser sobrescritas.
Então como resolvemos isso ? Mudando o argumento da variável. Só que primeiro, vamos dar uma olhada na documentação e ver o que ela nos diz:
Veja que a escolha mais óbvia é alterarmos o argumento para IN OUT, pois assim poderemos receber o array, manipular o seu conteúdo e devolver o resultado.
Então vamos alterar o nosso código e executar novamente:
DECLARE
TYPE tArray IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
vArray tArray;
--
-- Delete the first array line
--
PROCEDURE delete_array
(
p_array IN OUT tArray
)
IS
BEGIN
p_array.DELETE(1);
DBMS_OUTPUT.PUT_LINE('First line deleted…');
END delete_array;
BEGIN
-- Feed the Array
vArray(1) := 'TESTE-1';
vArray(2) := 'TESTE-2';
-- Delete the first array line
delete_array(vArray);
-- Read the Array
FOR x IN vArray.FIRST..vArray.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('Value: ' || vArray(x));
END LOOP;
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.put_line('Erro: ' || DBMS_UTILITY.format_error_stack);
END;
Procedimento PL/SQL concluído com sucesso.
First line deleted…
Value: TESTE-2
Entenda que esse tipo de alteração serve para qualquer tipo de variável, não apenas arrays.
Espero ter ajudado !