GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Manipulando parâmetros do tipo Array

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:

PLS-00363: expression “string” cannot be used as an assignment target Cause: A literal, constant, IN parameter, loop counter, or function call was mistakenly used as the target of an assignment. For example, the following statement is illegal because the assignment target, 30, is a literal: SELECT deptno INTO 30 FROM dept WHERE … — illegal

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:

IN
Specify IN to indicate that you must supply a value for the argument when calling the procedure.

OUT  
Specify OUT to indicate that the procedure passes a value for this argument back to its calling environment after execution

IN OUT
Specify IN OUT to indicate that you must supply a value for the argument when calling the procedure and that the procedure passes a value back to its calling environment after execution.
If you omit IN, OUT, and IN OUT, then the argument defaults to IN.

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 !

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado.