apostila banco de dados (2)

109
Av. Getúlio Vargas, 1200 – Vila Nova Santana – Assis – SP – 19807-634 Fone/Fax: (0XX18) 3302 1053 homepage: www.fema.edu.br 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)

Upload: virgulinos188205

Post on 30-Jun-2015

692 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Apostila Banco de Dados (2)

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

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

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)

Page 2: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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).

Page 3: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 4: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Banco Dados Operacional

Estados Atuais

o último estado de um dado é o que prevalece

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.

Page 5: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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).

Page 6: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 7: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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).

Page 8: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 9: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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 Varejo

Vendas 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.

Page 10: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

9

Vendas Varejo

Vendas Catálogo

Código_tamanho (cm)

Código_tamanho (m)

Código_tamanho (cm) Data Warehouse

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.

Data Warehouse

Banco de Dados

Operacional

alteração

inclusão

exclusão

carga

carga

carga

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

(2003,p.15).

Page 11: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 12: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Banco Dados Temporais

Estados

Passados e Atuais

todos os estados de um dado são mantidos

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

Page 13: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 14: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 15: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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 2

Chave Dimensão 2

Atributo 2.1Atributo 2.2. . . . . . Atributo 2.n

TABELA DIMENSÃO 1

Chave Dimensão 1

Atributo 1.1Atributo 1.2. . . . . . Atributo 1.n

TABELA DIMENSÃO 3

Chave Dimensão 3

Atributo 3.1Atributo 3.2. . . . . . Atributo 3.n

TABELA DIMENSÃO x

Chave Dimensão x

Atributo x.1Atributo x.2. . . . . . Atributo x.n

TABELA FATO

Chave Dimensão 1

Chave Dimensão 2

Chave Dimensão 3

Chave Dimensão x

Fato 1Fato 2. . . . . . Fato 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

Page 16: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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)

Page 17: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

16

DIMENSÃO 1

ID_DIMENSÃO_1ATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

FATO

ID_DIMENSÃO_1ID_DIMENSÃO_2ID_DIMENSÃO_3ID_DIMENSÃO_NATRIBUTO_1ATRIBUTO_2..ATRIBUTO_NDIMENSÃO 3

ID_DIMENSÃO_3ATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

DIMENSÃO 2

ID_DIMENSÃO _2ATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

DIMENSÃO N

ID_DIMENSÃO_NATRIBUTO_1ATRIBUTO_2..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.

Page 18: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

17

DIMENSÃO_1

ID_DIMENSÃO_1ATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

FATO

ID_DIMENSÃO_1ID_DIMENSÃO_2ID_DIMENSÃO_3ID_DIMENSÃO_NATRIBUTO_1ATRIBUTO_2..ATRIBUTO_NDIMENSÃO_3

ID_DIMENSÃO_3ATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

DIMENSÃO_2

ID_DIMENSÃO _2ATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

DIMENSÃO_N

ID_DIMENSÃO_NATRIBUTO_1ATRIBUTO_2..ATRIBUTO_N

DIMENSÃO_31

ID_DIMENSÃO_31ATRIBUTO_1ATRIBUTO_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

Page 19: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

18

Tipo de Informação/Uso

Operacional Informativo/Analítico

Tipo de processamento

OLTP (base em transações)

OLAP (base em análise)

Unidade de Trabalho Inclusão, Alteração, Exclusão e Consulta

Carga 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

constantemente Dados mudam

raramente Dados Atuais/Operacionais Históricos

Nº de registros Pequeno nº de reg. por

Transação Grande nº de reg. por

Análise Acessos Grande Volume de

Transações

Médio Volume de 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.

Page 20: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 21: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 22: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 23: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 24: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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,

Page 25: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

24

representando parte do Banco de Dados Histórico. A parte de cima da figura representa parte de um modelo de dados operacional.

PRODUTO VENDAestá

ID_PROD DESCRIÇÃONUMERO

DATA PREÇO_ÉPOCAPREÇO

HORA

QTDE

HIST_VENDA

NUMERO

DATA

PREÇO_ÉPOCAHORA

QTDE

TOTAL

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

Page 26: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 27: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

26

MODELO DE DADOS OPERACIONAL

EMPREGADO

VERBA RECEBECATEGORIA

CARGO

LOCALIDADE

FOLHA_SITUACAOpossui possui

possui

COORDENADORIA

CURSO

DISCIPLINA

EXERCE

possui

ALUNO

NOTA_FALTA

reside

SITUACAO_MATRICULA

possui

ACADEMICO_SITUACAO

possui

reside

CódigoDescriçãoSalário

CódigoNome

CódigoDescriçãoCategoriaReferência. . . . .

Mês_AnoQuantidadeValor

CódigoDescrição

CódigoDescrição

CódigoCoordenadoriaDescrição. . . . .

