Pular para o conteúdo

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 !

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress