Sei sulla pagina 1di 109

BANCO DE DADOS II

Prof. Dr. Alex Sandro Romeo de Souza Poletto

1. SISTEMAS DE B.DADOS OPERACIONAIS (p.1)

2. AMBIENTE DE DATA WAREHOUSE (p.4)

3. MODELAGEM MULTIDIMENSIONAL (p.14)

4. LINGUAGEM PL/SQL (p.29)

5. LINGUAGEM XML (p.84)

Av. Getúlio Vargas, 1200 – Vila Nova Santana – Assis – SP – 19807-634


Fone/Fax: (0XX18) 3302 1053 homepage: www.fema.edu.br
1

1. SISTEMAS DE BANCOS DE DADOS


OPERACIONAIS

1.1. FINALIDADES E FUNDAMENTOS

Os sistemas de bancos de dados são projetados para administrar grandes


volumes de informações sobre uma determinada aplicação, provendo um
ambiente que seja adequado e eficiente para o armazenamento e a
recuperação das mesmas (SILBERSCHATZ; KORTH; SUDARSHAN, 2006).

Segundo Date (2003, p. 06),


Um Sistema de Banco de Dados é basicamente um sistema
computadorizado de manutenção de registros; em outras
palavras, é um sistema computadorizado cuja finalidade
geral é armazenar informações e permitir que os usuários
busquem e atualizem essas informações quando as solicitar.

O maior benefício de um sistema de banco de dados é proporcionar, ao


usuário, uma visão abstrata dos dados. Uma vez que a maioria dos usuários
de bancos de dados não é especialista em computação, omite-se deles a
complexidade da estrutura interna dos bancos de dados, graças a diversos
níveis de abstração que simplificam a interação do usuário com o sistema
(SILBERSCHATZ; KORTH; SUDARSHAN, 2006).

De uma maneira geral, pode-se dizer que um sistema de banco de dados é


constituído por um conjunto de programas e/ou aplicações; estes, por sua
vez, estão associados a um conjunto de dados por intermédio de um sistema
gerenciador de banco de dados (SILBERSCHATZ; KORTH; SUDARSHAN,
2006).

O Sistema Gerenciador de Banco de Dados (SGBD), parte integrante de um


sistema de banco de dados, é um software que ajuda os usuários a criar,
armazenar e processar dados para diversas aplicações (OLIVEIRA, 2002).

O Sistema Gerenciador de Banco de Dados é o responsável pelo controle de


acesso aos dados, ou seja, é ele que gerencia os privilégios de cada um dos
usuários, e libera, ou não, o acesso aos dados, geralmente por meio de um
login e uma senha. Além disso, os sistemas gerenciadores de bancos de
dados devem garantir as seguintes características: Controle de Transações,
Garantia da Integridade, Garantia de Segurança e Controle de Concorrência
(SILBERSCHATZ; KORTH; SUDARSHAN, 2006).

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


2

Considerando-se os Bancos de Dados Operacionais, também conhecidos por


Bancos de Dados Convencionais, Tradicionais ou de Produção, verifica-se que
eles são usados, extensivamente, em operações cotidianas das empresas.
Seu estado é mantido por meio de modificações, assim que as proposições
que eles representam não forem mais verdadeiras (COSTA NETO; SATO,
2006; DATE, 2003).

Os Bancos de Dados Operacionais são, geralmente, modelados para


armazenar dados atuais (ou mais recentes), isto é, para suportar um único
estado ou valor dos dados, não sendo comum resgatar estados anteriores.
Ou seja, sempre prevalece o último estado dos dados. Quando um novo valor
é introduzido, o valor do estado anterior é substituído.

Segundo Gonçalves (2003, p. 17), “os Bancos de Dados Operacionais não


fornecem uma perspectiva histórica para a tomada de decisões devido às
limitações de espaço e às metas para manter um bom nível de desempenho”.

Nos Bancos de Dados Operacionais os dados são atualizados


constantemente, dificultando um acesso preciso e oportuno que permita a
realização de uma análise passível de ser rastreada. Para processar centenas
ou milhares de transações por segundo, as aplicações são otimizadas, a fim
de apresentarem um bom desempenho. Por outro lado, a preocupação quanto
ao desempenho não é grande, quando se consideram as aplicações voltadas
para a análise dos dados (SINGH, 2001).

Nota-se, assim, que os Bancos de Dados Operacionais são quase que


exclusivamente, utilizados para se trabalhar com os dados atuais.

Esses tipos de bancos de dados não oferecem um suporte suficientemente


adequado para aplicações com necessidades não convencionais, tais como
armazenar históricos de alterações e registrar períodos de validade de
dados (CORDEIRO et al., 2004).

1.2. ARMAZENAMENTO DE DADOS OPERACIONAIS

Bancos de Dados Operacionais normalmente são modelados para armazenar


somente o “estado atual” de um dado, portanto, eles não são projetados para
armazenar os estados passados de um dado, ou seja, toda vez que o estado

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


3
de um dado muda, o banco de dados operacional se atualiza e o estado
anterior do dado é perdido (descartado), como ilustrado na Figura 1.

o último estado de um dado é o que prevalece

Estados
Banco Dados Atuais
Operacional
descartado

Figura 1. Estado de Armazenamento em Bancos de Dados Operacionais

Analisando a Figura 1, suponha que um cliente tenha mudado de endereço


pela terceira vez, isso leva o banco de dados operacional a armazenar
somente o último valor do endereço (o atual), perdendo assim, os valores dos
endereços anteriormente armazenados.

Segundo DATE (2003, p.621),


geralmente os Bancos de Dados Operacionais, ou não
temporais, contêm apenas os dados atuais. Sua atualização é
mantida por meio de suas modificações, assim que as
proposições que eles representam não forem mais
verdadeiras.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


4

2. AMBIENTE DE DATA WAREHOUSE

2.1. CONCEITOS

Considerando-se diversas bases de dados operacionais, normalmente ocorre


o problema de falta de padronização entre elas, como por exemplo, a
utilização de nomes iguais para designar conjuntos de entidades ou
atributos diferentes. Outro problema a ser considerado é que, se o
ambiente operacional for utilizado para a realização de consultas em grande
volume de dados, visando a realizar análises de negócio, pode acabar por
atrapalhar ou mesmo bloquear o negócio principal de uma organização. Daí
nasce a idéia de se montar um ambiente separado do ambiente operacional,
cuja principal função é a de proporcionar a realização de consultas que irão
colaborar no processo vital de tomada de decisões estratégicas (COREY,
2001).

Conforme Gonçalves (2003, p. 9), “o problema de inconsistência de dados e a


necessidade dos usuários de tomada de decisão foram o fator chave para o
surgimento do conceito de Data Warehousing”.

Dessa forma, é importante destacar algumas definições sobre o ambiente


de Data Warehousing contidas na literatura.

Segundo Corey (2001), um Data Warehouse é,


Um Banco de Dados reunido a partir de muitos sistemas
destinados a suportar a produção de relatórios gerenciais e
a tomada de decisão. De uma forma geral, quando as pessoas
falam a respeito de armazenamento de dados, na verdade
elas estão se referindo aos armazenamentos de dados e às
ferramentas que, juntos, formam os modernos ambientes de
produção de relatórios.

Conforme Inmon1 et al. (1996 apud COREY et al., 2001, p. 9),


Data Warehouse é um ‘conjunto de dados orientado para o
assunto, integrado, não volátil, variante no tempo, no apoio
de decisões gerenciais’. Orientado para o assunto, integrado,
não volátil e variável no tempo, são propriedades que
precisam ser discutidas, visto que elas são indispensáveis
quando se trata de Data Warehousing.

1
INMON, Bill. et al. Building the Data Warehouse (John Wiley & Sons Inc., 1996).
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
5
Segundo Kroenke (1998, p. 280)
Data Warehouse é um depósito de dados corporativo que se
destina a facilitar a tomada de decisões na empresa. Um
Data Warehousing não inclui apenas dados, mas também
ferramentas, procedimentos, treinamentos, pessoal e outros
recursos que facilitam o acesso aos dados e os tornam mais
adequados aos responsáveis por tomada de decisões.

Parte das empresas mantém suas informações de duas formas: em Bancos


de Dados Operacionais, que são os ambientes em que os dados são colocados
em uma primeira instância; e em Data Warehouse, ambientes em que os
dados são colocados, em uma segunda instância, e a partir de onde eles
poderão ser consultados para análise pela emissão de relatórios (KIMBALL,
2002).

A idéia principal de um ambiente de Data Warehousing é extrair, dos


Bancos de Dados Operacionais, dados pertinentes às aplicações. Em seguida,
objetiva-se centralizá-los e padronizá-los por meio de ferramentas de ETL
(Extraction, Transformation, Load), e, depois, transportá-los para o Data
Warehouse, para que possam ser utilizados no processo de tomada de
decisões de médio e longo prazo, conforme ilustrado na Figura 2.

Figura 2. Ilustração de um Ambiente de Data Warehousing

As ferramentas de ETL representam uma categoria especializada de


programas de software, cuja tarefa consiste, por meio da extração de
dados do ambiente operacional, na eventual transformação desses dados e
na carga dos dados já transformados no ambiente de Data Warehousing.
Todas essas funções acabam por criar dados homogêneos e padronizados

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


6
junto ao Data Warehousing (VASSILIADIS; SIMITSIS; SKIADOPOULOS,
2002).

Durante a geração de um Data Warehouse, uma das fases mais importantes


refere-se ao processo de integração e padronização dos dados, visto que
estes podem vir de diferentes fontes, podendo, inclusive, apresentar
formatações bastante diferentes.

Em geral, a passagem de dados de um ambiente operacional para um


ambiente corporativo constitui-se em uma tarefa bastante complexa.
Muitas vezes há a necessidade de transformação e consolidação dos dados.
Existem ferramentas que implementam o processo ETL (Extração,
Transformação e Carga) dos dados; elas são muito úteis para auxiliar no
processo de criação de um Data Warehouse (PASSOS, 2005).

A Figura 3 ilustra o processo de ETL.

Figura 3. Processo de ETL (adaptado de VASSILIADIS; SIMITSIS;


SKIADOPOULOS, 2002, p.14)

A extração representa a primeira etapa do processo de ETL e envolve a


leitura e a compreensão de dados operacionais. Já a segunda etapa é
constituída pela transformação, na qual podem ocorrer muitas
transformações em potencial, como filtragem dos dados, combinação de
dados de várias origens, cancelamento de dados duplicados, atribuição de
chaves substitutas, padronização de unidades de medida, de domínios e de
tipos de dados, dentre outras. A carga é a última etapa do processo de ETL,
responsável por transportar os dados, já padronizados, para o ambiente de
Data Warehousing (KIMBALL, 2002).

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


7
Os dados a serem reunidos podem estar armazenados em estruturas com
formatos distintos. Essa não padronização é um fato a ser resolvido para
que, durante as cargas de dados no Data Warehouse, estes possuam os
mesmos formatos.

Outro aspecto muito relevante, quando se considera um ambiente de Data


Warehousing, é a questão da “granularidade”. Ela consiste na definição de
níveis de detalhamento para o armazenamento dos dados. O nível de
granularidade deve ser definido em um processo interativo com os usuários,
que podem necessitar obter informações com maior ou menor nível de
detalhamento. A definição do nível de granularidade incide decisivamente no
espaço necessário para armazenamento do Data Warehouse.

2.1.1 PROPRIEDADES

Para se construir um ambiente de Data Warehouse, quatro propriedades são


primordiais para a composição do conjunto de dados, a saber: orientado a
assunto, integrado, não volátil e variável no tempo (INMON apud OLIVEIRA
(2002, p.4)).

Nas subseções seguintes apresentam-se cada uma das propriedades


subjacentes à construção de um ambiente de Data Warehouse.

2.1.2.1. ORIENTADO A ASSUNTO

De acordo com GONÇALVES (2003, p.13), os Data Warehousing são


projetados para ajudar uma empresa a analisar os seus dados, e a forma
como estes são implementados os categoriza como orientados a assunto.

Desta forma, pode-se dizer que o início do fio condutor do serviço de data
warehouse é o delineamento sobre o assunto que se quer controlar,
portanto, sem ter o assunto definido não faz sentido se pensar em um
ambiente de Data Warehouse.

Um exemplo muito interessante e ao mesmo tempo simples é o dado por


COREY; ABBEY; ABRAMSON; TAUB (2001, p.12), no qual você tem que
organizar o problema em áreas de assunto como vendas, por exemplo, e não
em torno de origens, ou seja, juntar dados de vendas no varejo e vendas por
catálogo em um único lugar. Unir várias subsidiárias de vendas em todo o

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


8
mundo, facilitando identificar o comportamento individual ou até mesmo
como um todo.

Portanto, a propriedade orientado a assunto é o direcionamento que se dá


da visão que será disponibilizada do negócio da empresa (OLIVEIRA, 2002,
p.4). A Figura 4 ilustra o procedimento da propriedade orientado a assunto.

Vendas Vendas
Varejo Atacado

Área de
Assunto
(VENDAS)

Figura 4. Exemplo de unificação de informações de vendas via


propriedade orientado a assunto, retirada de COREY; ABBEY;
ABRAMSON; TAUB, 2001, p.11.

2.1.2.2. INTEGRADO

Conforme OLIVEIRA (2002, p.5) a integração talvez seja a parte mais


importante do processo de um Data Warehousing, já que ela será
responsável por sincronizar os dados de todos os sistemas existentes na
empresa, e colocá-los no mesmo padrão.

Um exemplo bastante ocorrido é o referente ao armazenamento do valor do


dado sexo, que em muitos sistemas utilizam-se o “M” para masculino e o “F”
para feminino e em outros sistemas utilizam-se o “0” para masculino e o “1”
para feminino. Esse poderia ser um problema que, na hora de integrar os
dados ao Data Warehouse, deverá ser resolvido.

Portanto, durante a fase de integração deverá ser feito um tratamento dos


dados antes de serem armazenados de forma definitiva, no Data
Warehouse.

Outro exemplo que poderia ocorrer, seria o problema de códigos (chaves


primárias e estrangeiras) com formatos diferentes para cada um dos
sistemas de vendas citados anteriormente, ex.: vendas no varejo, código do
produto=7885315, todos numéricos; sistema de vendas por catálogo, código
do produto=ABBD8412, quatro letras e quatro números, sendo que os dois
últimos números é a soma dos dois primeiros, 84, 8+4=12.
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
9

Vendas Código_tamanho (cm)


Varejo

Código_tamanho (cm) Data


Warehouse

Vendas Código_tamanho (m)


Catálogo

Figura 5. Exemplo de um tratamento de dados, inspirado em


GONÇALVES (2003, p.14).

Para se resolver tal problema, o certo seria criar um código comum ou um


mapeamento dos diversos códigos fonte para se utilizar no Data Warehouse.
Outros problemas que poderiam ocorrer seriam, formatos de datas
diferentes, conflitos de nomes, duplicação de códigos, etc.

2.1.2.3. NÃO VOLÁTIL

O fato de um Data Warehouse ser “não volátil” significa que os dados uma
vez carregados nunca mais são alterados pelos usuários, apenas consultados,
a não ser em novas cargas de dados (GONÇALVES (2003, p.14)).

COREY, ABBEY; ABRAMSON; TAUB (2001, p.13) afirmam que um Data


Warehouse esta somente para leitura; os usuários não podem gravar no
Data Warehouse; suporte a produção de relatórios e não à captura de
dados; é um registro de histórico.

Na verdade, pode-se realizar somente inclusões (cargas) e consultas em um


data warehouse, a opção de modificação (alteração) esta descartada. A
Figura 6 ilustra o procedimento da propriedade não volátil.

alteração carga

Banco de inclusão carga Dat a


Dados War ehouse
Operacional
exclusão carga

Figura 6. Formas de Atualização, inspirada em GONÇALVES


(2003,p.15).
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
10
2.1.2.4. VARIÁVEL NO TEMPO

Conforme INMON (1997 apud GONÇALVES, 2003, p.15) um ambiente de


Data Warehouse é variável com o tempo devido ao fato de que os dados
contidos no mesmo referem-se a algum momento específico, o que significa
dizer que o dado quando carregado recebe, na sua chave, uma unidade de
tempo e nunca mais é a atualizado. Isso permite que os analistas de negócios
façam análise de tendências.

O exemplo a seguir esboça bem como esta propriedade funciona. Pegue uma
fotografia sua, quando recém nascido, depois, pegue outra quando você
tinha cinco anos, e compare. Com certeza, muitas modificações ocorreram,
mas as fotos retratam exatamente a sua situação naquele exato momento
no tempo, e isso acontece da mesma forma com o ambiente de Data
Warehouse. Isto nos possibilita poder traçar uma análise histórica e
comparativa entre os fatos (OLIVEIRA, 2002, p.5).

2.1.2. DADOS E ARMAZENAMENTO

Nesta seção serão descritas as características dos estados de


armazenamento de dados de um ambiente de Data Warehouse.

2.1.2.1. DADOS INFORMATIVOS

Dados Informativos suportam o processo de tomada de decisões, mas não


se pode esquecer que esses dados são dependentes dos dados operacionais
provindos dos bancos de dados operacionais. Portanto, sem os dados
operacionais não existem dados informativos.

GONÇALVES (2003, p.16) relata que a necessidade de informações de alta


qualidade que possam ser facilmente acessadas e analisadas é o motivo que
leva a maior parte das empresas a desenvolver um ambiente de Data
Warehouse.

2.1.2.2. ESTADOS DE ARMAZENAMENTO

Segundo SILBERSCHATZ (1999, p.657), Bancos de Dados Temporais são


bancos de dados que armazenam informação sobre os estados do mundo real
ao longo do tempo.
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
11

Conforme DATE (2003, p.621) um Banco de Dados Temporal é aquele que


contém dados históricos, dados referentes ao futuro e ao passado, em vez
de, ou além de dados atuais.

Os Bancos de Dados Temporais são atualizados raramente, além das


inclusões de dados necessárias para preenchê-lo (DATE, 2003, p.621).

A Figura 7 ilustra os estados de armazenamento de dados nos bancos de


dados temporais.

todos os estados de um dado são mantidos

Estados
Passados e
Banco Dados
Atuais
Temporais

Figura 7. Ilustração de Estados de Armazenamento em Bancos de


Dados Temporais

Analisando as citações dos dois autores, nota-se que os dois destacam que
os bancos de dados temporais devem armazenar todos os estados passados
e presente de um dado, ou seja, toda e qualquer mudança ocorrida no Banco
de Dados Operacional deve ser enviada para o Banco de Dados Temporal.

Essa preocupação, de gerar dados temporais, foi um dos motivos que levou a
propor este trabalho, já que a informação é um dos ativos mais valiosos de
uma organização, e não se pode simplesmente descartar os estados
passados de um dado que futuramente poderão ser utilizados para uma
tomada de decisão e/ou uma simples auditoria.

2.1.3. GRANULARIDADE

A granularidade pode ser considerada o nível de detalhe ou de resumo de


dados que pode ser encontrada em um ambiente de Data Warehouse. Ela é
um componente muito interessante, mas ao mesmo tempo pode afetar o
volume de dados e conseqüentemente os tipos de consultas que poderão ou
não, serem atendidas, dependendo do nível em que a granularidade se
encontra. Exemplo, quanto menor o nível de granularidade maior será o nível
de detalhamento (mais detalhes), podendo assim atender a qualquer
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
12
consulta, mas necessitando de mais espaço para armazenar os dados por
completo, por outro lado, quanto maior o nível de granularidade menor será
o nível de detalhamento (menos detalhes), podendo prejudicar alguns tipos
de consultas (GONÇALVES, 2003, p.21-22).

O nível de granularidade deve ser definido em um processo interativo com


os usuários, visto que é as necessidades dos usuários, de obter informações
com maior detalhe, o foco que deve ser levado em consideração. Não adianta
nada querer forçar certo nível de granularidade sendo que isto prejudicaria
futuramente as solicitações dos usuários, mas por outro lado a
granularidade é muito importante para se liberar espaço no Data
Warehouse.

As formas de aumentar a granularidade, ou seja, de criar um nível de


granularidade muito alto, ganhando espaço em disco, números de índices
menores, etc. são por resumo, por média, por valores limite e em
totalizações diárias, semanais, mensais e/ou anuais.