CódigoDescrição

MatriculaNomeSérieTurma. . . . .

CódigoDescrição

RATurmaAnoNota1Nota2MédiaFaltas1. . .Faltas12. . . . .

ID

Descrição

Categoria_atual

ID

Descrição

Estado

ID

Nome

Dt_nasc

Sexo

Endereço

Dt_admis

. . . . .

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.

Page 28: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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,

Page 29: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 30: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 31: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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:

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.

APLICAÇÃO

APLICAÇÃO

OUTROS

DBMS

ORACLE

SQL IF ... THEN SQL ELSE SQL END IF; SQL

SQL

SQL

SQL

Page 32: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 33: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

32

4.3.1. EXECUTANDO INSTRUÇÕES E BLOCOS PL/SQL A PARTIR DO CÓDIGO SQL*PLUS

• 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

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

Page 34: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 35: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 36: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 37: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 38: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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;

Page 39: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

instruções := Atribuição

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.

Page 40: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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 */.

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:

• CH(10) = ENTER

Exemplo de instruções:

• Converte em letra minúscula

….. 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

v_lista_endereco := v_nome | | CHR(10) | | v_endereço | | CHR(10) | | v_estado | | CHR(10) | | v_cep;

v_nome := LOWER(v_nome);

Page 41: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

• valor : é uma string de caractere, número ou data

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

Exemplo de instruções:

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.

v_data := TO_DATE (‘September 20, 2001’, ‘Month DD, YYYY’);

TO_CHAR (valor, fmt) TO_DATE (valor, fmt) TO_NUMBER (valor, fmt)

Page 42: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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;

Page 43: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

42

4.6.3. INSTRUÇÃO INSERT EM PL/SQL. Exemplo de instruções:

4.6.4. INSTRUÇÃO UPDATE EM PL/SQL. Exemplo de instruções:

4.6.5. INSTRUÇÃO DELETE EM PL/SQL. Exemplo de instruções:

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 */

BEGIN INSERT INTO professor(codigo, nome, salario, nascimento) VALUES (codigo_sequence.NEXTVAL, ‘Douglas’, 1450, ’10-DEC-00’); END;

DECLARE v_aumento professor.salario%TYPE := 245; BEGIN UPDATE professor SET salario = salario + v_aumento WHERE codigo=10; END;

DECLARE v_codigo professor.codigo%TYPE := 9; BEGIN DELETE FROM professor WHERE codigo=v_codigo; END;

Page 44: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 45: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

• 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.

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

Page 46: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

45

Exemplo de instruções:

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:

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:

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%.

IF nome = ‘Alex’ THEN mensagem := 10; END IF;

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

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

Page 47: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

46

Exemplo de instruções:

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

..... 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; .....

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

Page 48: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

47

Exemplo de instruções:

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

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 contador IN [REVERSE] lower_bound..upper_bound LOOP instrução1; instrução2; ..... END LOOP;

FOR i IN 1..3 LOOP instrução1; END LOOP;

Page 49: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

48

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

Inserir os 5 novos produtos para o número do pedido 10. Exemplo de instruções

WHILE 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.

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

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 condição LOOP instrução1; instrução2; ..... END LOOP;

Page 50: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

49

Exemplo de instruções:

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.

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;

Page 51: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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;

Page 52: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

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

ABRIR O CURSOR

EXTRAINDO DADOS DO CURSOR

CURSOR cursor_name IS select_statement;

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 .....

OPEN cursor_name;

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

Page 53: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

52

Exemplos de instruções:

Recupere os primeiros 5 professores, um por um.

FECHAR O CURSOR

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.

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

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;

CLOSE cursor_name;

Page 54: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

53

%ISOPEN

%NOTFOUND Recupere os primeiros 5 professores, um por um.

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

IF NOT professor_cursor%ISOPEN THEN OPEN professor_cursor; END IF; LOOP FETCH professor_cursor ...

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;

Page 55: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 56: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

55

FUNÇÕES PARA CAPTURAR EXCEÇÕES

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.

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;

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;

Page 57: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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)

Page 58: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

57

MOVIMENTO RELACIONAL

CRIAÇÃO DAS TABELAS Tabela de Cargos

Tabela de Funcionários Tabela de Dependentes

TABREG MATRICULA CARGO DATA SALARIO

TABFUN MATRICULA NOME SALARIO ADMISSAO CARGO

TABCAR CODIGO DESCRICAO

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

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));

TABDEP MATRICULA SEQUENCIA NOME NASCIMENTO

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));

Page 59: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

58

Tabela de Registros CARGA NA BASE DE DADOS

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

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

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 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);

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');

Page 60: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 61: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

60

4.11.2.3. SINTAXE PARA CRIAÇÃO DE PROCEDIMENTOS 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.

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;

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

