segunda-feira, 23 de novembro de 2009

Utilizando Vetores no Oracle - Parte 3

1. Introdução

Este artigo encerra a série a respeito da utilização de vetores no Oracle, apresentando a maneira pela qual  um vetor pode ser armazenado como uma coluna de tabela.


2. Armazenando um Vetor em Tabelas Oracle
 
Além de conter colunas de tipos básicos, como CHAR, NUMBER ou DATE, uma tabela Oracle também pode ser composta por colunas que representam tipos definidos pelo usuário no banco de dados. É possível, por exemplo, armazenar um objeto ou um vetor (ou mesmo um vetor de objetos!) numa tabela. Este artigo demonstra a maneira pela qual vetores (tipo VARRAY) podem (i) ser definidos como colunas de tabelas, (ii) manipulados através de comandos DML e (iii) ter o seu conteúdo recuperado através da instrução SELECT.

2.1 Definição de uma Coluna de Tabela com o tipo Vetor
 
Para facilitar a compreensão dos conceitos apresentados neste artigo, considere o seguinte exemplo: uma tabela T_ALUNO que armazena a matrícula, o nome e as notas obtidas em cinco exames realizados por alunos de um curso de PL/SQL. Neste exemplo, as notas dos cinco exames serão armazenadas numa coluna do tipo vetor.

O primeiro passo para a definição da tabela T_ALUNO consiste na criação, no banco de dados, do tipo responsável por armazenar as notas dos exames. Este tipo será um VARRAY com 5 posições para dados NUMBER. O comando a seguir ilustra a sintaxe utilizada para a execução desta tarefa (OBS: consulte o primeiro e  segundo artigos da série para conhecer as características do tipo VARRAY) :

CREATE OR REPLACE TYPE tVETOR IS VARRAY(5) OF NUMBER(4,2);

Agora que o tipo “tVETOR” foi criado, torna-se possível criar a tabela T_ALUNO normalmente, com o uso do comando CREATE TABLE.

CREATE TABLE T_ALUNO (
 COD_MATRICULA  CHAR(6)   PRIMARY KEY,
 NOM_ALUNO   VARCHAR2(50)   NOT NULL,
 VET_NOTAS  tVETOR 
)
/

2.2 Inserção de Dados na Coluna do tipo Vetor

O exemplo a seguir ilustra a maneira pela qual os dados de um aluno e as suas cinco notas podem ser inseridos em T_ALUNO com o uso de um comando INSERT simples.

INSERT INTO T_ALUNO VALUES(‘M00001’,‘JOÃO DA SILVA’, tVetor(7.5, 9.8, 7.0, 8.2, 10.0));

COMMIT;

Neste exemplo, foram inseridos os dados do aluno de matrícula “M00001”, chamado João da Silva. Este aluno obteve nota 7.5 no primeiro exame, 9.8 no segundo exame e 7.0, 8.2 e 10.0, no terceiro, quarto e quinto exames, respectivamente. Veja que para inserir as notas na coluna “VET_NOTAS” foi preciso utilizar a forma padrão para popular vetores (apresentada no primeiro artigo desta série), que consiste na referência ao construtor padrão do tipo do vetor (neste caso, “tVETOR”).

Os exemplos a seguir ilustram a inserção dos dados e das notas de outros 3 alunos. Veja que o aluno de matrícula “M00003” não fez a segunda prova (por isso foi inserido o valor NULL para a nota desta prova).

INSERT INTO T_ALUNO VALUES(‘M00002’,‘AMANDA SOUTO’, tVetor(3.5, 7.2, 6.0, 4.2, 1.5));

INSERT INTO T_ALUNO VALUES(‘M00003’,‘JOSE CORREIA’, tVetor(5.5, NULL, 5.5, 6.5, 7.2));

INSERT INTO T_ALUNO VALUES(‘M00004’,‘REGINA MARIA’, tVetor(9.5, 10.0, 10.0, 9.0, 9.0));

COMMIT;

2.3 Recuperação dos Dados Armazenados na Coluna do tipo Vetor

Felizmente, os dados armazenados numa coluna do tipo vetor podem ser recuperados através de uma instrução SQL. No entanto, é preciso utilizar um operador especial, chamado TABLE. Este operador requer, como operando, uma subquery que é a responsável por retornar os dados armazenados no vetor. O exemplo a seguir ilustra a forma pela qual podemos recuperar a matrícula, o nome e a nota de todos os alunos contidos em T_ALUNO (os resultados são ordenados por matrícula e nota):

SQL> SELECT A.COD_MATRICULA, A.NOM_ALUNO, N.*
          FROM t_ALUNO A,
          TABLE(SELECT VET_NOTAS FROM T_ALUNO
          WHERE COD_MATRICULA=A.COD_MATRICULA) N
          ORDER BY 1,3;

 
COD_MATR NOM_ALUNO                                          COLUMN_VALUE
-------- ---------                                          -------------
M00001   JOÃO DA SILVA                                                 7
M00001   JOÃO DA SILVA                                               7,5
M00001   JOÃO DA SILVA                                               8,2
M00001   JOÃO DA SILVA                                               9,8
M00001   JOÃO DA SILVA                                                10
M00002   AMANDA SOUTO                                                1,5
M00002   AMANDA SOUTO                                                3,5
M00002   AMANDA SOUTO                                                4,2
M00002   AMANDA SOUTO                                                  6
M00002   AMANDA SOUTO                                                7,2
M00003   JOSE CORREIA                                                5,5
M00003   JOSE CORREIA                                                5,5
M00003   JOSE CORREIA                                                6,5
M00003   JOSE CORREIA                                                7,2
M00003   JOSE CORREIA
M00004   REGINA MARIA                                                  9
M00004   REGINA MARIA                                                  9
M00004   REGINA MARIA                                                9,5
M00004   REGINA MARIA                                                 10
M00004   REGINA MARIA                                                 10

Sempre que for desejado recuperar os dados armazenados numa coluna do tipo vetor através de uma consulta SQL, será preciso utilizar o operador TABLE junto com uma subconsulta. Apesar de não ser muito flexível, o operador TABLE tem a vantagem de ser muito simples de usar, podendo ser aplicado em muitos casos do dia-a-dia. No entanto, ocorrerão muitas outras situações onde o desenvolvedor precisará realizar operações mais complexas com o vetor. Neste caso, será preciso construir um subprograma PL/SQL (uma função ou procedure)  para tratar adequadamente o conteúdo do VARRAY.

3. Comentários Finais

Este artigo encerrou a série a respeito da utilização de vetores (tipo VARRAY) no Oracle. Os dois primeiros artigos da série apresentaram as características dos vetores Oracle e a maneira pela qual eles podem ser manipulados através de programas PL/SQL. Neste artigo final, foi demonstrado um exemplo em que um vetor foi usado como coluna numa tabela. Para obter maiores informações sobre o assunto, o leitor deve consultar o capítulo que aborda as Coleções (Collections), que faz parte do manual de PL/SQL do SGBD Oracle.

Eduardo Corrêa Gonçalves
Instituto Brasileiro de Geografia e Estatística – IBGE
E-mail:
eduardo.correa@ibge.gov.br

 

0 comentários:

Postar um comentário