2.1.4. PARTICIONAMENTO DE DADOS

O objetivo central do particionamento de dados é melhorar o desempenho


do ambiente de Data Warehouse. Para isso, é necessário que se divida o
Warehouse em várias unidades menores, ou seja, devem-se levantar quais as
tabelas que possuem grandes volumes de dados e um alto índice de acesso e
reparti-las em várias tabelas menores, contendo as mesmas estruturas, mas
com as linhas (tuplas) separadas entre elas.

O particionamento envolve a divisão deliberada de tabelas grandes do


Warehouse em trechos menores e mais gerenciáveis, e pode ser uma solução
atraente para o problema de crescimento exponencial dos dados (COREY;
ABBEY; ABRAMSON; TAUB, 2001, p.362).

Os critérios utilizados para particionar dados podem variar de acordo com


os tipos de dados que a empresa possui. Não existem critérios definidos
para se particionar os dados, o que existe mesmo são sugestões para o
particionamento de dados, mas que podem ou não serem utilizadas
dependendo dos tipos de dados e das necessidades da empresa. Na verdade,
os critérios deveram ser definidos pela equipe responsável pelo ambiente de
Data Warehouse focando as necessidades da empresa.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


13
A seguir serão mostradas algumas sugestões de critérios para o
particionamento de dados (INMON, 1997 apud GONÇALVES, 2003, P.26-
27).

• por data: pode-se usar a data da venda dos produtos para dividir a
tabela de vendas em vendas por período de data, como também utilizar o
ano da data para dividir as declarações de imposto de renda por ano base,
etc.;
• por área geográfica: pode-se utilizar a unidade federal (UF) para dividir
as vendas de uma empresa nacional em vendas por estado, com também
utilizar o nome da cidade para dividir os movimentos dos clientes de uma
grande agência bancária ou até mesmo separar as vendas de uma empresa
multinacional pela sigla do país, etc.;
• por unidade organizacional: separar os dados de uma empresa por
organizações, pelo número de filiais, etc.;
• ou até mesmo combinando vários desses critérios ou por qualquer outra
informação relevante ao negócio da empresa.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


14

3. MODELO E-R MULTIDIMENSIONAL

3.1. CONCEITOS

A modelagem multidimensional constitui-se em uma das mais utilizadas para


o projeto de um Data Warehouse e é o modelo base empregado neste
trabalho (ANDRADE; SANTIAGO, 2003). A estrutura fundamental do
modelo multidimensional está esquematizada na Figura 8.

TABELA DIMENSÃO 1 TABELA DIMENSÃO 3

Chave Dimensão 1 Chave Dimensão 3


Atributo 1.1 Atributo 3.1
Atributo 1.2 Atributo 3.2
...... ......
Atributo 1.n Atributo 3.n

TABELA FATO
Chave Dimensão 1
Chave Dimensão 2
Chave Dimensão 3
Chave Dimensão x
Fato 1
Fato 2
......
Fato n

TABELA DIMENSÃO 2 TABELA DIMENSÃO x

Chave Dimensão 2 Chave Dimensão x


Atributo 2.1 Atributo x.1
Atributo 2.2 Atributo x.2
...... ......
Atributo 2.n Atributo x.n

Figura 8. Estrutura básica do modelo multidimensional

Nesse modelo, nota-se a presença de dois tipos de tabelas: a tabela “fato” e


as tabelas “dimensão”. Conforme Kimball (2002, p. 21), “uma tabela de fatos
é a principal tabela de um modelo dimensional em que as medidas numéricas
de desempenho da empresa estão armazenadas”.

As tabelas “fato” armazenam a maior parte das informações que um banco


de dados possui, sendo, em sua maioria, dados numéricos. Esses dados são
considerados a movimentação propriamente dita, ou seja, os detalhes de
uma compra, de uma venda, de uma locação de fitas. Aquilo que realmente
alimenta o banco de dados está de fato, armazenado nessas tabelas.

Já as tabelas “dimensão” possuem atributos com descrições que


complementam o significado dos dados numéricos contidos nas tabelas

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


15

“fato”. Segundo Kimball (2002, p. 24), “as tabelas de dimensões estão


sempre acompanhando uma tabela de fatos, possuindo descritores textuais
da empresa”.

Pode-se notar que o modelo multidimensional é não normalizado, tendo em


vista que as tabelas “dimensão” podem conter redundâncias em seus valores.
No entanto, essa falta de normalização implica um modelo mais simples, além
de auxiliar no desempenho, quando da realização de consultas.

3.2. TIPOS DE MODELOS

Nesta seção serão apresentados dois tipos de modelos multidimensionais,


começando pelo Modelo Estrela e terminando com o Modelo Floco de Neve.

3.2.1. MODELO ESTRELA

O Modelo Estrela é assim denominado por apresentar a tabela de fatos no


centro do esquema e as tabelas de dimensões nas extremidades
(GONÇALVES, 2003, p.112). As Figuras 9 e 10, ilustram genericamente o
modelo estrela.

Figura 9. Analogia com uma Estrela (Star Schema)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


16

DIMENSÃO 1 DIMENSÃO 2

ID_DIMENSÃO_1 ID_DIMENSÃO _2
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. FATO .
ATRIBUTO_N ATRIBUTO_N
ID_DIMENSÃO_1
ID_DIMENSÃO_2
ID_DIMENSÃO_3
ID_DIMENSÃO_N
ATRIBUTO_1
ATRIBUTO_2
.
.
DIMENSÃO 3 ATRIBUTO_N DIMENSÃO N

ID_DIMENSÃO_3 ID_DIMENSÃO_N
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. .
ATRIBUTO_N ATRIBUTO_N

Figura 10. Exemplo genérico do Modelo Estrela (Star Schema)

3.2.2. MODELO FLOCO DE NEVE

O Modelo Floco de Neve (Snow Flake) é uma extensão do modelo estrela


(Star Schema) em que cada uma das pontas da estrela (dimensões) passa a
ser o centro de outras estrelas (GONÇALVES, 2003, p.113).

Em nosso exemplo da Figura 10, a DIMENSÃO_3 poderia possuir uma


hierarquia definida em que o ATRIBUTO_1 se dividisse em outro atributo,
necessitando assim de outra tabela de dimensão, ilustrada no exemplo como
DIMENSÃO_31, tendo como tabela de fatos a DIMENSÃO_3.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


17

DIMENSÃO_1 DIMENSÃO_2

ID_DIMENSÃO_1 ID_DIMENSÃO _2
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. .
FATO
ATRIBUTO_N ATRIBUTO_N
ID_DIMENSÃO_1
ID_DIMENSÃO_2
ID_DIMENSÃO_3
ID_DIMENSÃO_N
ATRIBUTO_1
ATRIBUTO_2
.
.
DIMENSÃO_3 ATRIBUTO_N DIMENSÃO_N

ID_DIMENSÃO_3 ID_DIMENSÃO_N
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. .
ATRIBUTO_N ATRIBUTO_N

DIMENSÃO_31

ID_DIMENSÃO_31
ATRIBUTO_1
ATRIBUTO_2
.
.
ATRIBUTO_N

Figura 11. Exemplo genérico do Modelo Floco de Neve (Snow Flake)

Vale ressaltar neste ponto, que o objetivo desta proposta de trabalho, é


tratar a geração de dados temporais, e alguns desses conceitos sobre data
warehouse podem não ser utilizados neste processo. A idéia não é gerar um
Data Warehouse Tradicional, e sim se basear em seus conceitos e noções a
fim de gerar um Data Warehouse “Temporal” ou um Data Warehouse
“Operacional-Temporal”.

3.3. COMPARAÇÃO BD OPERACIONAIS X DATA


WAREHOUSE

Características BD operacionais DW
Objetivo Operações Diárias Análise do Negócio
Decisões Cotidianas Decisões Estratégicas
de Longo Prazo

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


18

Tipo de Operacional Informativo/Analítico


Informação/Uso
Tipo de OLTP (base em OLAP (base em
processamento transações) análise)
Unidade de Trabalho Inclusão, Alteração, Carga e Consulta
Exclusão e Consulta

Nº Usuários 10X X
Tipo Usuários Operadores Gerência
Interação Usuário Somente pré-definida Pré-definida e adhoc
Volume MB - GB GB - TB
Granularidade Dados detalhados Dados detalhados e
resumidos
Alteração Dados mudam Dados mudam
constantemente raramente
Dados Atuais/Operacionais Históricos

Nº de registros Pequeno nº de reg. por Grande nº de reg. por


Transação Análise
Acessos Grande Volume de Médio Volume de
Transações Análise

Utilização Constante (~100%) Picos

3.4. CONVERTER MODELOS E-R  MODELOS


DIMENSIONAIS
(BD OPERACIONAIS  DATA WAREHOUSE)

O objetivo é criar um esquema que ofereça condições para o


armazenamento de dados históricos.

Para a elaboração do desse esquema, alguns passos são necessários:


selecionar os conjuntos de entidades e atributos essenciais para a geração
de dados históricos; incluir atributos relativos ao tempo; adicionar
atributos derivados; transformar relacionamentos entre dados em
conjuntos de entidade; acomodar diferentes níveis de granularidade. A
Figura 12 apresenta a seqüência dos passos.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


19

Figura 12 - Passos para a Geração de um Modelo para Armazenamento


de Históricos

3.4.1. ILUSTRAÇÃO DA CONVERSÃO DE UM MODELO DE


DADOS OPERACIONAL PARA UM MODELO DE
DADOS HISTÓRICO

PASSO 1: SELEÇÃO DOS CONJUNTOS DE ENTIDADES E


ATRIBUTOS PARA O BANCO DE DADOS HISTÓRICO

Justificativa
Este passo toma por base o fato de que é essencial que sejam selecionados
todos os conjuntos de entidades e atributos que realmente participarão do
processo de geração de dados históricos.

A primeira função deste passo é identificar, no Modelo de Dados


Operacional, quais são os conjuntos de entidades e atributos puramente
operacionais, para que os mesmos possam ser descartados durante a
elaboração do Modelo Histórico.

Não devem ser descartados os conjuntos de entidades que podem ter seus
valores alterados ao longo do tempo, já que são, normalmente, vitais ao
processo de análise. Também não devem ser totalmente descartados os
conjuntos de entidades que conterão os valores descritivos, já que os
mesmos podem também ser úteis na geração do Banco de Dados Histórico.

Este passo visa a evitar a seleção de atributos que não sejam essenciais

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


20

para o processo de tomada de decisões. O não descarte desses atributos


pode, eventualmente, causar problemas de sobrecarga ao Banco de Dados
Histórico.

Exemplo
Seja o trecho de modelo de dados da Figura 13.

Figura 13. Exemplo de aplicação do Passo 1

Nota-se que as elipses em destaque (com cor de fundo acinzentada)


identificam os atributos a serem transportados para o Banco de Dados
Histórico, já que são atributos que podem sofrer alterações ao longo do
tempo, que podem ser utilizados como valores descritivos, ou atributos
chaves primários que são essenciais para a localização das informações. As
demais elipses identificam os atributos que não deverão participar do
processo de armazenamento de históricos, visto que são valores únicos.
Estes, raramente, são modificados ao longo do tempo.

PASSO 2: CRIAÇÃO DOS CONJUNTOS DE ENTIDADES PARA O


ARMAZENAMENTO DOS DADOS HISTÓRICOS

Justificativa
A relevância deste passo assenta-se no fato de que é necessário definir as
entidades para o armazenamento dos dados históricos. Sua função é
oferecer um meio para a representação dos vários valores que uma entidade
ou atributo pode assumir ao longo do tempo, já que nos Bancos de Dados
Operacionais as representações baseiam-se em valores atuais do negócio.

O modelo adotado é o que se apresenta na Figura 14. No modelo proposto,


há uma tabela chamada HISTÓRICO, que contém os seguintes atributos:
uma chave primária, atributos descritivos, atributos numéricos, atributos
temporais e atributos derivados.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


21

Figura 14. Modelo de Dados Histórico

Exemplo
Seja o trecho de modelo de dados operacional da Figura 15.

Figura 15. Modelo de Dados Operacional entre FUNCIONÁRIO e


CARGO

Nota-se que o modelo de dados da Figura 15 representa o cargo atual que o


funcionário possui.

Por outro lado, em se tratando de dados históricos, essa estrutura não seria
suficiente, visto que ela não suportaria mais que um cargo por funcionário, e
muito menos o tempo em que o funcionário possuiu um respectivo cargo.

Com isso, surge a necessidade de se criarem novos conjuntos de entidades


de dados, conforme ilustrado na Figura 16.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


22

Figura 16. Exemplo do Passo 2

A tabela que seria criada no Banco de Dados Histórico seria apenas aquela
referente à entidade HIST_CARGO.

PASSO 3: INCLUSÃO DE ELEMENTOS DE TEMPO NOS CONJUNTOS


DE ENTIDADES

Justificativa
É primordial, em alguns casos, a inclusão de atributos que controlarão os
períodos nos quais os valores contidos nos conjuntos de entidades
permanecerão válidos. Ou seja, em um período, determinado valor foi
considerado válido. Para que isso seja possível, é necessária a inclusão de
novos atributos de tempo para o controle dos períodos.

Dessa forma, a função deste passo é incluir, no Banco de Dados Histórico,


um ou mais elementos de “tempo”, na estrutura de cada um dos conjuntos
selecionados de entidades, a fim de possibilitar o armazenamento dos dados
históricos, podendo, ou não, compor a chave primária existente.

Além disso, em alguns casos não basta apenas a inclusão de um elemento


“tempo” na estrutura do conjunto de entidades. Pode ser necessária
também, a adição de um novo conjunto de entidades, para que haja o
armazenamento mais detalhado de todas as ocorrências de alteração de
valores.

Exemplo
Seja o trecho de modelo de dados da Figura 17.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


23

Figura 17. Exemplo do Passo 3

O objetivo é armazenar todos os cargos que um funcionário tenha ocupado


na empresa, considerando-se também todos os períodos nos quais ocorreram
essas mudanças. Os atributos DT_INICIAL e DT_FINAL referem-se à
adição dos elementos de “tempo”.

A tabela que seria criada no Banco de Dados Histórico seria apenas aquela
referente à entidade HIST_CARGO.

PASSO 4: INCLUSÃO DE ATRIBUTOS DERIVADOS

Justificativa
Em alguns casos, pode ser necessário realizar consultas muito complexas
que impliquem acessar um grande volume de tuplas, juntamente com
inúmeros cálculos. Isso poderá atrasar a obtenção das informações. Por
isso, é necessário a adição de atributos derivados, já que tal procedimento
pode eliminar a necessidade da realização de cálculos durante o processo de
recuperação de valores.

A função deste passo é adicionar atributos totalizadores, derivados de


outros atributos como, por exemplo: o total de uma venda; a idade de uma
pessoa, dentre outros.

Exemplo
A Figura 18 ilustra a adição de um atributo derivado (elipse com fundo
preenchido por cor cinza) em um conjunto de entidades HIST_VENDA,

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


24

representando parte do Banco de Dados Histórico. A parte de cima da


figura representa parte de um modelo de dados operacional.

HORA
PREÇO
DATA PREÇO_ÉPOCA
ID_PROD DESCRIÇÃO
NUMERO QTDE

PRODUTO está VENDA

HORA PREÇO_ÉPOCA
DATA QTDE

NUMERO TOTAL

HIST_VENDA

Figura 18. Exemplo 1 do Passo 4

No exemplo, o atributo TOTAL é considerado um atributo derivado, já que


se origina da multiplicação dos atributos PREÇO_EPOCA do produto com a
quantidade (QTDE) vendida.

A tabela que seria criada no Banco de Dados Histórico seria apenas aquela
referente à entidade HIST_VENDA.

Como pode ocorrer a adição de atributos derivados de cálculos com base em


um montante de tuplas, torna-se necessário o uso de procedimentos
armazenados.

Exemplo
A Figura 19 lustra parte de um modelo de dados operacional.

Figura 19. Entidade VENDA

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


25

Analisando o modelo de dados representado pela Figura 19, nota-se que


pode ser necessário o cálculo de valores que envolvam faixas de períodos,
tais como períodos semanais, mensais ou até mesmo anuais, de acordo com o
agrupamento desses dados.

A Figura 20 ilustra um exemplo de cálculo cuja finalidade é agrupar e


totalizar as vendas feitas mensalmente, por cliente e por produto.

Figura 20. Exemplo 2 do Passo 4

O atributo TOT_VAL (QTDE*PREÇO) refere-se ao valor total das vendas


realizadas dentro de cada mês e ano. O atributo TOT_QTDE refere-se à
somatória da quantidade de produtos vendidos.

Assim, a tabela que seria criada no Banco de Dados Histórico seria apenas
aquela referente à entidade HIST_VENDA.

PASSO 5: GERAÇÃO DO MODELO DE DADOS HISTÓRICO

Após a aplicação de todos os passos componentes desta etapa, obtém-se o


Modelo de Dados Histórico. Este será utilizado para a criação do Banco de
Dados Histórico, com base no Modelo de Dados Operacional.

3.4.2. EXEMPLO PRÁTICO

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


26

MODELO DE DADOS OPERACIONAL

CARGO possui possui FOLHA_SITUACAO

Código Código
Descrição Nome
Salário

VERBA RECEBE
possui CATEGORIA
Código Mês_Ano
Descrição ID
Quantidade
Categoria Descrição
Valor
Referência Categoria_atual
EMPREGADO
.....
ID
LOCALIDADE reside Nome EXERCE COORDENADORIA
Dt_nasc
ID Sexo
Descrição Endereço Código
Estado Dt_admis Descrição
.....
DISCIPLINA NOTA_FALTA SITUACAO_MATRICULA
RA
Código Código
Turma
Descrição Descrição
Ano
Nota1 possui
Nota2
Média
reside
Faltas1. . .Faltas12
.....

ALUNO possui CURSO

Matricula Código
ACADEMICO_SITUACAO
Nome Coordenadoria
Código possui Série Descrição
Descrição Turma .....
.....

Figura 21. Modelo de Dados Operacional (FOLHA e ACADEMICO)

REQUISITOS

Para o setor de Recursos Humanos, o essencial é armazenar dados


históricos referentes às seguintes situações:

I- Ter a possibilidade de recuperar todas as mudanças de cargos (A), de


endereços (incluindo as cidades) (B) e de graus de instrução (C),
ocorridas com um determinado funcionário, bem como as épocas exatas
dessas mudanças.

II- Ter a possibilidade de recuperar todos os totais pagos anualmente para


cada um dos funcionários de acordo com cada verba recebida.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


27

Para o setor de Supervisão Acadêmica, o essencial é armazenar dados


históricos referentes às seguintes situações:

III- Ter a possibilidade de recuperar todas as mudanças de


coordenadorias (A), de categorias (titulação) (B) e de endereços
(incluindo municípios) (C), ocorridas com um determinado professor, bem
como as épocas exatas dessas mudanças.

IV- Ter a possibilidade de recuperar todas as alterações de médias (A) e


de faltas (B) ocorridas em cada disciplina com um determinado aluno,
bem como as épocas exatas dessas mudanças.

Portanto, com base nessas situações é que devem ser selecionados os


conjuntos de entidades operacionais e/ou atributos que fornecerão as
devidas informações a serem armazenadas no Banco de Dados Histórico,
bem como a sugestão para se usarem novos conjuntos de entidades
necessários para atendê-las.

RESULTADO

Após a aplicação dos passos, pôde-se chegar ao modelo de dados necessário


para que se possa ter um controle razoável das modificações efetuadas
junto aos Bancos de Dados Operacionais “BDO_FOLHA” e
“BDO_ACADEMICO”, conforme apresentado na Figura 11.

As entidades criadas em conseqüência do Modelo de Dados Histórico estão


representadas na Figura 11, em tracejado.

Segue uma descrição simplificada das tabelas resultantes do mapeamento.


Essas tabelas é que formarão o Banco de Dados Histórico.