ProcedimentoProcedimento

(DECLARE)(DECLARE)

BEGINBEGIN

EXCEPTIONEXCEPTION

END;END;

parâmetro INparâmetro IN

parâmetro OUTparâmetro OUT

parâmetro IN OUTparâmetro IN OUT

Ambiente de Ambiente de ChamadaChamada

Page 62: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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. Executando o procedimento direto. Executando o procedimento novos_funcionarios via bloco PL/SQL Consulta a tabela de funcionários 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.

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; /

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

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

SELECT * FROM tabfun;

Page 63: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

62

Exemplo: Criando uma seqüência 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.

Exemplo2 (IN): Criando um procedimento para reajustar o salário dos funcionários. Executando o procedimento direto

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; /

EXECUTE reajuste_salario (10,10);

EXECUTE reajuste_salario (11,130);

CREATE SEQUENCE num_fun START WITH 40;

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

Page 64: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

63

Exemplo3 (OUT): Criando um procedimento para consultar funcionários. Salvar o fonte (procedimento) e em seguida cria-lo. Criando variáveis globais (de host) para utilizá-las na execução do procedimento Executando o procedimento consulta_fun e mostrando os valores das variáveis Exemplo4 (IN OUT): Criando um procedimento para formatar telefone.

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; /

SAVE <caminho> nome_arq.sql START <caminho> nome_arq.sql

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

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

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; /

Page 65: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

64

Habilitando a saída de resultados na tela Executando o procedimento telefone via bloco PL/SQL 4.11.2.5. REMOVENDO UM PROCEDIMENTO USANDO O SQL*PLUS Exemplo1: Eliminar o procedimento consulta de funcionários 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.

SET SERVEROUTPUT ON

DROP PROCEDURE nome_procedimento;

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

DROP PROCEDURE consulta_fun;

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)

Page 66: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 67: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

66

4.11.3.3. SINTAXE PARA CRIAÇÃO DE FUNÇÕES 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.

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.

CREATE [OR REPLACE] FUNCTION nome_função (parâmetro1 [modo1] tipodedados1, parâmetro2 [modo2] tipodedados2, . . .) RETURN tipodedados IS | AS PL/SQL Block;

Ambiente de Ambiente de ChamadaChamada

ProcedimentoProcedimento

(DECLARE)(DECLARE)

BEGINBEGIN

EXCEPTIONEXCEPTION

END;END;

parâmetro INparâmetro IN

parâmetro OUTparâmetro OUT

parâmetro IN OUTparâmetro IN OUT

Page 68: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

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; /

START <caminho> nome_arq.sql

Page 69: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

68

Criando variáveis de host Executando a função Consultando o valor

EXECUTANDO UMA FUNÇÃO DE UM BLOCO PL/SQL Crie um bloco PL/SQL para a execução: Exemplo2: Criar uma função para consultar quantas vezes o funcionário mudou de cargo ou de salário.

VARIABLE g_salario NUMBER

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

PRINT g_salario

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; /

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

SET SERVEROUTPUT ON

Page 70: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

69

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

4.11.3.7. REMOVENDO FUNÇÕES Sintaxe: Exemplo1: 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. 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;

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

DROP FUNCTION nome_função;

DROP FUNCTION consulta_salario;

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)

Page 71: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 72: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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. Consultando a tabela USER_OBJECTS A tabela USER_SOURCE armazena o código fonte referente aos objetos criados. A seguir, é apresentada a estrutura da tabela USER_SOURCE. Consultando a tabela USER_SOURCE

SELECT DISTINCT object_type FROM user_objects;

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

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

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

SELECT * FROM user_source WHERE name='NOME_OBJETO'

Page 73: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

72

Listar somente o código fonte Consultar erros de compilação

Consultar tabelas DICT e USER_TABLES

Descrever as estruturas de armazenamento dos objetos

Descrever as estruturas das tabelas

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

Consultar erros de compilação

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.

SELECT table_name FROM dict; SELECT table_name FROM user_tables;

DESC user_objects

DESC user_tables

DESC user_source

SHOW ERRORS DESC user_errors

SELECT text FROM user_source WHERE name=’CONSULTA_SALARIO’ ORDER BY line;

Page 74: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 75: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 76: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 77: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

76

Exemplo1: Criando um gatilho de instrução para verificar alteração de dados fora de horário. Testando o gatilho: 4.11.5.11. SINTAXE PARA CRIAÇÃO DE GATILHOS DE LINHAS • 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%.

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; /

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

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;

Page 78: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

77

Testando o gatilho:

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

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 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; /

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; /

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; /

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

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

Page 79: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

78

Testando o gatilho:

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. 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.

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

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; /

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

Page 80: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

79

Na tabela USER_SOURCE também pode ser encontrado o código fonte referente aos gatilhos criados.

