Pular para o conteúdo

Como guardar vários atributos em um único Array: Exemplo com arrays multidimensionais e tipos personalizados

Guardar vários atributos em um único Array

Boa tarde Sergio.

Poderia me ajudar com uma questão com arrays ? Como faço para guardar mais informações dentro de um ? Sei montar um com índice e valor e depois concateno vários dados separados por ‘;’, como  no exemplo:

var(1) := ‘TESTE1;TESTE2;TESTE3’;

Existe uma maneira de guardar mais de uma informação dentro desse array sem ter que concatenar ?

Obrigado pela ajuda !

Val


Olá Val !

Sim, é possível criando um simples array multidimensional. Agora, se quiser estruturar os dados, pode criar TYPES e guardar quantas informações forem necessárias. Vou aproveitar e mostrar um exemplo de como fazer isso e usando um array bidimensional ! 🙂

DECLARE
   TYPE t_acessorios IS TABLE OF VARCHAR(100) INDEX BY PLS_INTEGER;
   TYPE t_carro IS RECORD
           (
            fabricante VARCHAR2(100)
           ,modelo VARCHAR2(100)
           ,acessorios t_acessorios
          );

   TYPE t_tab_carro IS TABLE OF t_carro INDEX BY PLS_INTEGER;
   tab_carro t_tab_carro;

   -- Exibe os carros e seus acessórios
   PROCEDURE mostrar_carros 
   IS
      -- índices
      x_carro PLS_INTEGER;
      x_acessorio PLS_INTEGER;

   BEGIN
      -- Exibe os carros
      x_carro := tab_carro.FIRST;
   LOOP
      EXIT WHEN x_carro IS NULL;
      DBMS_OUTPUT.put_line('Marca :' || tab_carro(x_carro).fabricante);
      DBMS_OUTPUT.put_line(' Modelo :' || tab_carro(x_carro).modelo);
      DBMS_OUTPUT.put_line(' *** Acessorios ***');

      -- Exibe os acessórios dos carros
      x_acessorio := tab_carro(x_carro).acessorios.FIRST;
      LOOP
         EXIT WHEN x_acessorio IS NULL;
         DBMS_OUTPUT.put_line(' ' || tab_carro(x_carro).acessorios(x_acessorio));

         x_acessorio := tab_carro(x_carro).acessorios.NEXT(x_acessorio);

      END LOOP;

      x_carro := tab_carro.NEXT(x_carro);
   END LOOP;
END;

BEGIN
   tab_carro(1).fabricante    := 'FORD';
   tab_carro(1).modelo        := 'FOCUS';
   tab_carro(1).acessorios(1) := 'AR CONDICIONADO';
   tab_carro(1).acessorios(2) := 'BANCO DE COURO';

   tab_carro(2).fabricante    := 'HONDA';
   tab_carro(2).modelo        := 'CIVIC';
   tab_carro(2).acessorios(1) := 'CAMBIO TIPTRONIC';
   tab_carro(2).acessorios(2) := 'AR_CONDICIONADO';

   mostrar_carros;

END;

Foi criado dois TYPEs. Um para a os atributos do carro e outro para os acessórios.

TYPE t_carro IS RECORD
       (
        fabricante VARCHAR2(100)
       ,modelo VARCHAR2(100)
       ,acessorios t_acessorios
       );

Depois foram criados dois TYPEs do tipo TABLE. Um para os carros (Podem ser vários carros) e outro para acessórios (Cada carro pode ter mais de um acessório).

TYPE t_tab_carro IS TABLE OF t_carro INDEX BY PLS_INTEGER;

TYPE t_acessorios IS TABLE OF VARCHAR(100) INDEX BY PLS_INTEGER;

Depois é só alimentar os dados da estrutura:

tab_carro(1).fabricante    := 'FORD';
tab_carro(1).modelo        := 'FOCUS';
tab_carro(1).acessorios(1) := 'AR CONDICIONADO';
tab_carro(1).acessorios(2) := 'BANCO DE COURO';

tab_carro(2).fabricante    := 'HONDA';
tab_carro(2).modelo        := 'CIVIC';
tab_carro(2).acessorios(1) := 'CAMBIO TIPTRONIC';
tab_carro(2).acessorios(2) := 'AR_CONDICIONADO';

E  após isso, varrer o array e exibir os dados através da procedure abaixo:

PROCEDURE mostrar_carros

Vamos executar e ver o resultado:

Statement processed.
Marca :FORD
Modelo :FOCUS
*** Acessorios ***
AR CONDICIONADO
BANCO DE COURO

Marca :HONDA
Modelo :CIVIC
*** Acessorios ***
CAMBIO TIPTRONIC
AR_CONDICIONADO

Agora é só adaptar ás suas necessidade e pronto !

Se quiser, você poderá utilizar o Live SQL para efetuar os seus testes:

vários atributos em um único Array

Se você ainda não conhece o Live SQL, veja o meu artigo sobre essa ótima ferramenta para iniciantes em SQL e PL/SQL.

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