• HIST_CARGO = (ID_EMP, ID_CARGO, NOME_EMP, DESCRICAO_CARGO,


VALOR_CARGO, ID_USUARIO_BDO, DT_INICIAL, DT_FINAL);
• HIST_CATEGORIA = (ID_EMP, ID_CAT, NOME_EMP, DESCRICAO_CAT,
ID_USUARIO_BDO, ORIGEM, DT_INICIAL, DT_FINAL);
• HIST_COORDENADORIA = (ID_EMP, ID_COORD, NOME_EMP,
DESCRICAO_COORD, ID_USUARIO_BDO, DT_INICIAL, DT_FINAL);
• HIST_ANUAL_EMP = (ID_EMP, ID_VERBA, NOME_EMP,
DESCRICAO_VERBA, ANO, QUANTIDADE, VALOR);
• HIST_MEDIA = (ID_ALUNO, ID_DISCIPLINA, NOME_ALUNO,
DESCRICAO_DISCIPLINA, ANO, VELHA_NOTA_1, VELHA_NOTA_2,

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


28

NOVA_NOTA_1, NOVA_NOTA_2, ID_USUARIO_BDO, DT_ALTERACAO,


VELHA_MEDIA, NOVA_MEDIA);
• HIST_FALTA = (ID_ALUNO, ID_DISCIPLINA, NOME_ALUNO,
DESCRICAO_DISCIPLINA, ANO, TOTAL_FALTA, TURMA);
• HIST_ENDER_EMPREGADO = (ID_EMP, ID_LOCAL, NOME_EMP,
DESCRICAO_LOCAL, ID_USUARIO_BDO, ENDERECO_EMP, ORIGEM,
DT_INICIAL, DT_FINAL);

MODELO DE DADOS HISTÓRICO

Figura 22. Modelo de Dados Histórico.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


29

4. LINGUAGEM PL/SQL

4.1. INTRODUÇÃO

O PL/SQL é uma linguagem da Oracle que tem por objetivo processar


informações do banco de dados. Um bloco PL/SQL pode ser executado a
partir do SQL*Plus, do Forms, do Reports ou de qualquer linguagem
PRO*Oracle.

A linguagem PL/SQL é uma extensão da linguagem SQL, vista no módulo I. A


linguagem PL/SQL oferece recursos de engenharia de software modernos,
como, por exemplo, a encapsulação de dados, o tratamento de exceções, a
ocultação de informações e a orientação a objeto, etc., trazendo os
recursos de programação mais modernos para o Oracle Server e o ToolSet.

A linguagem PL/SQL incorpora muitos recursos avançados criados em


linguagens de programação projetadas durante as décadas de 70 e 80. Além
de aceitar a manipulação de dados, ele também permite que as instruções de
consulta da linguagem SQL sejam incluídas em unidades procedurais de
código e estruturadas em blocos, tornando a linguagem SQL uma linguagem
avançada de processamento de transações. Com a linguagem PL/SQL, você
pode usar as instruções SQL para refinar os dados do Oracle e as
instruções de controle PL/SQL para processar os dados.

4.2. BENEFÍCIOS DA LINGUAGEM PL/SQL

4.2.1. INTEGRAÇÃO

A linguagem PL/SQL desempenha um papel central tanto para o Oracle


Server, por meio de procedimentos armazenados, funções armazenadas,
gatilhos de banco de dados e pacotes, quanto para as ferramentas de
desenvolvimento Oracle, por meio de gatilhos de componentes da Oracle
Develop (Forms, Reports e Graphics).

Os tipos de dados SQL também podem ser usados no código PL/SQL.


Combinados com o acesso direto que a linguagem SQL fornece, esses tipos
de dados compartilhados integram a linguagem PL/SQL com o dicionário de

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


30

dados do Oracle Server. A linguagem PL/SQL une o acesso conveniente à


tecnologia de banco de dados com a necessidade de capacidades de
programação procedural.

4.2.2. MELHORAR DESEMPENHO

A linguagem PL/SQL pode ser usada para agrupar as instruções SQL em um


único bloco e enviar esse bloco inteiro para o servidor em uma única
chamada, reduzindo assim o tráfego da rede. Sem o código PL/SQL, as
instruções SQL seriam enviadas ao Oracle Server uma de cada vez. Cada
instrução SQL resulta em outra chamada do Oracle Server e uma maior
sobrecarga de desempenho. Em um ambiente de rede, a sobrecarga pode se
tornar significativa. A Figura 23 a seguir ilustra a melhora do desempenho
acima descrito:

SQL

SQL
OUTROS
APLICAÇÃO
DBMS
SQL

SQL
IF ... THEN
SQL ORACLE
APLICAÇÃO ELSE
SQL
END IF;
SQL

Figura 23. Exemplo de Melhora de Desempenho

A linguagem PL/SQL também pode cooperar com as ferramentas de


desenvolvimento de aplicação do Oracle Server como, por exemplo, Oracle
Develop Forms e Reports. Ao adicionar recursos de processamento
procedural a essas ferramentas, a linguagem PL/SQL aumenta o
desempenho.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


31

4.2.3. CARACTERÍSTICAS

OPERAÇÕES PERMITIDAS

• Manipulação de Dados: alteração, eliminação, inclusão e seleção;


• Criar variáveis e constantes herdando o tipo de dados e o tamanho de
outras variáveis e constantes ou de colunas de tabelas;
• Criar cursores para tratar o resultado de uma query que retorna 0 ou
mais linhas;
• Criar registros para guardar o resultado de um cursor ou campos de
tabelas, herdando os tipos de dados e o tamanho das colunas;
• Tratar erros;
• Criar labels para controlar o fluxo de execução;
• Utilizar comando de repetição e comparação.
• Criar triggers (gatilhos) para garantia de integridade (restrições),
segurança, etc.

4.3. ESTRUTURA DE UM BLOCO PL/SQL


A estrutura de um bloco PL/SQL é composta por uma área de declaração,
uma área de comandos e uma área de exceções:

Ilustrando:

DECLARE – opcional
Declarações – variáveis, cursores, constantes, estruturas, tabelas, exceções definidas
pelo usuário
BEGIN - obrigatório
Estruturas executáveis (comandos)
Instruções SQL (manipular dados do banco de dados)
Instruções PL/SQL (manipular dados no bloco)
EXCEPTION - opcional
Tratamento de exceções (pode conter outros blocos)
Ações a serem desempenhadas qdo ocorrem erros ou condições anormais
END; - obrigatório

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


32

4.3.1. EXECUTANDO INSTRUÇÕES E BLOCOS PL/SQL A


PARTIR DO CÓDIGO SQL*PLUS

DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT column_name
INTO v_variable
FROM table_name;
EXCEPTION - opcional
WHEN exception_name THEN
........
END;

• Coloque um ponto-e-vírgula (;) no final de uma instrução SQL ou instrução


de controle PL/SQL;

• Use uma barra (/) para executar o bloco anônimo PL/SQL no buffer de
SQL*Plus. Quando o bloco for executado corretamente, sem erros que não
possam ser tratados, a saída de mensagem deverá ser a seguinte:

PL/SQL procedure successfully completed


(procedimento PL/SQL concluído corretamente)

• Coloque um ponto (.) para fechar um buffer de SQL*Plus. Um bloco


PL/SQL é tratado como uma instrução contínua no buffer e os ponto-e-
vírgulas no bloco não fecham ou executam o buffer;

• Em PL/SQL, um erro é chamado de exceção;

• Para salvar um bloco PL/SQL pode-se, também, utilizar o comando SAVE.


A PL poderá ser posteriormente executada usando o START ou @.

4.4. USO DE VARIÁVEIS

Com o código PL/SQL você poderá declarar variáveis para usá-las em


instruções procedurais e SQL onde uma expressão possa ser usada.

• Armazenamento temporário de dados: os dados podem ser armazenados


temporariamente em uma ou mais variáveis para uso quando na validação da

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


33

entrada de dados para processamento posterior no processo de fluxo de


dados;

• Manipulação de valores armazenados: as variáveis podem ser usadas para


cálculo e manipulação de outros dados sem acessar o banco de dados;

• Reutilização: quando declaradas, as variáveis podem ser usadas


repetidamente em uma aplicação simplesmente referenciando-as em outras
instruções, incluindo outras instruções declarativas;

• De fácil manutenção: ao usar %TYPE e %ROWTYPE, você declara


variáveis, baseando as declarações nas definições das colunas de banco de
dados. As variáveis PL/SQL ou variáveis de cursor anteriormente
declaradas no escopo atual, poderão usar também os atributos %TYPE e
%ROWTYPE como especificadores de tipos de dados. Se uma definição
subjacente for alterada, a declaração de variável se altera de acordo
durante a execução. Isso permite a independência dos dados, reduz custos
de manutenção e permite que os programas se adaptem, conforme o banco
de dados for alterado, para atender às novas necessidades comerciais.

4.4.1. TRATANDO VARIÁVEIS EM PL/SQL

• Declarar e inicializar as variáveis na seção de declaração;


• Atribuir novos valores às variáveis na seção executável;
• Passar valores aos subprogramas PL/SQL por meio de parâmetros: IN
passa valores, OUT retorna valores;
• Ver os resultados em um bloco PL/SQL por meio de variáveis de saída:
usar variáveis de referência.

4.4.2. TIPOS DE VARIÁVEIS PL/SQL

• Escalar: armazena um único valor.


• Composta: os registros permitem que os grupos de campos sejam
definidos e manipulados nos blocos PL/SQL.
• Referência: armazenam valores chamados de indicadores, que designam
outros itens de programa.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


34

• LOB: armazenam valores chamados de endereços, que especificam a


localização de objetos grandes (imagens gráficas) que são armazenados
fora de linha.

4.4.3. OUTROS TIPOS DE VARIÁVEIS PL/SQL

• BOOLEANO: TRUE / FALSE;


• DATE: definição de data;
• BLOB: definição de imagens (fotografia);
• LONG RAW: definição de textos longos;
• BFILE: definição de imagens animadas.

4.4.4. DECLARANDO VARIÁVEIS PL/SQL

Identificador [CONSTANT] tipo de dados [NOT NULL]


[:= | DEFAULT expr];

• Identificador : é nome da variável.


• CONSTANT : restringe as variáveis para que o seu valor não possa
ser alterado.
• Tipo de dados : escalares, compostos, referenciais ou LOB.
• NOT NULL : restringe a variável para que ela contenha um valor.
• Expr : é uma expressão PL/SQL que pode ser uma literal,
outra variável ou uma expressão que envolve operadores e funções.

Exemplo de instruções:
Declare
v_nascimento DATE;
v_codigo NUMBER(5) NOT NULL := 10;
v_cidade VARCHAR2(35) := ‘Assis’;
v_numero CONSTANT NUMBER := 1234;

4.4.5. ATRIBUINDO VALORES A VARIÁVEIS

Identificador := expr;

• Identificador : é nome da variável.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


35

• expr : é uma expressão PL/SQL que pode ser uma literal, uma
outra variável ou uma expressão que envolve operadores e funções.

Exemplo de instruções:
v_nascimento := ’30-AGO-01’

v_nome := ’Alex Poletto’

SQL> SELECT salario*0.20


2 INTO v_gratificacao
3 FROM professor
4 WHERE depto=2;

4.4.6. TIPOS DE DADOS ESCALARES BÁSICOS

Um tipo de dados escalares armazena um valor único e não possui


componentes internos. Os tipos de dados escalares podem ser classificados
em quatro categorias: número, caractere, data e booleano.

Tipo de dado Descrição


• VARCHAR2(maximum_length): Tamanho variável com até 32.767 bytes.
Não há tamanho default para as
constantes e variáveis VARCHAR2.
• NUMBER[(precisão, escala)] Tipo básico para números fixos e de
ponto flutuante.
• DATE Inclui hora do dia em segundos desde a
meia-noite. Entre 4712 A.C. e 9999 D.C.
• CHAR[(maximum_length)] Tamanho fixo com até 32.767 bytes. Se
você não especificar um comprimento, o
tamanho default será definido como 1.
• LONG Tamanho variável com até 32.767 bytes.
A largura máxima de uma coluna de banco
de dados LONG é de 2.147.483.647
bytes.
• LONG RAW Binaries e strings de byte de até 32.760
bytes. Não são interpretados pelo código
PL/SQL.
• BOOLEAN Lógicos: TRUE, FALSE ou NULL
• BINARY_INTEGER Inteiros entre –
2.147.483.647/2.147.483.647

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


36

• PLS_INTEGER Inteiros entre –


2.147.483.647/2.147.483.647. São mais
rápidos que os valores NUMBER e
BYNARY_INTEGER.

Exemplo de instruções:
v_descricao VARCHAR2(30);
v_contador BINARY_INTEGER := 0;
v_soma NUMBER(10,2) := 0;
v_reserva DATE := SYSDATE + 7;
c_taxa CONSTANT NUMBER(5,2) := 15.30;
v_filhos BOOLEAN NOT NULL := TRUE;
v_preco1 NUMBER(10,2) := 1500
v_preco2 NUMBER(10,2) := 2500
v_aumento BOOLEAN := (v_preco1 < v_preco2);

4.4.7. O ATRIBUTO %TYPE

Utilizado para declarar uma variável de acordo com uma definição de coluna
de banco de dados ou de acordo com outra variável anteriormente
declarada.

Exemplo de instruções:
…..
v_descricao depto.descricao%TYPE
v_salario v_soma%TYPE := 0;
…..

4.4.8. VARIÁVEIS DE TIPO DE DADOS LOB

Utilizado para armazenar blocos de dados não estruturados (texto, imagens


gráficas, videoclipes e formatos de arquivo para armazenar sons) de até 4
gigabytes em tamanho. Os tipos de dados LOB fornecem acesso eficiente,
aleatório e em intervalos aos dados, podendo ser atributos de um tipo de
objeto.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


37

Tipo de dado Descrição


• CLOB Armazenar blocos grandes de dados com caracteres de
um único byte no banco de dados.
• BLOB Armazenar objetos binários grandes no banco de dados
em linha ou fora de linha.
• BFILE Armazenar objetos grandes binários em arquivos do
sistema operacional fora do banco de dados.
• NCLOB Armazenar blocos grandes de dados NCHAR de byte
único ou de bytes múltiplos de largura fixa no banco de
dados, dentro e fora de linha.

4.4.9. VARIÁVEIS DE LIGAÇÃO

Uma variável de ligação é uma variável que você declara em um ambiente de


host e usa para passar valores de tempo de execução, número ou caractere,
para ou de um ou mais programas PL/SQL, os quais podem usá-la como
usariam qualquer outra variável.

Exemplo de instruções para declarar


SQL> VARIABLE retorna_codigo NUMBER
SQL> VARIABLE retorna_mensagem VARCHAR2(35)

Exemplo de instruções para exibir


SQL> PRINT retorna_codigo

4.4.10. DBMS_OUTPUT.PUT_LINE

• Um procedimento de pacote fornecido pela Oracle;


• Uma alternativa para exibir dados a partir de um bloco PL/SQL;
• Deverá ser ativado em SQL*Plus com SET SERVEROUTPUT ON

Exemplo de instruções:
SET SERVEROUTPUT ON
ACCEPT v_anual PROMPT ‘Entre com o salário anual.:’
DECLARE
v_salario NUMBER(10,2) := &v_anual;
BEGIN
v_salario := v_salario/12;
DBMS_OUTPUT.PUT_LINE (‘O salário mensal é ‘ | | TO_CHAR(v_salario));
END;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


38

4.5. CRIANDO INSTRUÇÕES EXECUTÁVEIS

4.5.1. DIRETRIZES E SINTAXE DE BLOCO PL/SQL

• As instruções podem continuar por várias linhas;


• As unidades lexicais podem ser separadas por: espaços, delimitadores,
identificadores, literais e comentários.

DELIMITADORES

Símbolos Simples Símbolos Compostos


Símbolo Significado Símbolo Significado
+ Adicionar <> Relacional
- Subtrair != Relacional
* Multiplicar || Concatenação
/ Dividir -- Comentário de 1
linha
= Relacional /* Inicia comentário
@ Acesso remoto */ Finaliza comentário
: Finalizador := Atribuição
instruções

IDENTIFICADORES

• Podem conter até 30 caracteres;


• Não podem conter palavras reservadas, a não ser que estejam entre aspas
duplas (“SELECT”);
• Devem ser iniciados por um caractere alfabético;
• Não devem ter o mesmo nome de uma coluna de tabela de banco de dados.

LITERAIS