Consultando a tabela USER_SOURCE 4.11.5.13. GERENCIANDO GATILHOS Habilitar um gatilho de uma tabela

Desabilitar um gatilho

Habilitar todos os gatilhos de uma tabela

Desabilitar todos os gatilhos de uma tabela

Carregar um gatilho Compilar um gatilho 4.10.5.11. REMOVENDO GATILHOS Sintaxe: Exemplo1:

ALTER TRIGGER nome_trigger ENABLE

ALTER TRIGGER nome_trigger DISABLE

ALTER TABLE nome_tabela DISABLE ALL_TRIGGERS

ALTER TABLE nome_tabela ENABLE ALL_TRIGGERS

START caminho nome_gatilho.SQL

ALTER TRIGGER nome_gatilho COMPILE

DROP TRIGGER nome_gatilho;

DROP TRIGGER salario_fixo;

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

Page 81: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 82: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

81

4.11.6.2. SINTAXE PARA CRIAÇÃO DE UMA ESPECIFICAÇÃO DE 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: 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 • corpo_pacote: contém o código dos procedimentos e funções.

CREATE [OR REPLACE] PACKAGE nome_pacote {IS | AS} especificação_pacote END nome_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; /

CREATE [OR REPLACE] PACKAGE BODY nome_pacote {IS | AS} corpo_pacote END nome_pacote;

Page 83: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

82

O exemplo a seguir cria o corpo do pacote 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.

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; /

Page 84: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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. 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. 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. 4.11.6.6. REMOVENDO UM PACOTE

SELECT tabfun_pacote.get_tabfun_ref_cursor FROM dual;

CALL tabfun_pacote.update_tabfun_salario(10, 1.15);

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

DROP PACKAGE tabfun_pacote;

Page 85: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 86: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

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

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

Page 87: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

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

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

Page 88: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

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:

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.

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

/carta/cabeçalho/remetente

Page 89: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

88

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

Figura 29. XMLELEMENT ( )

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

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

Page 90: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

89

O resultado traz todos os nomes da tabela professor:

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( ):

Figura 31. XMLATTRIBUTES( )

Resultado:

Figura 32. Resultado XMLATTRIBUTES ( )

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>

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);

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

Page 91: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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( ):

Figura 33. XMLFOREST( ) Resultado da consulta:

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( ):

Figura 35. XMLAGG ( )

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);

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>

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

Page 92: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

91

Resultado do select:

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:

Figura 37. XMLCOLATTVAL( ) Resultado:

Figura 38. Resultado XMLCOLATTVAL( )

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

r>

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

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>

Page 93: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

92

5.2.12. XMLCONCAT( ) A XMLCONCAT( ) serve para concatenar elementos. Exemplo de XMLCONCAT( ) utilizando a tabela professor:

Figura 39. XMLCONCAT( )

Resultado:

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:

Figura 41. XMLPARSE( )

Resultado:

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

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

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

Page 94: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

93

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( ):

Figura 43. XMLPI( ) Resultado:

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:

Figura 45. XMLCOMMENT( )

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

select xmlpi(name "order_status",'placed,pending,shipped' ) as xml_order_status_pi from dual;

XML_ORDER_STATUS_PI <?order_status placed,pending,shipped?>

select xmlcomment('Exemplo de comentario XML' ) as xml_comment from dual;

Page 95: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

94

Resultado:

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( ):

Figura 47. XMLSEQUENCE( ) Resultado:

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).

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

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;

ORDER_VALUES <b>placed</b> <b>pending</b>

Page 96: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

95

Figura 49. XMLSERIALIZE( ) Resultado:

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.

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

XML_ORDER_STATUS <order_status>shipped</order_status>

Page 97: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 98: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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).

Page 99: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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

Page 100: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

Page 101: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

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.

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.

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.

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; /

CREATE DIRECTORY TEMP_FILES_DIR AS ‘C:\temp_files’;

Page 102: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

101

Figura 53. Chamando o Procedimento Ao acessar o diretório e abrir o documento XML, o seguinte resultado será exibido:

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:

CALL write_xml_data_to_file('TEMP_FILES_DIR','cidades.xml');

<?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>

Page 103: Apostila Banco de Dados (2)

Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:[email protected]

102

Figura 54. Procedimento para Importação XML Para executar o procedimento é preciso seguir o que mostra a figura a seguir:

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.

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; /

set serveroutput on

exec loadxml(1,’cidade’);

Page 104: Apostila Banco de Dados (2)

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.

Page 105: Apostila Banco de Dados (2)

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.

Page 106: Apostila Banco de Dados (2)

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.

Page 107: Apostila Banco de Dados (2)

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 –

Page 108: Apostila Banco de Dados (2)

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

Page 109: Apostila Banco de Dados (2)

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.