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:
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 !