• (é um valor booleano, um valor numérico explícito, um caractere ou uma


string não representados por um identificador.
o Caracteres e literais de data devem estar entre aspas simples;
o Os números poderão ser valores simples ou notações científicas;
• Um bloco PL/SQL é finalizado por uma barra (/) em uma linha sozinha.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


39

4.5.2. COMENTANDO CÓDIGO

• Crie prefixos de dois hífens (--) para comentários de uma única linha;
• Coloque os comentários de várias linhas entre os símbolos /* e */.

…..
v_salario NUMBER(10,2);
BEGIN
/* computer o salário annual baseado nos salários mensais
para usá-lo em cálculos */
v_salário := &v_anual * 12;
END; -- Final do bloco

4.5.3. FUNÇÕES SQL NÃO DISPONÍVEIS EM PL/SQL

• Funções de grupo: AVG, MIN, MAX, COUNT, SUM, STDDEV e


VARIANCE. Somente funcionam em instruções SQL dentro de um bloco
PL/SQL

Obs: Assim não funciona: v_total := SUM (salario);

4.5.4. FUNÇÕES PL/SQL

• Criar uma lista de correspondência:

Exemplo de instruções:

v_lista_endereco := v_nome | | CHR(10) | |


v_endereço | | CHR(10) | | v_estado | |
CHR(10) | | v_cep;

• CH(10) = ENTER

Exemplo de instruções:
v_nome := LOWER(v_nome);

• Converte em letra minúscula

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


40

4.5.5. CONVERSÃO DE TIPOS DE DADOS

• As funções de conversão: TO_CHAR, TO_DATE e TO_NUMBER são


utilizadas para conversão de dados compatíveis.

TO_CHAR (valor, fmt)


• valor : é uma string de caractere, número ou data
TO_DATE (valor, fmt)
TO_NUMBER (valor, fmt)

• fmt : é o modelo de formato usado para converter o valor

Exemplo de instruções:
v_data := TO_DATE (‘September 20, 2001’, ‘Month DD, YYYY’);

4.5.6. OPERADORES EM PL/SQL

Operador Operação
**, NOT Exponenciação, negação, lógica
+, - Identidade, negação
*, / Multiplicação, divisão
+, -, || Adição, subtração, concatenação
=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN Comparação
AND Conjunção
OR Disjunção

4.6. INTERAGINDO COM O ORACLE SERVER

4.6.1. INSTRUÇÕES SQL EM PL/SQL

• Extrair uma linha de dados de um banco de dados usando o comando


SELECT;
• Fazer alterações nas linhas no banco de dados usando os comandos DML;
• Controlar uma transação com o comando COMMIT, ROLLBACK ou
SAVEPOINT;
• Determinar o resultado do DML com cursores implícitos.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


41

COMPARANDO OS TIPOS DE INSTRUÇÕES SQL E PL/SQL

• Um bloco PL/SQL não é uma unidade de transação. Os comandos COMMIT,


SAVEPOINT e ROLLBACK são independentes dos blocos, mas você pode
emitir esses comandos em um bloco;
• O PL/SQL não suporta instruções em DDL como, por exemplo, CREATE
TABLE, ALTER TABLE ou DROP TABLE;
• O PL/SQL não suporta instruções em DCL como, por exemplo, GRANT ou
REVOKE.

4.6.2. INSTRUÇÃO SELECT EM PL/SQL – A CLÁUSULA


INTO É NECESSÁRIA.

Exemplo de instruções:
DECLARE
v_codigo NUMBER(2);
v_descricao VARCHAR2(15);
BEGIN
SELECT codigo, descricao
INTO v_codigo, v_descricao
FROM depto
WHERE codigo=1;
END;
*/ devem retornar apenas um valor, caso contrário ocorrerá erros */

DECLARE
v_codigo depto.codigo%TYPE;
v_descricao depto.descricao%TYPE;
BEGIN
SELECT codigo, descricao
INTO v_codigo, v_descricao
FROM depto
WHERE codigo=2;
END;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


42

DECLARE
v_soma_salario professor.salario%TYPE;
v_codigo NUMBER NOT NULL := 2;
BEGIN
SELECT SUM (salario)
INTO v_soma_salario
FROM professor
WHERE codigo=v_codigo;
END;
*/ devem retornar apenas um valor, caso contrário ocorrerá erros */

4.6.3. INSTRUÇÃO INSERT EM PL/SQL.

Exemplo de instruções:
BEGIN
INSERT INTO professor(codigo, nome, salario, nascimento)
VALUES (codigo_sequence.NEXTVAL, ‘Douglas’, 1450, ’10-DEC-00’);
END;

4.6.4. INSTRUÇÃO UPDATE EM PL/SQL.

Exemplo de instruções:
DECLARE
v_aumento professor.salario%TYPE := 245;
BEGIN
UPDATE professor
SET salario = salario + v_aumento
WHERE codigo=10;
END;

4.6.5. INSTRUÇÃO DELETE EM PL/SQL.

Exemplo de instruções:
DECLARE
v_codigo professor.codigo%TYPE := 9;
BEGIN
DELETE FROM professor
WHERE codigo=v_codigo;
END;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


43

4.7. CURSOR SQL

• Um cursor é uma área de trabalho SQL particular;


• Há dois tipos de cursores: implícitos e explícitos;
• O Oracle Server usa cursores implícitos para analisar e executar as
instruções SQL;
• Os cursores explícitos são declarados especificamente pelo programador.
• Sempre que você emitir uma instrução SQL, o Oracle Server abrirá uma
área de memória na qual o comando é analisado e executado. Essa área é
chamada de cursor.

4.7.1 ATRIBUTOS DO CURSOR SQL

• Ao usar os atributos do cursor SQL, você poderá testar os resultados das


instruções SQL.

SQL%ROWCOUNT Número de linhas afetadas pela instrução SQL mais recente.


SQL%FOUND Atributo booleano avaliado para TRUE se a instrução SQL mais
recente afetar uma ou mais linhas.
SQL%NOTFOUND Atributo booleano avaliado para TRUE se a instrução SQL mais
recente não afetar uma ou mais linhas.
SQL%ISOPEN Sempre é avaliado para FALSE porque o PL/SQL fecha os
cursores implícitos imediatamente após a execução.

Excluir linhas que especificam um código de um professor a partir da tabela


PROFESSOR. Imprimir o número de linhas excluídas.

Exemplo de instruções:
VARIABLE rows_deleted VARCHAR2(30)
DECLARE
v_codigo NUMBER := 4;
BEGIN
DELETE FROM professor
WHERE codigo=v_codigo;
: rows_deleted := (SQL%ROWCOUNT | | ‘ rows deleted.’);
END;
/
PRINT rows_deleted

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


44

4.8. CRIANDO ESTRUTURAS PARA CONTROLE

4.8.1 CONTROLANDO O FLUXO DE EXECUÇÃO PL/SQL

Você pode alterar o fluxo lógico de instruções dentro do bloco PL/SQL com
diversas estruturas para controle. Esta lição aborda os dois tipos de
estruturas para controle do PL/SQL: construções condicionais com a
instrução IF e estruturas para controle LOOP.

Existem três formatos de instruções IF:


• IF-THEN-END IF
• IF-THEN-ELSE-END IF
• IF-THEN-ELSIF-END IF

INSTRUÇÕES IF

IF condição THEN
instruções
[ELSIF condição THEN
instruções;]
[ELSE
Instruções;]
END IF

• Condição : é uma expressão ou variável Booleana (TRUE, FALSE ou


NULL).
• Esta associada a uma seqüência de instruções, que será executada
somente se a expressão produzir TRUE.
• THEN : é uma cláusula que associa a expressão Booleana que a
precede com a seqüência de instruções posteriores.
• instruções : pode ser uma ou mais instruções SQL ou PL/SQL.
• ELSIF : é uma palavra-chave que introduz uma expressão Booleana.
• ELSE : é uma palavra-chave que se for atingida pelo controle,
executará a seqüência de instruções que segue a palavra-chave.

INSTRUÇÃO IF-THEN-END IF

Definir o código do gerente como 10 se o nome do funcionário for Alex.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


45

Exemplo de instruções:

IF nome = ‘Alex’ THEN


mensagem := 10;
END IF;

A estrutura da instrução IF do PL/SQL é semelhante à estrutura das


instruções IF em outras linguagens procedurais. Ela permite que o PL/SQL
execute ações de modo seletivo com base em condições.

Definir um aumento de 20% do salário atual se o nome for Alex.


Exemplo de instruções:

.....
IF nome = ‘Alex’ THEN
v_novo_salario := salario * 1.20;
END IF;
......

INSTRUÇÃO IF-THEN-ELSE-END IF

Definir um indicador aprovado quando a média for maior-igual a sete e


reprovado caso contrário.

Exemplo de instruções:

.....
IF media >= 7 THEN
v_mensagem := ‘Aprovado’;
ELSE
v_mensagem := ‘Reprovado’;
END IF;
.....

INSTRUÇÃO IF-THEN-ELSIF-THEN-END IF

Definir aumento salarial de acordo com as faixas salariais: até 500.00 –


25%, de 500.01 até 1500.00 -15% e acima de 1500.01 – 10%.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


46

Exemplo de instruções:

.....
IF salario < 500.00 THEN
v_novo_salario := salario * 1.25;
ELSIF salario < 1000.00 THEN
v_novo_salario := salario + (salario*15/100);
ELSE
v_novo_salario := salario * 1.10;
END IF;
.....

4.8.2. CONTROLE ITERATIVO: INSTRUÇÕES LOOP

O PL/SQL oferece diversos recursos para estruturar loops para repetirem


uma instrução ou seqüência de instruções várias vezes.

As construções em loop são o segundo tipo de estrutura para controle:

• Loop básico para fornecer ações repetitivas sem condições gerais;


• Loops FOR para fornecer controle iterativo para ações com base em uma
contagem;
• Loops WHILE para fornecer controle iterativo para ações com base em
uma condição;
• Instrução EXIT para terminar loops.

LOOP BÁSICO

LOOP
Instrução1;
.....
EXIT [WHEN condição];
Instruções;]
END LOOP;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


47

Exemplo de instruções:

DECLARE
v_codigo produto.codigo%TYPE := 21;
v_contador NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO produto (codigo,numero)
VALUES(v_codigo, v_contador);
v_contador := v_contador + 1;
EXIT WHEN v_contador > 10;
END LOOP;
END;

FOR LOOP

FOR contador IN [REVERSE] lower_bound..upper_bound LOOP


instrução1;
instrução2;
.....
END LOOP;

• Usar um FOR LOOP para desviar o teste para o número de iterações;


• Não declarar o contador; ele é declarado implicitamente como um inteiro.
Os FOR LOOPs têm a mesma estrutura geral do loop básico. Além disso,
eles têm uma instrução para controle no início da palavra-chave LOOP para
determinar o número de iterações que o PL/SQL executa.
• contador : é um inteiro declarado implicitamente cujo valor
aumenta ou diminui automaticamente em 1 cada iteração do loop até o
limite superior ou inferior a ser alcançado;
• Instrução : pode ser uma ou mais instruções SQL ou PL/SQL;
• REVERSE : faz o contador decrescer a cada iteração a partir do
limite superior até o limite inferior;
• lower_bound : especifica o limite inferior da faixa de valores do
contador;
• upper_bound : especifica o limite superior da faixa de valores do
contador.

Exemplo de instruções com inferior e superior fixos:

FOR i IN 1..3 LOOP


instrução1;
END LOOP;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


48

Exemplo de instruções com inferior e superior declarados como variáveis:


DECLARE
v_inferior := 1;
v_superior := 50;
BEGIN
FOR i IN v_inferior..v_superior LOOP
instrução1;
END LOOP;
END;

Inserir os 5 novos produtos para o número do pedido 10.

Exemplo de instruções
DECLARE
v_codigo pedido.codigo%TYPE := 10;
BEGIN
FOR i IN 1..5 LOOP
INSERT INTO pedido (pedido, produto)
VALUES (v_codigo, i);
END LOOP;
END;

WHILE LOOP

WHILE condição LOOP


instrução1;
instrução2;
.....
END LOOP;

• Usar um WHILE LOOP para repetir instruções enquanto um condição for


TRUE;
Utiliza-se o WHILE LOOP para repetir uma seqüência de instruções até a
condição para controle não ser mais TRUE. A condição é avaliada ao início de
cada iteração. O LOOP terminará quando a condição for FALSE. Se a
condição for FALSE no início do loop, nenhuma iteração futura será
executada.
• condição : é uma expressão ou variável booleana;
• instrução : pode ser uma ou mais instruções SQL ou PL/SQL.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


49

Exemplo de instruções:
ACCEPT v_pedido PROMPT ‘Incluir o número do pedido:’
ACCEPT v_produto PROMPT ‘Incluir o número de produtos no pedido:’
DECLARE
v_contador NUMBER(2) := 1;
BEGIN
WHILE v_contador <= &v_produto LOOP
INSERT INTO pedido (pedido, produto)
VALUES (&v_pedido, v_contador);
v_contador := v_contador + 1;
END LOOP;
COMMIT;
END;

4.9. CRIANDO CURSORES IMPLÍCITOS E


EXPLÍCITOS

O Oracle Server usa áreas de trabalho chamadas áreas SQL particulares


para executar instruções SQL e para armazenar informações de
processamento. Você pode usar cursores do PL/SQL para nomear uma área
SQL particular e acessar suas informações armazenadas. O cursor orienta
todas as fases do processamento.

4.9.1. CURSORES IMPLÍCITOS

Os cursores implícitos são declarados implicitamente pelo PL/SQL para


todas as instruções DML e PL/SQL SELECT, incluindo consultas que
retornam somente uma linha.

4.9.2. CURSORES EXPLÍCITOS

São usados para consultas que retornam mais de uma linha. Os cursores
explícitos são declarados e nomeados pelo programador e manipulados por
meio de instruções específicas nas ações executáveis do bloco.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


50

FUNÇÕES DO CURSOR EXPLÍCITO

Use cursores explícitos para processar individualmente cada linha


retornada por uma instrução SELECT de várias linhas.

O conjunto de linhas retornado por uma consulta de várias linhas é chamado


conjunto ativo. Seu tamanho é o número de linhas que atende aos critérios
da pesquisa. O cursor explícito aponta para a linha atual do conjunto ativo.
Isso permite que o programa processe as linhas uma de cada vez.

Um programa PL/SQL abre um cursor, processa linhas retornadas por uma


consulta e, em seguida, fecha o cursor. O cursor marca a posição atual no
conjunto ativo.

• Pode processar além da primeira linha retornada pela consulta, linha por
linha;
• Controla que linha está sendo processada no momento;
• Permite que o programador controle as linhas manualmente no bloco
PL/SQL.

CONTROLANDO CURSORES EXPLÍCITOS

1. Cria uma área SQL nomeada;


2. Identifica o conjunto ativo;
3. Carrega a linha atual para variáveis;
4. Testa para linhas existentes;
5. Retorna para FETCH se encontrar linhas;
6. Libera o conjunto ativo.

CONTROLANDO CURSORES EXPLÍCITOS USANDO QUATRO


COMANDOS

1. Declare o cursor nomeando-o e definindo a estrutura da consulta a ser


executada dentro dele;
2. Abra o cursor. A instrução OPEN executa a consulta e vincula as variáveis
que estiverem referenciadas. As linhas identificadas pela consulta são
chamadas conjunto ativo e estão agora disponíveis para extração;
3. Extraia dados do cursor. Após cada extração você testa o cursor para
qualquer linha existente. Se não existirem mais linhas para serem
processadas, você precisará fechar o cursor;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


51

4. Feche o cursor. A instrução CLOSE libera o conjunto ativo de linhas.


Agora é possível reabrir o cursor e estabelecer um novo conjunto ativo.

DECLARANDO O CURSOR

CURSOR cursor_name IS
select_statement;

• Não inclua a cláusula INTO na declaração do cursor;


• Caso seja necessário o processamento de linhas em uma seqüência
específica, use a cláusula ORDER BY na consulta.
• cursor_name : é um identificador do PL/SQL.
• select_statement : é uma instrução SELECT sem uma cláusula INTO.

Exemplos de instruções:
DECLARE
v_matricula professor.matricula%TYPE;
v_nome professor.nome%TYPE;
CURSOR professor_cursor IS
SELECT matricula, nome
FROM professor
CURSOR depto_cursor IS
SELECT * FROM depto
WHERE codigo=10;
BEGIN
.....

ABRIR O CURSOR

OPEN cursor_name;

EXTRAINDO DADOS DO CURSOR

FETCH cursor_name INTO [[variavel1, variavel2, ...] | record_name];

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


52

Exemplos de instruções:

.....
OPEN defined_cursor;
LOOP
FETCH defined_cursor INTO defined_variables
EXIT WHEN ...;
.....
-- Processo dos dados
.....
END;

Recupere os primeiros 5 professores, um por um.

DECLARE
v_codigo professor.codigo%TYPE;
v_nome professor.nome%TYPE;
CURSOR professor_cursor IS
SELECT codigo, nome
FROM professor
BEGIN
OPEN professor_cursor;
FOR i IN 1..5 LOOP
FETCH professor_cursor INTO v_codigo, v_nome;
.....
END LOOP;
CLOSE professor_cursor;
END;

FECHAR O CURSOR

CLOSE cursor_name;

Obs: o parâmetro OPEN_CURSORS = número, define o número de cursores


que pode ser abertos por um usuário.

ATRIBUTOS DO CURSOR EXPLÍCITO

Atributo Tipo Descrição


%ISOPEN Booleano Será avaliado para TRUE se o cursor estiver aberto.
%NOTFOUND Booleano Será avaliado para TRUE se a extração mais recente não
retornar uma linha.
%FOUND Booleano Será avaliado para TRUE se a extração mais recente não
retornar uma linha; complemento de %NOTFOUND
%ROWCOUNT Número Será avaliado para o número total de linhas retornadas
até o momento.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


53

%ISOPEN

IF NOT professor_cursor%ISOPEN THEN


OPEN professor_cursor;
END IF;
LOOP
FETCH professor_cursor ...

%NOTFOUND

Recupere os primeiros 5 professores, um por um.

DECLARE
v_codigo professor.codigo%TYPE;
v_nome professor.nome%TYPE;
CURSOR professor_cursor IS
SELECT codigo, nome
FROM professor
BEGIN
OPEN professor_cursor;
LOOP
FETCH professor_cursor INTO v_codigo, v_nome;
EXIT WHEN professor_cursor%ROWCOUNT > 5
OR professor_cursor%NOTFOUND;
.....
END LOOP;
CLOSE professor_cursor;
END;

4.10. TRATAMENTO DE EXCEÇÕES

Exceção é um identificador em PL/SQL que é criado durante a execução.


Ela é criada quando ocorre um erro do Oracle ou quando você a cria
explicitamente. Ela é tratada capturando-a com um handler ou propagada
para o ambiente de chamada.

TIPOS DE EXCEÇÃO

• Predefinida pelo Oracle Server (20 erros)


• Não predefinida pelo Oracle Server
• Definida pelo usuário

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


54

EXCEÇÕES PREDEFINIDAS

Nome da Exceção Número Descrição


ACCESS_INTO_NULL ORA-06530 Tentativa de atribuir valores aos
atributos de um objeto não
inicializado
COLLECTION_IS_NULL ORA-06531 Tentativa de aplicação de métodos
de conjunto diferentes de
EXISTS para um varray ou tabela
aninhada não inicializada
CURSOR_ALREADY_OPEN ORA-06511 Tentativa de abertura de um
cursor já aberto
DUP_VAL_ON_INDEX ORA-00001 Tentativa de inserção de um valor
duplicado
INVALID_CURSOR ORA-01001 Ocorreu operação ilegal de cursor
INVALID_NUMBER ORA-01722 Falha da conversão de string de
caracteres para número
LOGIN_DENIED ORA-01017 Estabelecendo login com o Oracle
com um nome de usuário ou senha
inválida
NO_DATA_FOUND ORA-01403 SELECT de linha única não
retornou dados
NOT_LOGGED_ON ORA-01012 O programa PL/SQL emite uma
chamada de banco de dados sem
estar conectado ao Oracle
PROGRAM_ERROR ORA-06501 O código PL/SQL tem um problema
interno
ROWTYPE_MISMATCH ORA-06504 Variável de cursor de host e
variável de cursor PL/SQL
envolvidas em uma atribuição tem
tipos de retorno incompatíveis
STORAGE_ERROR ORA-06500 O PL/SQL esgotou a memória ou a
memória está corrompida
SUBSCRIPT_BEYOND_COUNT ORA-06533 Feita referência ao elemento de
varray ou tabela aninhada usando
um número de índice maior do que
o número de elementos no conjunto
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Feita referência a um elemento
TIMEOUT_ON_RESOURCE ORA-00051 Ocorreu timeout enquanto o
Oracle está aguardando por um
recurso
TOO_MANY_ROWS ORA-01422 SELECT de uma única linha
retornou mais de uma linha
VALUE_ERROR ORA-06502 Ocorreu erro aritmético, de
conversão, truncamento ou
restrição de tamanho
ZERO_DIVIDE 0RA-01476 Tentativa de divisão por zero

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


55

BEGIN
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN DUP_VAL_ON_INDEX THEN
statement1;
statement2;
statement3;
END;

FUNÇÕES PARA CAPTURAR EXCEÇÕES

DECLARE
v_error_code NUMBER;
v_error_message VARCHAR(255);
BEGIN
....
EXCEPTION
....
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE;
v_error_message := SQLERRM;
INSERT INTO errors VALUES(v_error_code, v_error_message);
END;

4.11. PROCEDIMENTO ARMAZENADO, FUNÇÃO,


GATILHO e PACOTE

Procedimentos Armazenados, Funções, Gatilhos e Pacotes são quatro


recursos de grande utilidade em Sistemas de Bancos de Dados (KROENKE,
1999). Eles também podem cooperar com as ferramentas de
desenvolvimento de aplicação de usuários finais, adicionando recursos de
processamento. Além disso, esses recursos também possibilitam declarar
variáveis com base em atributos de conjuntos de entidades do próprio banco
de dados, levando o código a se tornar independente de modificações físicas
ocorridas com os atributos.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


56

Com a utilização desses recursos, consegue-se uma redução no número de


linhas de códigos a serem programadas por ferramentas utilizadas no
desenvolvimento das aplicações dos usuários finais. Inúmeras das regras de
negócio, de restrições e de integridade, podem ser programadas
diretamente no Banco de Dados, permitindo, às aplicações finais, conter
apenas instruções básicas, sem o objetivo de garantir a integridade, toda
vez que uma rotina for programada. Isso possibilita que as aplicações finais
tornem-se mais leves, além de disporem de um código mais simples.

4.11.1. ESQUEMA DO BANCO DE DADOS

Para melhor andamento da disciplina, será utilizada a seguinte estrutura de


dados:

TABELA DE FUNCIONÁRIOS (TABFUN)


CAMPO TIPO RESTRIÇÃO REFERENCES
MATRICULA Number(5) Primary Key
NOME Varchar(35) Not Null
SALARIO Number(9,2) Check > 0
ADMISSAO Date Not Null
CARGO Number(2) Foreign Key TABCAR

TABELA DE DEPENDENTES (TABDEP)


CAMPO TIPO RESTRIÇÃO REFERENCES
MATRICULA Number(5) Primary Key/Foreign Key TABFUN
SEQUENCIA Number(2) Primary Key
NOME Varchar(35) Not Null
NASCIMENTO Date Not Null

TABELA DE CARGOS (TABCAR)


CAMPO TIPO RESTRIÇÃO REFERENCES
CODIGO Number(5) Primary Key
DESCRICAO Varchar(30) Not Null

TABELA DE REGISTROS DE ALTERAÇÃO DE CARGO (TABREG)


CAMPO TIPO RESTRIÇÃO REFERENCES
MATRICULA Number(5) Primary Key/Foreign Key TABFUN
CARGO Number(2) Primary Key/Foreign Key TABCAR
DATA Date Primary Key
SALARIO Number(9,2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


57

MOVIMENTO RELACIONAL

TABREG
TABFUN
MATRICULA
MATRICULA
TABCAR CARGO
NOME
CODIGO DATA
SALARIO
DESCRICAO SALARIO
ADMISSAO
CARGO
TABDEP
MATRICULA
SEQUENCIA
NOME
NASCIMENTO

CRIAÇÃO DAS TABELAS

Tabela de Cargos
CREATE TABLE tabcar
(codigo NUMBER(2),
descricao VARCHAR2(35) NOT NULL,
CONSTRAINT tabcar_codigo_pk PRIMARY KEY (codigo));

Tabela de Funcionários
CREATE TABLE tabfun
(matricula NUMBER(5),
nome VARCHAR2(35) NOT NULL,
salario NUMBER(9,2) CHECK (salario > 0),
admissao DATE NOT NULL,
cargo NUMBER(2),
CONSTRAINT tabfun_matricula_pk PRIMARY KEY (matricula),
CONSTRAINT tabfun_cargo_fk FOREIGN KEY (cargo)
REFERENCES tabcar(codigo));

Tabela de Dependentes
CREATE TABLE tabdep
(matricula NUMBER(5),
sequencia NUMBER(2),
nome VARCHAR2(35) NOT NULL,
nascimento DATE NOT NULL,
CONSTRAINT tabdep_matricula_pk PRIMARY KEY (matricula,sequencia),
CONSTRAINT tabdep_matricula_fk FOREIGN KEY (matricula)
REFERENCES tabfun(matricula));

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


58

Tabela de Registros
CREATE TABLE tabreg
(matricula NUMBER(5),
cargo NUMBER(2),
data DATE,
salario NUMBER(9,2),
CONSTRAINT tabreg_pk PRIMARY KEY (matricula, cargo, data));

CARGA NA BASE DE DADOS

INSERT INTO tabcar VALUES (1,’Coordenador Técnico’);


INSERT INTO tabcar VALUES (2,’Jogador de Futebol’);
INSERT INTO tabcar VALUES (3,’Técnico de Futebol’);

INSERT INTO tabfun VALUES (10,'Pareira',90000,'01/01/2002',3);


INSERT INTO tabfun VALUES (11,'Ricardinho',80000,'02/02/2000',2);
INSERT INTO tabfun VALUES (12,'Vampeta',75000,'10/10/2002',2);
INSERT INTO tabfun VALUES (13,'Zagalo',100000,'12/10/2002',1);
INSERT INTO tabfun VALUES (14,'Felipão',200000,'04/05/2001',3);
INSERT INTO tabfun VALUES (15,'Falcão',300000,'10/11/2002',1);

INSERT INTO tabdep VALUES (10,1,'Pareira Júnior','01/01/1998');


INSERT INTO tabdep VALUES (11,1,'Ricardinho Júnior','02/02/1999');
INSERT INTO tabdep VALUES (12,1,'Vampeta Júnior','10/10/1997');
INSERT INTO tabdep VALUES (13,1,'Zagalo Júnior','12/10/2000');
INSERT INTO tabdep VALUES (14,1,'Felipão Júnior','04/05/1996');
INSERT INTO tabdep VALUES (15,1,'Falcão Júnior','10/11/1995');
INSERT INTO tabdep VALUES (10,2,'Pareira Filha','01/01/2003');

INSERT INTO tabreg VALUES (10,3,'01/01/2002',90000);


INSERT INTO tabreg VALUES (11,2,'03/02/2000',80000);
INSERT INTO tabreg VALUES (12,2,'20/01/2002',75000);
INSERT INTO tabreg VALUES (13,1,'01/01/2002',100000);
INSERT INTO tabreg VALUES (14,3,'10/01/2000',200000);
INSERT INTO tabreg VALUES (15,1,'03/01/2002',300000);

Obs: se instalação em Inglês, usar o formato dd/mm/aaaa para os campos


tipo date.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


59

4.11.2. PROCEDIMENTO ARMAZENADO (Stored Procedure)

Segundo Price (2009, p.386), um procedimento contém um grupo de


instruções SQL e PL/SQL. Os procedimentos permitem centralizar sua
lógica do negócio no banco de dados e podem ser usados por qualquer
programa que acesse o banco de dados.

Costa (2006, p.158) salienta que procedimentos armazenados são


procedimentos análogos aos existentes em linguagens de programação
tradicionais, mas que terão seu código fonte armazenado no servidor de
banco de dados, o qual é capaz de compilá-lo e executá-lo.

Segundo Fanderuff (2000, p.151), “os procedimentos armazenados são


‘subprogramas’ que têm por objetivo executar uma ação específica,
utilizando-se das instruções de processamento de dados da Linguagem
SQL”.

Um procedimento armazenado consiste em um bloco de instruções nomeado


que executa uma ação. Ele pode ser armazenado no banco de dados, como
um objeto de banco de dados, para execução repetida de qualquer ambiente
de chamada (KOCHHAR; KRAMER, 1998).

4.11.2.1. OBJETIVOS

• Descrever a utilidade dos procedimentos;


• Criar procedimentos;
• Chamar um procedimento;
• Ver erros em um procedimento;
• Remover um procedimento;
• Obter informações sobre um procedimento.

4.11.2.2. VISÃO GERAL DOS PROCEDIMENTOS

• Um procedimento é um bloco PL/SQL nomeado que executa uma ação;


• Um procedimento pode ser armazenado no banco de dados, como um
objeto de banco de dados, para execução repetida.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


60

4.11.2.3. SINTAXE PARA CRIAÇÃO DE PROCEDIMENTOS

CREATE [OR REPLACE] PROCEDURE nome_procedimento


(parâmetro1 [modo1] tipodedado1,
(parâmetro2 [modo2] tipodedado2,
. . .)
IS | AS
PL/SQL Block;

Parâmetro: é o nome de uma variável PL/SQL passada para o procedimento;


Modo: identifica o tipo de parâmetro (IN/OUT/IN OUT)
IN: (entrada) passa o valor do ambiente de chamada para o
procedimento.
OUT: (saída) retorna um valor do procedimento para o ambiente de
chamada.
IN OUT: (entrada saída) passa um valor do ambiente de chamada
para o procedimento, e o procedimento retorna um valor para o
ambiente de chamada.
Tipodedado: tipo do dado (datatype)
IS | AS: essas cláusulas são equivalentes, pode-se utilizar tanto uma quanto
a outra.
PL/SQL Block: é o corpo do procedimento que define as ações que serão
executadas quando o procedimento for executado.

Procedimento
parâmetro IN
Ambiente de parâmetro OUT
Chamada parâmetro IN OUT

(DECLARE)

BEGIN

EXCEPTION

END;

4.11.2.4. CRIANDO UM PROCEDIMENTO USANDO O SQL*PLUS

1. Digite o texto da instrução CREATE PROCEDURE em um editor de


texto;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


61

2. Use START para compilar o procedimento;


3. Use SHOW ERRORS para consultar erros de compilação;
4. Quando compilado de modo bem-sucedido, o procedimento estará pronto
para execução.

Exemplo1 (IN): Criando um procedimento para armazenar informações de


novos funcionários.

CREATE OR REPLACE PROCEDURE novos_funcionarios


(v_matricula IN tabfun.matricula%TYPE,
v_nome IN tabfun.nome%TYPE,
v_salario IN tabfun.salario%TYPE,
v_admissao IN tabfun.admissao%TYPE,
v_cargo IN tabfun.cargo%TYPE)
IS
BEGIN
INSERT INTO tabfun VALUES (v_matricula, v_nome, v_salario, v_admissao,
v_cargo);
COMMIT;
END novos_funcionarios;
/

Executando o procedimento direto.

EXECUTE novos_funcionarios (20,’Luizão’,100000,’01/01/2001’,2);

Executando o procedimento novos_funcionarios via bloco PL/SQL

BEGIN
novos_funcionarios (21,’Dida’,85000,’01/01/2002’,2);
END;
/

Consulta a tabela de funcionários


SELECT * FROM tabfun;

Caso você queira usar uma codificação automática para a matricula (auto-
numeração), crie uma seqüência e troque a variável v_matricula por essa
seqüência.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


62

Exemplo: Criando uma seqüência

CREATE SEQUENCE num_fun START WITH 40;

Trocando a variável v_matricula pela seqüência.

1º - Não esqueça de tirar a linha que define a variável v_matricula.


2º - Faça a seguinte mudança.

.......
VALUES (num_fun.NEXTVAL, v_nome, v_salario, v_admissão, v_cargo);
......

Exemplo2 (IN): Criando um procedimento para reajustar o salário dos


funcionários.

CREATE OR REPLACE PROCEDURE reajuste_salario


(v_matricula IN tabfun.matricula%TYPE,
v_reajuste IN tabfun.salario%TYPE)
IS
BEGIN
IF v_reajuste <= 100 THEN
UPDATE tabfun
SET salario = salario + (salario*v_reajuste/100)
WHERE matricula = v_matricula;
ELSE
DBMS_OUTPUT.PUT_LINE(‘Valor Inválido’);
END IF;
END reajuste_salario;
/

Executando o procedimento direto

EXECUTE reajuste_salario (10,10);

EXECUTE reajuste_salario (11,130);

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


63

Exemplo3 (OUT): Criando um procedimento para consultar funcionários.

CREATE OR REPLACE PROCEDURE consulta_fun


(v_matricula IN tabfun.matricula%TYPE,
v_nome OUT tabfun.nome%TYPE,
v_salario OUT tabfun.salario%TYPE,
v_admissao OUT tabfun.admissao%TYPE)
IS
BEGIN
SELECT nome, salario, admissao
INTO v_nome, v_salario, v_admissao
FROM tabfun
WHERE matricula = v_matricula;
END consulta_fun;
/

Salvar o fonte (procedimento) e em seguida cria-lo.

SAVE <caminho> nome_arq.sql


START <caminho> nome_arq.sql

Criando variáveis globais (de host) para utilizá-las na execução do


procedimento
VARIABLE g_nome VARCHAR2(35)
VARIABLE g_salario NUMBER
VARIABLE g_admissao VARCHAR2(10)

Executando o procedimento consulta_fun e mostrando os valores das


variáveis

EXECUTE consulta_fun (11, :g_nome, :g_salario, :g_admissao)


PRINT g_nome
PRINT g_salario
PRINT g_admissao ou
PRINT g_nome g_salario g_admissao

Exemplo4 (IN OUT): Criando um procedimento para formatar telefone.


CREATE OR REPLACE PROCEDURE telefone
(v_fone IN OUT VARCHAR2)
IS
BEGIN
v_fone :='('||substr(v_fone,1,2)||')'||substr(v_fone,3,4)||'-'||substr(v_fone,7,10);
DBMS_OUTPUT.PUT_LINE(v_fone);
END telefone;
/

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


64

Habilitando a saída de resultados na tela

SET SERVEROUTPUT ON

Executando o procedimento telefone via bloco PL/SQL


DECLARE
vfone VARCHAR2(17);
numero VARCHAR(14);
BEGIN
vfone := (‘&numero’);
telefone(vfone);
DBMS_OUTPUT.PUT_LINE(vfone);
END;
/

4.11.2.5. REMOVENDO UM PROCEDIMENTO USANDO O SQL*PLUS

DROP PROCEDURE nome_procedimento;

Exemplo1: Eliminar o procedimento consulta de funcionários

DROP PROCEDURE consulta_fun;

4.11.2.6. OBTENDO INFORMAÇÕES SOBRE UM PROCEDIMENTO

A tabela USER_PROCEDURES é utilizada para armazenar os procedimentos


criados. A seguir é apresentada sua estrutura.

COLUNA TIPO DESCRIÇÃO


------------------------- ------------------- ----------------------------------------------
OBJECT_NAME VARCHAR2(30) Nome do objeto
PROCEDURE_NAME VARCHAR2(30) Nome do procedimento
AGGREGATE VARCHAR2(3) Se é um procedimento agregado
IMPLTYPEOWNER VARCHAR2(30) O proprietário do tipo
IMPLTYPENAME VARCHAR2(30) O nome do tipo
PARALLEL VARCHAR2(3) Se é ativada para consultas paralelas
INTERFACE VARCHAR2(3)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


65

4.11.2.7. SUMÁRIO

• Um procedimento é um bloco PL/SQL nomeado que executa uma ação;


• Use parâmetros para especificar dados do ambiente de chamada para o
procedimento;
• Os procedimentos podem ser chamados de qualquer ferramenta ou
linguagem que suportem PL/SQL;
• Os procedimentos podem servir como blocos de construção de uma
aplicação.

EXERCÍCIOS:
1) Faça um procedimento para excluir funcionários.
2) Faça um procedimento para inserir dependentes.

4.11.3. FUNÇÕES (FUNCTION)

Segundo Price (2009, p.391), uma função é semelhante a um procedimento,


exceto que uma função deve retornar um valor, juntos, os procedimentos
armazenados e as funções às vezes são referidos como subprogramas
armazenados já que são pequenos programas.

4.11.3.1. OBJETIVOS

• Descrever os usos das funções;


• Criar funções;
• Chamar uma função;
• Remover uma função;
• Diferenciar entre um procedimento e uma função.

4.11.3.2. VISÃO GERAL DAS FUNÇÕES

• Uma função é um bloco PL/SQL nomeado que retorna um valor;


• Uma função pode ser armazenada no banco de dados, como um objeto de
banco de dados, para execução repetida;
• Uma função pode ser chamada como parte de uma expressão.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


66

4.11.3.3. SINTAXE PARA CRIAÇÃO DE FUNÇÕES

CREATE [OR REPLACE] FUNCTION nome_função


(parâmetro1 [modo1] tipodedados1,
parâmetro2 [modo2] tipodedados2,
. . .)
RETURN tipodedados
IS | AS
PL/SQL Block;

Parâmetro: é o nome de uma variável PL/SQL passada para o procedimento;


Modo: identifica o tipo de parâmetro (IN)
IN: (entrada) passa o valor do ambiente de chamada para o
procedimento.
Tipodedado: tipo do dado (datatype)
IS | AS: essas cláusulas são equivalentes, pode-se utilizar tanto uma quanto
a outra.
PL/SQL Block: é o corpo da função que define as ações que serão
executadas quando a função for executada.
OBS: o bloco PL/SQL deve ter pelo menos uma instrução RETURN.
• RETURN: retorna um valor da função para o ambiente de chamada.

Procedimento
parâmetro IN
Ambiente de
Chamada parâmetro OUT
parâmetro IN OUT

(DECLARE)

BEGIN

EXCEPTION

END;

4.11.3.4. GERENCIAR EXCEÇÕES EM TEMPO DE EXECUÇÃO

A função RAISE_APPLICATION_ERROR nos possibilita gerenciar qualquer


tipo de exceção em tempo de execução permitindo propagar para o
ambiente de chamada ou receber ações quando essas ocorrem.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


67

RAISE_APPLICATION_ERROR (numero_erro, texto_erro)

• numero_erro: é o número do erro definido pelo usuário. Deve estar entre


–20999 a -20000
• texto_erro: é a mensagem definida pelo usuário.

4.11.3.5. CRIANDO UMA FUNÇÃO

• Digite o texto para a instrução CREATE FUNCTION em um editor de


texto;
• Use START para compilar a função;
• Use SHOW ERRORS para consultar os erros de compilação;
• Quando a compilação for bem-sucedida, a função estará pronta para
execução.

Exemplo1: Criando uma função para consultar o salário dos funcionários.

CREATE OR REPLACE FUNCTION consulta_salario


(v_matricula IN tabfun.matricula%TYPE)
RETURN NUMBER
IS
v_salario tabfun.salario%TYPE := 0;
BEGIN
SELECT salario
INTO v_salario
FROM tabfun
WHERE tabfun.matricula = v_matricula;
RETURN (v_salario);
END consulta_salario;
/

4.11.3.6. EXECUTANDO FUNÇÕES

• Chame uma função como parte de uma expressão PL/SQL;


• Crie uma variável de host para armazenar o valor retornado;
• Execute a função. A variável de host será preenchida com o valor
RETURN.

Compila e cria a função:

START <caminho> nome_arq.sql

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


68

Criando variáveis de host


VARIABLE g_salario NUMBER

Executando a função
EXECUTE :g_salario := consulta_salario (11); ou
ACCEPT num_matricula PROMPT ‘Digite o número da matricula:’
EXECUTE :g_salario := consulta_salario (&num_matricula);

Consultando o valor
PRINT g_salario

EXECUTANDO UMA FUNÇÃO DE UM BLOCO PL/SQL

Crie um bloco PL/SQL para a execução:

SET SERVEROUTPUT ON

DECLARE
v_salario tabfun.salario%TYPE;
BEGIN
v_salario := consulta_salario (12);
DBMS_OUTPUT.PUT_LINE (v_salario);
END;
/

Exemplo2: Criar uma função para consultar quantas vezes o funcionário


mudou de cargo ou de salário.

CREATE OR REPLACE FUNCTION mudanca_salario


(v_matricula IN tabreg.matricula%TYPE)
RETURN NUMBER
IS
v_qtde NUMBER(5) := 0;
BEGIN
SELECT count(cargo)
INTO v_qtde
FROM tabreg
WHERE tabreg.matricula = v_matricula
GROUP BY cargo;
RETURN (v_qtde);
END mudanca_salario;
/
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
69

Executando a função mudanca_salario via bloco PL/SQL

DECLARE
v_quant NUMBER(5);
BEGIN
v_quant := mudanca_salario (12);
DBMS_OUTPUT.PUT_LINE (v_quant);
END;
/

4.11.3.7. REMOVENDO FUNÇÕES

Sintaxe:

DROP FUNCTION nome_função;

Exemplo1:

DROP FUNCTION consulta_salario;

4.11.3.8. OBTENDO INFORMAÇÕES SOBRE UMA FUNÇÃO

A tabela USER_PROCEDURES também armazena as funções criadas. A


seguir é apresentada sua estrutura.

COLUNA TIPO DESCRIÇÃO


------------------------- ------------------- ----------------------------------------------
OBJECT_NAME VARCHAR2(30) Nome do objeto
PROCEDURE_NAME VARCHAR2(30) Nome da função
AGGREGATE VARCHAR2(3) Se é uma função agregada
IMPLTYPEOWNER VARCHAR2(30) O proprietário do tipo
IMPLTYPENAME VARCHAR2(30) O nome do tipo
PARALLEL VARCHAR2(3) Se é ativada para consultas paralelas
INTERFACE VARCHAR2(3)

4.11.3.9. OBSERVAÇÕES

• Uma função definida pelo usuário obtém apenas parâmetros IN, e não
OUT ou IN OUT;
• Os tipos de dados devem ser tipos de dados SQL válidos, CHAR, DATE
ou NUMBER;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


70

• Os tipos de dados não podem ser tipos PL/SQL como BOOLEAN,


RECORD ou TABLE;
• Comandos INSERT, UPDATE ou DELETE não são permitidos.

4.11.3.10. SUMÁRIO

• Uma função é um bloco PL/SQL nomeado que deve retornar um valor;


• Uma função é chamada como parte de uma expressão;
• Uma função armazenada pode ser chamada em instruções SQL.

EXERCÍCIOS:
1) Faça uma função para consultar o nome do cargo.
2) Faça uma função para consultar os dependentes por funcionário.

4.11.4. PROCEDIMENTOS E FUNÇÕES

4.11.4.1. COMPARANDO PROCEDIMENTOS E FUNÇÕES

Procedimentos Funções
Executar como uma instrução PL/SQL Chamar como parte de uma expressão
Tipo de dados sem RETURN Deve conter um tipo de dados RETURN
Pode retornar nenhum, um ou muitos valores Deve retornar um valor único

4.10.4.2. BENEFÍCIOS DE FUNÇÕES E PROCEDIMENTOS

• Desempenho melhorado;
o Reduzir o número de chamadas ao banco de dados e diminuir o
tráfico na rede;
o Compartilhar execuções SQL por vários usuários.
• Manutenção melhorada;
o Modificar rotinas on-line sem interferir com outros usuários;
o Modificar uma rotina que afetará várias aplicações.
• Segurança de dados e Integridade melhorada.
o Controle sobre acessos indiretos aos objetos de banco de
dados executados por funcionários sem privilégios;
o Assegurar que ações relacionadas sejam executadas
conjuntamente.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


71

4.1.4.3. GERENCIANDO FUNÇÕES E PROCEDIMENTOS

A tabela USER_OBJECTS armazena os objetos criados junto ao banco de


dados, tais como procedimentos, funções, etc. A seguir, é apresentada a
estrutura da tabela USER_OBJECTS.

COLUNA TIPO DESCRIÇÃO


------------------------- ------------------- ----------------------------------------------
OBJECT_NAME VARCHAR2(128) Nome do objeto
OBJECT_ID NUMBER Identificação do objeto
OBJECT_TYPE VARCHAR2(19) Tipo do objeto
CREATED DATE Data de criação do objeto
LAST_DDL_TIME DATE Última modificação do objeto
TIMESTAMP VARCHAR2(19) Data e hora do objeto
STATUS VARCHAR2(7) Se é Válido ou inválido
TEMPORARY VARCHAR2(1) Se é temporário
SECONDARY VARCHAR2(1) Se é secundário

Consultando a tabela USER_OBJECTS

SELECT DISTINCT object_type FROM user_objects;

SELECT object_name, object_type, created


FROM user_objects
WHERE object_type IN (‘PROCEDURE’,’FUNCTION’);

A tabela USER_SOURCE armazena o código fonte referente aos objetos


criados. A seguir, é apresentada a estrutura da tabela USER_SOURCE.

COLUNA TIPO DESCRIÇÃO


------------------------- ------------------- ----------------------------------------------
NAME VARCHAR2(30) Nome do objeto
TYPE VARCHAR2(12) Tipo do objeto
LINE NUMBER Número da linha do código
TEXT VARCHAR2(4000) Código fonte

Consultando a tabela USER_SOURCE

SELECT * FROM user_source WHERE name='NOME_OBJETO'

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


72

Listar somente o código fonte

SELECT text FROM user_source


WHERE name=’CONSULTA_SALARIO’
Consultar erros de compilação
ORDER BY line;

Consultar tabelas DICT e USER_TABLES


SELECT table_name FROM dict;

SELECT table_name FROM user_tables;

Descrever as estruturas de armazenamento dos objetos

DESC user_objects

Descrever as estruturas das tabelas


DESC user_tables

Descrever as estruturas de funções, procedimentos e gatilhos

DESC user_source

Consultar erros de compilação


SHOW ERRORS

DESC user_errors

4.11.5. GATILHOS (TRIGGERS)

Segundo Price (2009, p.397) um gatilho é um procedimento executado (ou


disparado) automaticamente pelo banco de dados, quando uma instrução
DML (INSERT, UPDATE ou DELETE) especificada é executada em
determinada tabela do banco de dados. Os gatilhos são úteis para fazer
coisas como a auditoria avançada das alterações feitas nos valores de coluna
em uma tabela.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


73

Um gatilho consiste em um bloco de instruções ou subprograma acionado, de


forma implícita, pela aplicação do usuário final, por meio de ferramentas de
administração de bancos de dados ou pelo próprio banco de dados, sempre
que ocorrer um determinado evento de inclusão, atualização ou exclusão de
dados, associado a um conjunto de entidades, de acordo com a definição de
um instante de tempo (KOCHHAR; KRAMER, 1998; RAMALHO, 2005).

Na caracterização de um gatilho, há três fatores a serem considerados


(DATE, 2003):

a) especificar um evento que servirá como disparo do gatilho;


b) especificar as condições sob as quais o gatilho deve ser executado;
c) especificar as ações que serão tomadas quando um gatilho for disparado.

A especificação do evento consiste em delimitar o “evento” ou instrução a


ocorrer no Banco de Dados Operacional para que a “ação”, de acordo com as
“condições” avaliadas, seja executada.

Analisando o segundo fator, para que um gatilho seja programado, é


necessário levantar as regras de negócio, isto é, as necessidades e
“condições” as quais o gatilho deverá atender a fim de respeitar as
restrições de integridade, garantindo assim a consistência dos dados.

O terceiro fator contém a definição de quais e quantas “ações” de


processamento deverão ser executadas com base nos conjuntos de
entidades dos Bancos de Dados Operacionais em relação ao Banco de Dados
Analítico-Temporal, quando um gatilho for acionado.

A combinação das três exigências (evento, condição e ação) leva os gatilhos


a serem conhecidos como regras ECA, de evento-condição-ação (COSTA,
2006; DATE, 2003).

4.11.5.1. OBJETIVOS

• Descrever gatilhos de banco de dados e suas utilizações;


• Criar gatilhos de banco de dados;
• Descrever regras para disparo de gatilhos de banco de dados;
• Remover gatilhos de banco de dados.

4.11.5.2. VISÃO GERAL DOS GATILHOS

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


74

• Um gatilho é um bloco PL/SQL executado de forma implícita sempre que


ocorre um determinado evento;
• Ele pode ser tanto um gatilho de banco de dados ou um gatilho de
aplicação (Form, Report, Navigator). Os gatilhos de aplicação não são
totalmente iguais aos gatilhos de banco.

4.11.5.3. PROJETANDO GATILHOS: DIRETRIZES

• Projetar gatilhos para:


o Executar ações relacionadas;
o Centralizar operações globais.
• Não projetar gatilhos:
o Onde a funcionalidade já exista;
o Que dupliquem outros gatilhos.

4.11.5.4. TEMPO DO GATILHO

• Para tabela: BEFORE, AFTER, INSTEAD OF e FOR


o BEFORE: executa o corpo do gatilho antes do evento DML de
acionamento em uma tabela;
o AFTER: executa o corpo do gatilho após o evento DML de
acionamento em uma tabela;
o INSTEAD OF: executa o corpo do gatilho em vez do evento de
disparo;
o FOR: que é novidade do Oracle 11g, permite criar um gatilho
composto, consistindo em até quatro seções no corpo do
gatilho.

4.11.5.5. DISPARO DE OUTRO GATILHO

• FOLLOWS e PRECEDES (novo no Oracle 11g)


o FOLLOWS: dispara o gatilho depois do disparo do gatilho
especificado em esquema.outro_gatilho;
o PRECEDES: antecede a execução do gatilho especificado em
esquema.outro_gatilho.

4.11.5.6. ATIVAR e DESATIVAR UM GATILHO

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


75

• ENABLE e DISABLE (novo no Oracle 11g)


o ENABLE: inicia o gatilho ativado;
o DISABLE: inicia o gatilho desativado;
o Usando a instrução ALTER TRIGGER nome_gatilho [ENABLE
ou DISABLE] um gatilho pode ser ativado ou desativado a
qualquer momento.

4.11.5.7. EVENTO DE ACIONAMENTO

É por meio dessas instruções que os gatilhos são executados.

• INSERT
• UPDATE
• DELETE

4.11.5.8. Tipo de Gatilho

Os gatilhos são divididos em dois tipos, no qual defini quantas vezes o corpo
do gatilho deverá ser executado quando ocorre um evento de acionamento.

• Instrução: o corpo do gatilho é executado uma vez para o evento de


acionamento. Esse é o default.
• Linha: o corpo do gatilho é executado uma vez para cada linha afetada
pelo evento de acionamento. Além disso, o gatilho de linha tem acesso
aos valores de coluna antigos (OLD) e novos (NEW) quando é disparado
como resultado de uma instrução UPDATE nessa coluna, e também o
disparo pode ser limitado com uma condição de gatilho.

4.11.5.9. Corpo do Gatilho

O corpo do gatilho é um bloco PL/SQL ou uma chamada para um


procedimento.

4.11.5.10. SINTAXE PARA CRIAÇÃO DE GATILHOS DE INSTRUÇÃO

CREATE [OR REPLACE] TRIGGER nome_gatilho


{tempo} evento1 [OR evento2 OR evento3]
ON nome_tabela
. . .)
corpo_gatilho

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


76

Exemplo1: Criando um gatilho de instrução para verificar alteração de


dados fora de horário.

CREATE OR REPLACE TRIGGER fora_horario


BEFORE UPDATE ON tabfun
BEGIN
IF (TO_NUMBER (TO_CHAR(SYSDATE,'HH24')) NOT BETWEEN 8 AND 12)
THEN
RAISE_APPLICATION_ERROR(-20001,'Atenção – Operação Fora de Horário');
END IF;
END fora_horario;
/

Testando o gatilho:

UPDATE tabfun
SET salario = salario*1.10
WHERE matricula = 10;

4.11.5.11. SINTAXE PARA CRIAÇÃO DE GATILHOS DE LINHAS

CREATE [OR REPLACE] TRIGGER nome_gatilho


{BEFORE | AFTER | INSTEAD OF | FOR} evento1 [OR evento2 OR evento3] ON
nome_tabela [REFERENCING OLD AS antigo | NEW AS novo]
FOR EACH ROW
[{FOLLOWS | PRECEDES} esquema.outro_gatilho]
[{ENABLE | DISABLE}]
[WHEN condição_gatilho]
BEGIN
corpo_gatilho
END nome_gatilho;

• OLD: refere-se ao valor antigo da coluna (campo);


• NEW: refere-se ao novo valor da coluna;
• WHEN: condição que será testada em cada linha executada.

Exemplo2: Criando um gatilho de linha para não deixar reajustar o salário


dos funcionários em mais de 20%.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


77

CREATE OR REPLACE TRIGGER reajuste_fun


BEFORE UPDATE OF salario ON tabfun
FOR EACH ROW
BEGIN
IF :new.salario > :old.salario*1.20 THEN
RAISE_APPLICATION_ERROR(-20002,'Atenção – Aumento não Permitido');
END IF;
END reajuste_fun;
/

Testando o gatilho:
UPDATE tabfun
SET salario = salario * 1.30
WHERE matricula = 10;

Exemplo3: Criando um gatilho de linha para fixar um teto máximo de salário


CREATE OR REPLACE TRIGGER salario_alto
BEFORE INSERT OR UPDATE OF salario ON tabfun
FOR EACH ROW
BEGIN
IF :new.salario > 300000 THEN
RAISE_APPLICATION_ERROR(-20003,'Atenção – Salário Muito Alto');
END IF;
END salario_alto;
/

Testando o gatilho:

INSERT INTO tabfun VALUES(33,’Maradona’,400000,’01/01/2002’,3);

Exemplo4: Criando um gatilho de linha para fixar salário de 200000 para os


funcionários novos do cargo 3 (jogadores).

CREATE OR REPLACE TRIGGER salario_fixo


BEFORE INSERT ON tabfun
FOR EACH ROW
WHEN (new.cargo = 3)
BEGIN
IF INSERTING THEN
:new.salario := 200000;
END IF;
END salario_fixo;
/

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


78

Testando o gatilho:

INSERT INTO tabfun VALUES(33,’Zico’,240000,’01/05/2002’,3);

Exemplo5: Criando um gatilho de linha para inserir registros na tabela de


registros (tabreg) cada vez que houver alteração no salário dos
funcionários.

CREATE OR REPLACE TRIGGER atualiza_reg


BEFORE INSERT OR UPDATE OF salario ON tabfun
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO tabreg
VALUES(:new.matricula,:new.cargo,:new.admissao,:new.salario);
ELSE
INSERT INTO tabreg
VALUES(:old.matricula,:old.cargo,sysdate,:new.salario);
END IF;
END atualiza_reg;
/

4.11.5.12. OBTENDO INFORMAÇÕES SOBRE UM GATILHO

A tabela USER_TRIGGERS armazena informações sobre os gatilhos


criados. A seguir, é apresentada a estrutura da tabela USER_TRIGGERS.

COLUNA TIPO DESCRIÇÃO


------------------------- ------------------- ----------------------------------------------
TRIGGER_NAME VARCHAR2(30) Nome do gatilho
TRIGGER_TYPE VARCHAR2(16) Tipo do gatilho (linha ou instrução)
TRIGGERING_EVENT VARCHAR2(227) Evento de acionamento do gatilho
TABLE_OWNER VARCHAR2(30) Proprietário da tabela
BASE_OBJECT_TYPE VARCHAR2(16) Tipo do objeto da base de dados
TABLE_NAME VARCHAR2(30) Tabela de acionamento do gatilho
COLUMN_NAME VARCHAR2(4000) Coluna da tabela de acionamento gatilho
REFERENCING_NAMES VARCHAR2(128) Nome especificado do OLD e do NEW
WHEN_CLAUSE VARCHAR2(4000) Condição de acionamento
STATUS VARCHAR2(8) Ativado ou Desativado
DESCRIPTION VARCHAR2(4000) Descrição do cabeçalho do código
ACTION_TYPE VARCHAR2(11) Tipo de ação (PL/SQL)
TRIGGER_BODY LONG Corpo do gatilho

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


79

Na tabela USER_SOURCE também pode ser encontrado o código fonte


referente aos gatilhos criados.

Consultando a tabela USER_SOURCE

SELECT * FROM line, text WHERE name='NOME_OBJETO' order by line;

4.11.5.13. GERENCIANDO GATILHOS

Habilitar um gatilho de uma tabela


ALTER TRIGGER nome_trigger ENABLE

Desabilitar um gatilho
ALTER TRIGGER nome_trigger DISABLE

Habilitar todos os gatilhos de uma tabela


ALTER TABLE nome_tabela ENABLE ALL_TRIGGERS

Desabilitar todos os gatilhos de uma tabela

ALTER TABLE nome_tabela DISABLE ALL_TRIGGERS

Carregar um gatilho
START caminho nome_gatilho.SQL

Compilar um gatilho

ALTER TRIGGER nome_gatilho COMPILE


4.10.5.11. REMOVENDO GATILHOS

Sintaxe:

DROP TRIGGER nome_gatilho;

Exemplo1:
DROP TRIGGER salario_fixo;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


80

EXERCÍCIOS:
1) Faça um gatilho que não permita inserir um funcionário com data de
admissão maior que a data do servidor (SYSDATE).
2) Faça um gatilho que não permita alterar ou incluir um funcionário com
salário igual a zero.

4.11.6. PACOTES (PACKAGES)

Segundo Price (2009, p.393) os pacotes permitem encapsular funcionalidade


relacionada em uma unidade independente. Modularizando seu código
PL/SQL por meio de pacotes, é possível construir suas próprias bibliotecas
de código que outros programadores podem reutilizar.

Normalmente, os pacotes são constituídos de dois componentes: uma


especificação e um corpo. A especificação do pacote lista os procedimentos,
funções, tipos e objetos disponíveis. A especificação não contém o código
que constitui os procedimentos e funções; o código está contido no corpo do
pacote.

Todos os itens do corpo que não estão listados na especificação são


privados do pacote. Os itens privados só podem ser usados dentro do corpo
do pacote. Usando uma combinação de itens públicos e privados, é possível
construir um pacote cuja complexidade fica oculta do mundo exterior. Esse
é um dos principais objetivos de toda programação: ocultar a complexidade
de seus usuários.

4.11.6.1. OBJETIVOS

• Criar uma especificação de um pacote;


• Criar o corpo de um pacote;
• Chamar procedimentos e funções em um pacote;
• Obtendo informações sobre procedimentos e funções em um pacote;
• Remover pacotes.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


81

4.11.6.2. SINTAXE PARA CRIAÇÃO DE UMA ESPECIFICAÇÃO DE


PACOTE

CREATE [OR REPLACE] PACKAGE nome_pacote


{IS | AS}
especificação_pacote
END nome_pacote;

• especificação_pacote: lista os procedimentos, funções, tipos e objetos


públicos disponíveis para os usuários de seu pacote;

O exemplo a seguir cria uma especificação para um pacote chamado


tabfun_pacote:

CREATE OR REPLACE PACKAGE tabfun_pacote AS


TYPE t_ref_cursor IS REF CURSOR;
FUNCTION get_tabfun_ref_cursor RETURN t_ref_cursor;
PROCEDURE update_tabfun_salario (
n_matricula IN tabfun.matricula%TYPE,
n_fator IN NUMBER
);
END tabfun_pacote;
/

O tipo t_ref_cursor é um tipo REF CURSOR da PL/SQL. Um REF CURSOR é


semelhante a um ponteiro na linguagem de programação C++ e aponta para
um cursor. A função get_tabfun_ref_cursor() retorna um tipo
t_ref_cursor e, aponta para um cursor que contém as linhas recuperadas da
tabela tabfun. O procedimento update_tabfun_salario() multiplica o salário
de um funcionário e confirma a alteração.

4.11.6.3. SINTAXE PARA CRIAÇÃO DO CORPO DE UM PACOTE

CREATE [OR REPLACE] PACKAGE BODY nome_pacote


{IS | AS}
corpo_pacote
END nome_pacote;

• corpo_pacote: contém o código dos procedimentos e funções.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


82

O exemplo a seguir cria o corpo do pacote tabfun_pacote:

CREATE OR REPLACE PACKAGE BODY tabfun_pacote AS


FUNCTION get_tabfun_ref_cursor
RETURN t_ref_cursor IS
v_tabfun_ref_cursor t_ref_cursor;
BEGIN
--- obtém o REF CURSOR
OPEN v_tabfun_ref_cursor FOR
SELECT matricula, nome, salario
FROM tabfun;
--- retorna o REF CURSOR
RETURN v_tabfun_ref_cursor;
END get_tabfun_ref_cursor;

PROCEDURE update_tabfun_salario (
n_matricula IN tabfun.matricula%TYPE,
n_fator IN NUMBER
) AS
v_tabfun_count INTEGER;
BEGIN
--- conta o número de produtos com o valor de n_matricula fornecido
--- será 1 se o funcionário existir
SELECT COUNT(*)
INTO v_tabfun_count
FROM tabfun
WHERE matricula = n_matricula;

--- se o produto existe (n_tabfun_count=1) então atualiza salário


IF v_tabfun_count = 1 THEN
UPDATE tabfun
SET salario = salario * n_fator
WHERE matricula = n_matricula;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END update_tabfun_salario;
END tabfun_pacote;
/

A função get_tabfun_ref_cursor() abre o cursor e recupera as colunas


matricula, nome e salário da tabela tabfun. A referência a esse cursor (o
REF CURSOR) é armazenada em v_tabfun_ref_cursor e retornada pela
função.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


83

O procedimento update_tabfun_salario() multiplica o salário de um produto


e confirma a alteração.

4.11.6.4. CHAMANDO PROCEDIMENTOS/FUNÇÕES EM UM PACOTE

Para chamar procedimentos e funções em um pacote, deve-se incluir o nome


do pacote na chamada. O exemplo a seguir chama
tabfun_pacote.get_tabfun_ref_cursor(), que retorna uma referência para
um cursor contendo os valores de matricula, nome e salário dos funcionários.

SELECT tabfun_pacote.get_tabfun_ref_cursor
FROM dual;

O próximo exemplo chama tabfun_pacote.update_tabfun_salario() para


multiplicar o salário do funcionário 10 por 1.15. Caso o aumento ultrapasse
20% o gatilho reajuste_fun será acionado não permitindo o aumento.

CALL tabfun_pacote.update_tabfun_salario(10, 1.15);

4.11.6.5. OBTENDO INFORMAÇÕES SOBRE PROCEDIMENTOS E


FUNÇÕES DE UM PACOTE

A tabela USER_PROCEDURES também armazena informações referentes


aos pacotes criados. A estrutura da tabela USER_PROCEDURES já foi
apresentada nas seções anteriores.

SELECT object_name, procedure_name


FROM user_procedures
WHERE object_name = ‘TABFUN_PACOTE’;

OBJECT_NAME PROCEDURE_NAME
------------------------------ ------------------------------
TABFUN_PACOTE GET_TABFUN_REF_CURSOR
TABFUN_PACOTE UPDATE_TABFUN_SALARIO

4.11.6.6. REMOVENDO UM PACOTE

DROP PACKAGE tabfun_pacote;

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


84

5. LINGUAGEM XML

5.1. INTRODUÇÃO

A necessidade de se criar uma padronização segura e eficiente para


importação e exportação de informações, entre aplicações de diversos fins,
desenvolvidas com ferramentas diferentes, podendo os dados estarem
armazenados em diferentes sistemas de bancos de dados, levou ao
surgimento dos arquivos XML (eXtensible Markup Language – Linguagem de
Marcação Extensível).

Atualmente, o meio mais largamente utilizado para a troca de informações


entre aplicações são os arquivos de formato texto (.txt) O problema em se
usar esse tipo de arquivo, em intercâmbios de dados, obriga os programas
responsáveis pela exportação e importação a conhecer bem o formato
utilizado no processo, caso contrário ocorrerão falhas, além disso, arquivos
com extensão “.txt” podem ser facilmente violados, podendo prejudicar a
integridade das informações.

Por razão desses problemas, surgiu então a utilização da XML, no sentido de


oferecer um meio mais seguro, adaptável as exigências atuais, e
padronizada para a troca de informações entre aplicações.

A XML é uma linguagem de marcação voltada para o gerenciamento de


documentos, sendo uma linguagem padrão e adaptável, podendo até mesmo
ser convertido para outros formatos. Esses motivos levam a XML a ser cada
vez mais utilizada.

5.2. XML

Neste capítulo, serão apresentados os conceitos sobre XML, bem como sua
origem e estrutura.

5.2.1. ORIGEM DA XML

A XML foi desenvolvida em 1996 pela W3C (World Wide Web Consortium),
com base na SGML (Standard Generalized Markup Language – Linguagem de

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


85

Marcação Padrão Generalizada), porém, mais simples e eficaz, podendo


representar dados, importá-los e exportá-los de uma aplicação para outra
com mais facilidade.

5.2.2. ESTRUTURAS DE DADOS XML

A estrutura de um documento XML consiste em elementos, que são pares de


tags que marcam o início e o fim do documento, contendo entre elas o corpo
do texto.

Em documentos XML é permitido apenas o uso de um elemento raiz,


chamado também de elemento pai, e entre o início e o fim desse elemento é
onde se encontram os subelementos ou elementos filhos, que devem se
aninhamos corretamente.

A XML não limita a quantidade de tags em um documento, elas são


controladas pelo próprio desenvolvedor, podendo ele dar o nome que desejar
para cada tag, e esses nomes podem ser repetidos em um mesmo documento.

A Figura 24 apresenta um exemplo de documento XML, onde <carta></carta>


é o elemento pai, e as outras tags são os elementos filhos.

<carta>
<cabeçalho>
<remetente>Maria</remetente>
<destinatário>João</destinatário>
</cabeçalho>
<parágrafo>Olá</parágrafo>
<parágrafo>Tchau</parágrafo>
</carta>

Figura 24. Estrutura de Documento XML

O fato das tags poderem ser repetidas em um documento XML pode tornar
defeituosa a representação desses dados, porém, quando se trata da troca
desses dados entre aplicações, essas tags tornam o documento fácil de ser
entendido, já que a mensagem se torna auto-documentável.

5.2.3. ESQUEMAS DA XML

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


86

Os esquemas servem para definir e restringir os tipos de dados que podem


ser armazenados em um documento XML. Quando um documento XML segue
as regras estabelecidas de um esquema pode-se dizer que ele é válido.

A seguir será descrita as duas linguagens de definição de esquema para


XML, a DTD (Document Type Definition – Definição do Tipo do Documento)
e a XMLSchema.

5.2.3.1. DTD

A DTD é uma linguagem que define as regras de como deve ser a estrutura
de um documento XML. É por meio de uma DTD que é realizada uma análise
do documento XML dizendo se o mesmo está estruturado corretamente ou
não. O uso da DTD é opcional.

A Figura 25 é um exemplo de uma DTD da Figura 24, em que <!DOCTYPE> é


o tipo do documento, <!ELEMENT> são os tipos de elementos do documento e
(#PCDATA) corresponde aos dados de caractere a ser inserido.

<!DOCTYPE CORRESPONDENCIA [
<!ELEMENT carta (cabeçalho | parágrafo) >
<!ELEMENT cabeçalho (remetente | destinatário) >
<!ELEMENT parágrafo (#PCDATA) >
]>

Figura 25. DTD da Figura 24

5.2.3.2. XML Schema Definition

A XSD (XML Schema Definition) tem o mesmo papel que a DTD que é a de
especificar os tipos de elementos em um documento XML e ordená-los,
porém, a XSD possui algumas vantagens sobre a DTD como: a XSD pode
especificar um elemento como sendo do tipo integer, string, boolean, date,
decimal; permite que o usuário crie seus tipos definidos; permite o uso de
chave estrangeira e recursos de exclusividade; utiliza de recursos de
herança; permite utilizar valores mínimos e máximos para restringir os tipos
de elementos.

Além dessas vantagens, a XSD é derivada da XML, o que permite que os


recursos da XML possam ser utilizados dentro da linguagem XSD, ao
contrário da DTD, que necessita de uma API (Application Programming

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


87

Interfaces- Interfaces de Programas de Aplicações) para manipulá-la.


Porém a XSD não pode para declarar entidades como a DTD.

A Figura 26 mostra um exemplo de um documento XSD.

<xs:schema xmlns=”http://www.w3.org/2001/XMLSchema>
<xs: element name = “carta”/>
<xs: complexType>
<xs: sequence>
<xs: element name=”cabecalho” >
<xs: element name=”remetente” type=”xs:string”/>
<xs: element name=”destinatario” type=”xs:string”/>
</xs: element>
<xs: element name=”paragrafo” type=”xs:string”/>
</xs: sequence>
</xs: complexType>
</xs:schema>

Figura 26. XMLSchema da Figura 24

5.2.4. X PATH

XPath é uma linguagem utilizada para endereçar e encontrar partes de


documentos XML. Esses endereços são construídos através de expressão de
caminho onde são especificados os caminhos que devem ser percorridos
para chegar até a parte do documento desejado. Para construir essas
expressões são utilizados / para separar os caminhos.

A Figura 27 mostra um exemplo de consulta da Figura 24, utilizando XPath:


/carta/cabeçalho/remetente

Figura 27. Consulta XPath da Figura 24

5.2.5. XQUERY

XQuery é uma linguagem padrão de consulta para tipos de dados XML. Essa
linguagem é formada por uma seqüência de comandos, são eles: for, let,
where, order by e return. Comandos esses mais conhecidos como a
expressão FLWOR. Esses comandos foram baseados nos comandos da SQL,
porém são diferentes.

A Figura 28 traz um exemplo de uma consulta realizada em XQuery.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


88

for $x in /banco-2/conta
let $numconta: = $x/numero_conta
where $x/ saldo > 400
return <numero_conta> { $numconta} </numero_conta>

Figura 28. Consulta em XQuery (SILBERSCHATZ; KORTH;


SUDARSHAN, 2006, p.274)

5.2.6. XSLT

A XSLT (eXtensible Stylesheet Language Transformer) é uma linguagem


utilizada para transformar documentos XML em outros formatos como
HTML, XHTML ou até mesmo em outros documentos XML.

A XSLT está embutida na XSL (eXtensible Style Language) que é a


linguagem que gera a folha de estilo para XML, onde será declarado o tipo
de formatação a ser utilizada nos documentos XML, assim como margens,
fontes, etc.

No processo de transformação de documentos XML, a XSLT utilizada


templates para selecionar os nós da árvore através de expressão da XPath.
A XSLT pode também ser utilizada para a realização de consultas.

5.2.7. XMLELEMENT( )

A XMLELEMENT( ) é uma função que gera e retorna elementos em


formatado XML, através do fornecimento do nome da tabela e do campo
que se deseja recuperar.

A seguir será apresentado um exemplo de XMLELEMENT (), onde será


informado o nome da tabela que no caso é “professor”, e o campo “nome”:

select xmlelement("nome",nome)
as xml_customer
from professor;

Figura 29. XMLELEMENT ( )

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


89

O resultado traz todos os nomes da tabela professor:

XML_CUSTOMER
<nome>ALEX</nome>
<nome>ALMIR</nome>
<nome>BEGOSSO</nome>
<nome>GUTO</nome>
<nome>TALO</nome>
<nome>DOMINGOS</nome>
<nome>OSMAR</nome>
<nome>URSO</nome>
<nome>FABIO</nome>
<nome>DOUGLAS</nome>

Figura 30. Resultado XMLELEMENT ( )

5.2.8. XMLATTRIBUTES( )

“XMLATTRIBUTES( ) é usada em conjunto com XMLELEMENT( ) para


especificar os atributos dos elementos XML recuperados por
XMLELEMENT( )” (PRICE, 2009, p 636). XMLATTRIBUTES( ) serve
também para dar nomes aos atributos.

Segue exemplo de XMLATTRIBUTES( ):

select xmlelement("professor",
xmlattributes(codigo as "cod", nome as "name",
to_char (nascimento, 'mm/dd/yyyy')as "nasc"
)
)
as xml_customers
from professor
where codigo in (1,2);

Figura 31. XMLATTRIBUTES( )

Resultado:

XML_CUSTOMERS
<professor cod="1" name="ALEX" nasc="11/17/1971"></professor>
<professor cod="2" name="ALMIR" nasc="05/01/1971"></professor>

Figura 32. Resultado XMLATTRIBUTES ( )

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


90

5.2.9. XMLFOREST( )

A XMLFOREST( ) é usada para gerar uma floresta de elementos XML. Ela


também concatena os elementos sem precisar utilizar o operador ||.

Segue um exemplo de consulta utilizando XMLFOREST( ):

select xmlelement("professor",
xmlforest(codigo as "cod", cargo as "carg",
to_char (nascimento, 'mm/dd/yyyy') as "nasc"
)
)
as xml_customers
from professor
where codigo in (1,3);

Figura 33. XMLFOREST( )

Resultado da consulta:

XML_CUSTOMERS
<professor><cod>1</cod><carg>1</carg><nasc>11/17/1971</nasc></professor>
<professor><cod>3</cod><carg>3</carg><nasc>06/09/1971</nasc></professor>

Figura 34. Resultado XMLFOREST( )

5.2.10. XMLAGG( )

“Normalmente a XMLAGG( ) é utilizada para agrupar código XML em uma


lista de itens comuns abaixo de um único pai ou para recuperar dados de
coleções” (PRICE, 2009, p 637). O exemplo abaixo utiliza a cláusula order
by em XMLAGG( ):

select xmlelement("professor",
xmlagg(xmlelement("professor", nome)
order by cargo asc
)
)
as xml_customers
from professor
where codigo in (1,2);

Figura 35. XMLAGG ( )

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


91

Resultado do select:

XML_CUSTOMERS
<professor><professor>ALEX</professor><professor>ALMIR</professor></professo
r>

Figura 36. Resultado XMLAGG( )

5.2.11. XMLCOLATTVAL( )

“Você usa XMLCOLATTVAL( ) para criar um fragmento de código XML e


depois expandir o código resultante. Cada fragmento tem a coluna de nome
com o nome do atributo” (PRICE, 2009, p 640). A cláusula As é utilizada
para mudar o nome do atributo.

Exemplo utilizando XMLCOLATTVAL( ) e a cláusula As:

select xmlelement("professor",
xmlcolattval(codigo as "cod",nome as "nome",nascimento as "nasc"
)
)
as xml_customers
from professor
where codigo in (1,2);

Figura 37. XMLCOLATTVAL( )

Resultado:

XML_CUSTOMERS
<professor>
<column name = "cod">1</column>
<column name = "nome">ALEX</column>
<column name = "nasc">1971-11-17</column>
</professor>
<professor>
<column name = "cod">2</column>
<column name = "nome">ALMIR</column>
<column name = "nasc">1971-05-01</column>
</professor>

Figura 38. Resultado XMLCOLATTVAL( )

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


92

5.2.12. XMLCONCAT( )

A XMLCONCAT( ) serve para concatenar elementos.

Exemplo de XMLCONCAT( ) utilizando a tabela professor:

select xmlconcat(xmlelement("nome", nome),


xmlelement("nasc", nascimento),xmlelement("cargo", cargo)
)
as xml_customers
from professor
where codigo in (1,2);

Figura 39. XMLCONCAT( )

Resultado:
XML_CUSTOMERS
<nome>ALEX</nome><nasc>1971-11-17</nasc><cargo>1</cargo>
<nome>ALMIR</nome><nasc>1971-05-01</nasc><cargo>2</cargo>

Figura 40. Resultado XMLCONCAT( )

5.2.13. XMLPARSE( )

“XMLPARSE( ) é usada para analisar e gerar código XML a partir do


resultado avaliado de uma expressão” (PRICE, 2009, p 641).

Exemplo utizando XMLPARSE( ) na tabela professor:

select xmlparse(
content
'<professor><codigo>1</codigo><nome>Alex</nome></professor>'
wellformed
)
as xml_customers
from dual;

Figura 41. XMLPARSE( )

Resultado:

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


93

XML_CUSTOMERS
<professor><codigo>1</codigo><nome>Alex</nome></professor>

Figura 42. Resultado XMLPARSE( )

5.2.14. XMLPI( )

“XMLPI( ) gera uma instrução de processamento XML. Normalmente, uma


instrução de processamento é usada para fornecer a um aplicativo
informações associada a dados XML; o aplicativo pode então usar a
instrução de processamento para determinar como vai processar os dados
XML” (PRICE, 2009, p 642).

Segue exemplo de XMLPI( ):

select xmlpi(name "order_status",'placed,pending,shipped'


)
as xml_order_status_pi
from dual;

Figura 43. XMLPI( )

Resultado:
XML_ORDER_STATUS_PI
<?order_status placed,pending,shipped?>

Figura 44. Resultado XMLPI( )

5.2.15. XMLCOMMENT( )

A XMLCOMMENT( ) serve para inserir comentários em XML, através de


string. O exemplo abaixo insere um comentário:

select xmlcomment('Exemplo de comentario XML'


)
as xml_comment
from dual;

Figura 45. XMLCOMMENT( )

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


94

Resultado:
XML_COMMENT
<!--Exemplo de comentario XML-->

Figura 46. Resultado XMLCOMMENT( )

5.2.16. XMLSEQUENCE( )

“XMLSEQUENCE( ) gera um objeto XMLSequenceType, que é um varray de


objetos XMLType” (PRICE, 2009, p 643).

Segue exemplo de XMLSEQUENCE( ):

select value (list_of_values).getstringval()order_values


from table(
xmlsequence(
extract(
xmltype('<a><b>placed</b><b>pending<b/></a>'),
'/a/b'
)
)
)
list_of_values;

Figura 47. XMLSEQUENCE( )

Resultado:
ORDER_VALUES
<b>placed</b>
<b>pending</b>

Figura 48. Resultado XMLSEQUENCE( )

5.2.17. XMLSERIALIZE( )

“XMLSERIALIZE( ) gera uma representação de string ou ob de dados XML


a partir do resultado avaliado de uma expressão” (PRICE, 2009, p 644).

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


95

select xmlserialize(
content
xmltype('order_status>shipped</order_status>')
)
as xml_order_status
from dual;

Figura 49. XMLSERIALIZE( )

Resultado:

XML_ORDER_STATUS
<order_status>shipped</order_status>

Figura 50. Resultado XMLSERIALIZE( )

5.2.18. INTERFACES DE APLICAÇÕES PARA XML

Nesta sessão serão apresentadas as duas interfaces de aplicações para


XML mais utilizadas: DOM (Document Objetc Model – Modelo de Objetos
para Documento) e SAX (Simple API for XML - API Simples para XML).

5.2.18.1. DOM

O DOM é uma API (Application Programming Interface – Interface de


Programação de Aplicações) utilizada para manipular documentos XML.

“DOM pode ser usado para acessar dados XML armazenados em banco de
dados, e um banco e dados XML pode ser embutido com DOM como sua
interface principal para acessar e modificar dados. Porém, a interface DOM
não admite qualquer forma de consulta declarativa” (SILBERSCHATZ;
KORTH; SUDARSHAN, 2006, p 279).

5.2.18.2. SAX

SAX é uma API baseada na manipulação de eventos. Quando uma leitura


está sendo feita em um documento XML, ela gera dois eventos, um para
mostrar o início da tag e outro para mostrar o fim da tag.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


96

“SAX geralmente exige mais esforço de programação do que DOM, mas


ajuda a evitar o trabalho adicional de criar uma árvore DOM em situações
em que a aplicação precisa criar sua própria representação de dados”
(SILBERSCHATZ; KORTH; SUDARSHAN, 2006, p 280).

5.3. MANIPULANDO DADOS XML

5.3.1. ARMAZENANDO DADOS XML

Nesta seção serão apresentadas algumas maneiras de se armazenar dados


XML.

5.3.1.1. BANCOS DE DADOS NÃO RELACIONAIS

Existem duas maneiras de se armazenar dados XML em um banco de dados


não relacional:

Armazenar em arquivos simples: Embora essa técnica apresente diversas


desvantagens, como não possuir acesso corrente, segurança e isolamento de
dados, em algumas aplicações ela se torna suficiente, devido ao grande
número de ferramentas de XML que trabalham com esse tipo de arquivos,
sendo assim possível acessá-los e consultá-los.

Criar um banco de dados XML: Segundo Silberschatz, Korth e Sudarshan


(2006), os bancos de dados XML são bancos de dados que utilizam XML
como seu modelo de dados básicos. Os primeiros banco de dados XML
implementam o Document Object Model em um banco de dados orientado a
objeto baseado em C++. Isso permite que grande parte da infra-estrutura
do banco de dados orientado a objeto seja reutilizada, enquanto oferece
uma interface XML padrão. O acréscimo de XQuery ou outras linguagens de
consulta XML oferece consulta declarativa.

5.3.1.2. BANCOS DE DADOS RELACIONAIS

Existem cinco maneiras de se armazenar dados XML em um banco de dados


relacional:

Armazenar como string: pode-se armazenar pequenos documentos XML


como string em tuplas no banco de dados, porém, apesar de simples de se

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


97

usar, o banco de dados não reconhece o esquema dos elementos, tornando


impossível as consultas, por mais simples que sejam.

Segundo Silberschatz, Korth e Sudarshan (2006), uma das maneiras de


contornar esse problema seria armazenar diferentes tipos de elementos em
relações diferentes e armazenar os valores de alguns elementos críticos
como atributos para ativar a indexação.

O banco de dados Oracle permite índices de função, fazendo com que não
ocorra replicação de atributos entre a string XML e os atributos de
relação.

Representação de árvore: qualquer tipo de dado XML pode ser armazenado


como árvore utilizando um par de relações. Esse tipo de armazenamento
permite que todas as informações XML possam ser representadas em um
banco de dados relacional e também permite que consultas XML sejam
realizadas dentro do banco de dados. A desvantagem em se usar esse tipo
de armazenamento é que cada elemento é desmembrado em várias partes, o
que exige que sejam feitas muitas associações para que os subelementos
voltem para o elemento de origem.

Mapa de relações: Segundo Silberschatz, Korth e Sudarshan (2006), os


elementos XML cujo esquema é conhecido são mapeados para relações e
atributos. Os elementos cujo esquema é desconhecido são armazenados
como strings ou como uma árvore. Uma relação é criada para cada tipo de
elemento (incluindo subelementos) cujo esquema é conhecido e cujo tipo é
um tipo complexo (ou seja, contém atributos ou subelementos).

Publicando e fragmentando dados XML: “Quando a XML é usada para trocar


dados entre aplicações corporativas, os dados normalmente são originados
nos bancos de dados relacionais. Os dados nos bandos de dados relacionais
precisam se publicados, ou seja, convertidos para o formato XML, para
exportar para outras aplicações. Os dados que chegam precisam ser
fragmentados, ou seja, convertidos de volta, de XML para o formato de
relação normalizada, e armazenados em um Banco de Dados Relacional.
Embora o código de aplicação possa realizar as operações de publicação e
fragmentação, as operações são tão comuns que as conversões devem ser
feitas automaticamente, sem escrever o código da aplicação”
(SILBERSCHATZ, KORTH, SUDARSHAN,2006, p.282).

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


98

Armazenamento nativo dentro de um banco de dados relacional: Alguns


sistemas de banco de dados estão suportando o armazenamento nativo de
dados XML, assim, não há necessidade de transformar os dados para o
formato relacional, já que eles são armazenados como strings ou em
representação binária.

5.3.2. APLICAÇÕES XML

Nesta sessão, serão apresentadas algumas maneiras de armazenar,


trocar dados XML.

5.3.2.1. ARMAZENANDO DADOS COM ESTRUTURA COMPLEXA

Esse tipo de armazenamento é utilizado quando há necessidade de trocar


dados entre diferentes partes de uma aplicação.

“Por exemplo, um sistema de banco de dados pode representar um plano de


execução de consulta (uma expressão de álgebra relacional com informações
extras sobre como executar operações) utilizando XML. Isso permite que
uma parte do sistema produza o plano de execução da consulta e outra
parte o apresente, sem usar uma estrutura de dados compartilhada”
(SILBERSCHATZ, KORTH, SUDARSHAN,2006, p.284).

5.3.2.2. FORMATOS PADRONIZADOS PARA TROCA DE DADOS

Aplicações específicas sobre diversas áreas como na de negócios,


científicas, química entre outros, tem sido desenvolvidos com o padrão XML
para importação e exportação de dados.

O uso de aplicações especializadas com padrão XML evita a redundância de


dados, evitando a confusão entre atributos, o que ocorreria se a aplicação
seguisse o modelo relacional.

5.3.2.1.1. WEB SERVICES

Muitas vezes as aplicações necessitam de dados armazenados em


diferentes bancos de dados da organização ou de um determinado
departamento. A organização não pode permitir o acesso direto ao banco de

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


99

dados, então ela disponibiliza esses dados utilizando formatos baseados na


Web, onde o usuário possa manipular esses dados retornando informações
em formato HTML (HyperText Markup Language).

Porém, quando esses dados precisam ser acessados por softwares, a


organização utiliza do formato XML para especificar os valores de entrada
e saída das consultas, utilizando o protocolo HTTP (Hypertext Transfer
Protocol).

A SOAP (Simple Object Acess Protocol) é responsável pela definição do


padrão para que se possa usar a XML para representar entradas e saídas de
procedimentos.

5.3.2.1.2. MEDIAÇÃO DE DADOS

A mediação de dados pode ser utilizada, por exemplo, quando se deseja


obter uma relação de preços de um determinado item em diferentes sites.
Quando esses sites oferecem esse tipo de informação em formato XML
como um Web Service, é fácil extrair essa relação.

Os sites podem utilizar diferentes esquemas para representar as mesmas


informações, o que fará com que a aplicação mediadora decida qual a melhor
maneira de extrair e representar esses dados, isso geralmente exige muita
transformação dos dados XML fazendo com que a XSLT e XQuery
desempenhem seu papel.

5.4. EXPORTANDO E IMPORTANDO DADOS

Nesta seção, é apresentada uma demonstração de exportação e importação


de dados de uma tabela por intermédio do Oracle 10g, mas o mesmo pode
ser feito de forma interativa e visual com a ferramenta Oracle 10g Express
Edition.
Será utilizada uma tabela de nome cidade, com os atributos codigo, nome,
estado e qtd_habitantes (quantidade de habitantes). Os dados armazenados
na tabela cidade serão exportados para um documento XML, e em seguida
serão importados para outra tabela nomeada cidades_xml.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


100

5.4.1 EXPORTANDO DADOS XML DA TABELA CIDADES

Para exportar dados XML de uma tabela no Oracle 10g é necessário


criar um diretório onde será salvo o documento XML.

CREATE DIRECTORY TEMP_FILES_DIR AS ‘C:\temp_files’;

Figura 51. Criando Diretório

Após criar o diretório, é preciso executar um procedimento onde será


realizada a leitura da tabela cidade por meio da instrução SELECT.

CREATE OR REPLACE PROCEDURE write_xml_data_to_file


(p_directory VARCHAR2,
p_file_name VARCHAR2
)
AS
v_file UTL_FILE.FILE_TYPE;
v_mount INTEGER := 32767;
v_xml_data XMLType;
v_char_buffer VARCHAR2(32767);
BEGIN
v_file := UTL_FILE.FOPEN(p_directory,p_file_name,'w',v_mount);
UTL_FILE.PUT_LINE(v_file,'<?xml version="1.0"?>');
SELECT EXTRACT(
XMLELEMENT("list_cidade",
XMLAGG(
XMLELEMENT("NOME",nome))),'/list_cidade'
)
AS xml_customers
INTO v_xml_data
FROM cidade;
v_char_buffer := v_xml_data.GETSTRINGVAL();
UTL_FILE.PUT(v_file,v_char_buffer);
UTL_FILE.FFLUSH(v_file);
UTL_FILE.FCLOSE(v_file);
END write_xml_data_to_file;
/
Figura 52. Procedimento para Exportação XML

O procedimento ilustrado recupera as informações contidas no


atributo nome da tabela cidade, transformando-as em formato XML.

Criado o procedimento é necessário executar a instrução call, onde


será enviado o documento XML para o diretório criado.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


101

CALL write_xml_data_to_file('TEMP_FILES_DIR','cidades.xml');

Figura 53. Chamando o Procedimento

Ao acessar o diretório e abrir o documento XML, o seguinte resultado


será exibido:

<?xml version="1.0" ?>


<ROWSET>
<ROW>
<NOME>Assis</NOME>
</ROW>
<ROW>
<NOME>São Paulo</NOME>
</ROW>
<ROW>
<NOME>Rio de Janeiro</NOME>
</ROW>
<ROW>
<NOME>Salvador</NOME>
</ROW>
<ROW>
<NOME>Belo Horizonte</NOME>
</ROW>
<ROW>
<NOME>Curitiba</NOME>
</ROW>
<ROW>
<NOME>Porto Alegre</NOME>
</ROW>
</ROWSET>

Figura 53. Resultado do Procedimento

5.4.2 IMPORTANDO DADOS XML DA TABELA CIDADES

O processo de importação no Oracle 10g, começa com a criação de uma


tabela com a mesma estrutura do documento XML. No caso será criada uma
tabela com o nome de cidades_xml.

O procedimento utilizado para a importação dos dados XML para a tabela


cidades_xml é ilustrada a seguir:

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


102

CREATE OR REPLACE PROCEDURE loadxml


(p_key number,
p_tabela varchar2)
AS
fil BFILE;
buffer RAW(32767);
len INTEGER;
insrow INTEGER;
BEGIN
SELECT f_lob
INTO fil
FROM xml_temp
WHERE key = p_key;
DBMS_LOB.FILEOPEN(fil,DBMS_LOB.FILE_READONLY);
len := DBMS_LOB.GETLENGTH(fil);
DBMS_LOB.READ(fil,len,1,buffer);
xmlgen.resetOptions;
insrow :=
xmlgen.insertXML(p_tabela,UTL_RAW.CAST_TO_VARCHAR2(buffer));
DBMS_OUTPUT.PUT_LINE(insrow);
IF DBMS_LOB.FILEISOPEN(fil) = 1 THEN
DBMS_LOB.FILECLOSE(fil);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(sqlerrm);
DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE));
IF DBMS_LOB.FILEISOPEN(fil) = 1 THEN
DBMS_LOB.FILECLOSE(fil);
END IF;
end;
/

Figura 54. Procedimento para Importação XML

Para executar o procedimento é preciso seguir o que mostra a figura a


seguir:

set serveroutput on

exec loadxml(1,’cidade’);

Figura 55. Executar o Procedimento.

Após esse passo, basta executar uma instrução de SELECT na tabela


cidades_xml para verificar os dados importados.

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br


103

REFERÊNCIAS BASE DA DISCIPLINA

ANDRADE, Fábio Bahia; SANTIAGO, Luciano Diniz Guerra. Introdução aos


conceitos de modelagem multidimensional aplicados a data warehouses. Faculdade
Ruy Barbosa, Revista CienteFico, Salvador, v.2, julho-dezembro, 2003. 12 p.

CORDEIRO, Robson Leonardo Ferreira; SANTOS, Clesio Saraiva dos;


EDELWEISS, Nina; GALANTE, Renata de Matos. Classificação de restrições de
integridade em bancos de dados temporais de versões. In: BRAZILIAN
SYMPOSIUM ON DATABASES, 19., 2004, Brasília. Anais/Proceedings
SBBD’2004. Brasilia, 2004. p. 336-377.

COREY, Michael; ABBEY, Michael; ABRAMSON, Ian; TAUB, Ben. Oracle 8i Data
Warehouse. Rio de Janeiro: Editora Campus (Autorizado por Oracle Press), 2001.

COSTA, Rogério Luís de C. SQL: guia prático. 2. ed. Rio de Janeiro: Editora
Brasport, 2006.

COSTA NETO, José Craveiro, SATO, Liria Matsumoto. Construção de um


ambiente de dados sobre um sistema de arquivos paralelos. In: BOLETIM
TÉCNICO. Escola Politécnica da USP, Departamento de Engenharia da
Computação e Sistemas Digitais, São Paulo, 2002, 12 p.

DATE, Christopher J.; Introdução a Sistemas de Banco de Dados. Tradução de


Daniel Vieira. 8. ed. Rio de Janeiro: Editora Elsevier, 2003.

GONÇALVES, Márcio. Extração de Dados para Data Warehouse. Rio de


Janeiro: Editora Axcel Books do Brasil, 2003.

INMON, Bill. Building the Data Warehouse. 2. ed. New York: Wiley Computer
Publishing, 1996.

KOCHHAR, Neena; KRAMER, Debby. Introduction to Oracle: SQL and PL/SQL


Using Procedure Builder. v.3. São Paulo: Editora Oracle Education, 1998.

KROENKE, David M. Banco de Dados: Fundamentos, Projeto e Implementação.


6. ed. Rio de Janeiro: Editora LTC – Livros Técnicos e Científicos S.A, 1999.
104

KIMBALL, Ralph. Data Warehouse Toolkit: o guia completo para modelagem


dimensional. Rio de Janeiro: Editora Campus, 2002.

PASSOS, Emmanuel; GOLDSCHMIDT, Ronaldo. Data Mining: um guia prático. 1.


ed. Rio de Janeiro: Editora Elsevier, 2005.

POLETTO, Alex S. R. de S. Um modelo para projeto e implementação de


bancos de dados analítico-temporais. 2008. 167 p. Tese (Doutorado) – Escola
Politécnica da Universidade de São Paulo. Departamento de Engenharia de
Computação e Sistemas Digitais, 2008.

POLETTO, Alex S. R. de S.; ALMEIDA JR., Jorge Rady de. Modeling of an


Analytical Database System. In: 9th International Conference on Enterprise
Information Systems. ICEIS’2007. ACM-SIGMIS. Ilha da Madeira, Portugal,
Funchal, 12 - 16 de Junho de 2007.

____. Uma proposta de modelagem e implementação de um Banco de Dados


Analítico-Temporal. In: VI Congress of Logic Applied to Technology.
LAPTEC’2007. UNISANTA, Santos, Brasil, 21 - 23 de Novembro de 2007.

PRICE, Jason. Oracle Database 11g SQL: Domine SQL e PL/SQL no banco de
dados Oracle. Aborda as versões 11g, 10g, 9i e 8i. Porto Alegre. Editora
Bookman, 2009.

RAMALHO, José Antonio. Oracle 10g: Ideal para quem deseja iniciar o
aprendizado do Oracle. São Paulo: Editora Pioneira Thomson Learning, 2005.

SILBERSCHATZ, Abraham; KORTH, Henry F.; SUDARSHAN, S. Sistemas de


Bancos de Dados. 5. ed. Tradução de Daniel Vieira. Rio de Janeiro: Editora
Elsevier, 2006.

SETZER, Valdemar. Bancos de Dados. 2005.

SINGH, Harry S. Data Warehouse: Conceitos, Tecnologias, Implementação e


Gerenciamento. Tradução de Mônica Rosemberg. Revisão Técnica de José Davi
Furlan. São Paulo: Editora Makron Books, 2001.

OLIVEIRA, Wilson José de. Data Warehouse. 1. ed. Florianópolis: Editora Visual
Books, 2002.
105

VASSILIADIS, Panos; SIMITSIS, Alkis; SKIADOPOULOS, Spiros. Conceptual


modeling for ETL processes. In: WORKSHOP ON DATA WAREHOUSING AND
OLAP. Proceedings of the 5th ACM international workshop on Data
Warehousing and OLAP. McLean, Virginia, USA, 2002. p. 14-21.

REFERÊNCIAS ADICIONAIS

ANGONESE, Silvio Fernando; EDELWEISS, Nina. Gerenciador temporal de


versões de esquemas. In CONFERENCIA LATINOAMERICANA DE
INFORMÁTICA, 27., 2001, Mérida, Venezuela. Anais CLEI’2001. Mérida, 2001.
12 p.

BERLIAN, Rosalie Barreto; SALGADO, Ana Carolina. Aspectos semânticos em um


sistema de integração de informações na web. In: WORKSHOP DE WEB
SEMÂNTICA, 1., 2004, Brasília. Workshop Proceedings., 2004. 6 p.

DIAS, Fernando Skackauskas. Estudo exploratório da avaliação de sistemas de


informação. In: SIMPÓSIO MINEIRO DE SISTEMA DE INFORMAÇÃO, 2005,
Belo Horizonte, Anais SBC – SMSI. Belo Horizonte, 2005. 8 p.

EDELWEISS, Nina. Bancos de dados temporais: teoria e prática. In: JORNADA


DE ATUALIZAÇÃO EM INFORMÁTICA, 17. CONGRESSO NACIONAL DA SBC,
18, 1998. Recife: Sociedade Brasileira de Computação. v.2. Editora H.P. Moura.
Anais do XVIII Congresso Nacional da Sociedade Brasileira de Computação
“Rumo à Sociedade do Conhecimento”, Recife, 1998. p. 225-282.

FANDERUFF, Damaris. Oracle8i – Utilizando SQL*Plus e PL/SQL. 1. ed. São


Paulo: Editora Makron Books, 2000.

FERNANDES, Sérgio Antonio de Souza. O projecto de data warehouses: a


tecnologia ROLAP versus MOLAP. Lisboa, Portugal, janeiro, 2004. 13 p.

GARCIA-MOLINA, Hector.; ULLMAN, Jeffrey D.; WIDOM, Jennifer.


Implementação de Sistemas de Bancos de Dados. Tradução Vandenberg D. de
Souza. Database System Implementation – Rio de Janeiro. Editora: Campus,
2001.
106

GOLFARELLI, Mateo; MAIO, Dario; RIZZI, Stefano. Conceptual Design of


Data Warehouses from E/R Schemes. In: HAWAII INTERNATIONAL
HIERARQUIAS CONFERENCE ON SYSTEMS SCIENCES, 1998, Hawaii.
Proceedings. Hawaii, 1998. 10 p.

GRANDI, Fabio; MANDREOLI, Federica; TIBERIO, Paolo; BERGONZINI, Marco.


A temporal data model and management system for normative texts in XML
format. In: INTERNATIONAL WORKSHOP ON WEB INFORMATION AND
DATA MANAGEMENT, 1, 2003, New Orleans, USA. ACM - WIDM’03. New
Orleans, 2003. p. 29-36.

HEUSER, Carlos Alberto. Projeto de Banco de Dados. 3. ed. Porto Alegre:


Editora Sagra Luzzato (Instituto de Informática da UFRGS), 1999.

ITALIANO, Isabel Cristina; FERREIRA, João Eduardo. Synchronization options


for data warehouse designs. IEEE Computer Magazine, Revista do IEEE
Computer Society, março, 2006. p. 53-57.

KERN, Vinícius Medina. Modelagem de informação com IDEF1X: linguagem,


método, princípio do consenso. Revista Alcance, Itajaí, Editora da UNIVALI, v.3,
novembro, 1999. p. 99-107.

MACHADO, Felipe Nery R; ABREU, Mauricio. Projeto de Banco de Dados: uma


visão prática. São Paulo: Editora Érica Ltda, 1995.

MANUAIS DA ORACLE UNIVERSITY – Introdução ao oracle: SQL e SQL*Plus.


São Paulo: Editora Oracle Corporation, 2000.

MELO, Álvaro Nunes Lemos de; SILVA, Juliano Tonezer da Silva; CERVI,
Cristiano Roberto; PAVAN, Willingthon. PyDbDiff – uma ferramenta para
comparação de estruturas de bancos de dados. In: ESCOLA REGIONAL DE
BANCO DE DADOS – ERBD, 2, 2006, Passo Fundo, Universidade de Passo Fundo.
Anais da II Escola Regional de Banco de Dados, abril, 2006. 6 p.

MELO, Rubens Nascimento; SILVA, Sidney Dias da; TANAKA, Asterio Kyoshi.
Banco de Dados em Aplicações Cliente-Servidor. Rio de Janeiro: Editora
Infobook, 1997.

MERGEN, Sérgio Luis Sardi; HEUSER, Carlos Alberto. Ferb: um framework para
casamento de esquemas. In: ESCOLA REGIONAL DE BANCO DE DADOS –
107

ERBD, 2, 2006, Passo Fundo, Universidade de Passo Fundo. Anais da II Escola


Regional de Banco de Dados, abril, 2006. 6 p.

MOODY, Daniel L.; KORTINK, Mark A. R. From enterprise models to dimensional


models: a methodology for data warehouse and data mart design. In:
INTERNATIONAL WORKSHOP ON DESIGN AND MANAGEMENT OF DATA
WAREHOUSE, 28., p.2, 2000, Stockholm. Proceedings of the International
Workshop on Design and Management of Data Warehouse. Stockholm, june,
2000. p. 1-12.

NIST (National Institute of Standards and Technology). Federal Information


Processing Standards Publication 184. Integration definition for information
modeling (IDEF1X). Formalization was written by Robert G Brown. Gaithersburg,
MD (USA), december, 1993. 184 p.

OLIVEIRA, Paulo Jorge; RODRIGUES, Fátima; HENRIQUES, Pedro Rangel.


Limpeza de dados – uma visão geral. In: SIMPÓSIO DOUTORAL DO
DEPARTAMENTO DE INFORMÁTICA, 1., 2004. Málaga. Proceedings of Data
Gadgets 2004 Workshop–Bringing Up Emerging Solutions for Data
Warehousing Systems, Málaga, Espanha, 2004. p. 39-51.

ÖZSOYOGLU, G.; SNODGRASS, R. T. Temporal and real-time databases: a


survey. IEEE Transactions on Knowledge and Data Engineering, New York.
Revista do IEEE Computer Society. v.7, n.4, p.513, 1995.

PETERS, James F.; PEDRYCZ, Witold. Software engineering: an engineering


approach. New York: Library of Congress Cataloging-in-Publication Data, John
Wiley & Sons, 2000.

PINHEIRO, Sandro Favin; FORNARI, Miguel Rodrigues. Implementação de um


modelo conceitual temporal e espacial utilizando o SGBD oracle. In: Seminário de
Computação, 11, 2002. Blumenau. Anais do XI SEMINCO – Seminário de
Computação, Blumenau, setembro, 2002. p. 25-38.

PRESSMAN, Roger S. Engenharia de Software. 5. ed. Rio de Janeiro: Editora


McGraw Hill, 2002

SALEMI, Joe. Banco de dados Cliente/Servidor. Ed. IBPI/Press.

SALVADOR, Valéria Farinazzo Martins; BRITTO, Mozart; MOURA JR., Lincoln


de Assis; ALMEIDA JUNIOR, Jorge Rady. Qualidade de dados para gestão de
108

conhecimento na área de saúde. In: CONGRESSO BRASILEIRO DE


INFORMÁTICA EM SAÚDE, 10, 2006. Florianópolis. Anais do X Congresso
Brasileiro de Informática em Saúde, v.1, outubro, 2006. p. 548-553.

SOUZA, Solange Nice Alves de; CAMPOS, Edit Grassiani Lino; SANTOS, André
Roberto Doreto dos. Uma ferramenta para a definição de consultas baseada em
entidades e papéis. Revista IEEE América Latina. v.4, junho, 2006. p. 277-282.

STAIR, Ralph M. Princípios de Sistemas de Informação: uma abordagem


gerencial. 2 ed. Florida State University. Tradução de Maria Lúcia Lecker Vieira,
Dalton Conde de Alencar. Rio de Janeiro: Editora LTC – Livros Técnicos e
Científicos S.A., 1998.

TANSEL, Abdullah Uz. Temporal relational data model. Revista IEEE Computer
Society (IEEE Transactions on Knowledge e Data Engineering), v.9, n.3,
may/june, 1997. p. 464-479.

WANG, Fusheng; ZHOU, Xin; ZANIOLO, Carlo. Bridging relational database


history and the web: the XML approach. In: WORKSHOP ON WEB
INFORMATION AND DATA MANAGEMENT. Proceedings of the eighth ACM
international workshop on Web information and data management - ACM -
WIDM’06. Arlington, Virginia, USA, 2006. p. 3-10.

WIRTI, Carla Lia. Estudo de Técnicas para Casamento de Esquemas


Relacionais. In: CONGRESSO SUL CATARINENSE DE COMPUTAÇÃO, 1.
Promoção UNESC. Apoio SBC e FAPESC. Campus UNESC, Criciúma, Santa
Catarina, Brasil, 28 de setembro - 01 de outubro, 2005. 4 p.

Potrebbero piacerti anche