07_Views(1)

11
Views (visões) View – representação lógica de um subconjunto de dados de uma ou mais tabelas. View – é uma “tabela virtual” cujo conteúdo é definido por uma query. Para o usuário, a view aparece como uma tabela real, com um conjunto de colunas (cada uma com um nome) e com registros de dados. Mas, ao contrário de uma tabela, uma view não existe no banco de dados como um conjunto de dados armazenados. Ao invés disto, os registros e colunas de dados visíveis pela view são resultado da execução da query que define a view. O que é uma visão? Você pode apresentar subconjuntos lógicos ou combinações de dados criando visões das tabelas. Uma visão é uma tabela lógica baseada em uma tabela ou outra visão. Uma visão não possui dados próprios, mas é como uma janela pela qual os dados das tabelas podem ser visualizados ou modificados. As tabelas nas quais uma visão é baseada são chamadas de tabelas básicas. A visão é armazenada como um comando SELECT no dicionário de dados. Por que utilizar visões? Para restringir o acesso ao banco de dados Para tornar simples consultas complexas

description

Introducao a views

Transcript of 07_Views(1)

Page 1: 07_Views(1)

Views (visões)

View – representação lógica de um subconjunto de dados de uma ou mais tabelas.

View – é uma “tabela virtual” cujo conteúdo é definido por uma query. Para o usuário, a view aparece como uma tabela real, com um conjunto de colunas (cada uma com um nome) e com registros de dados. Mas, ao contrário de uma tabela, uma view não existe no banco de dados como um conjunto de dados armazenados. Ao invés disto, os registros e colunas de dados visíveis pela view são resultado da execução da query que define a view.

O que é uma visão?

Você pode apresentar subconjuntos lógicos ou combinações de dados criando visões das tabelas. Uma visão é uma tabela lógica baseada em uma tabela ou outra visão. Uma visão não possui dados próprios, mas é como uma janela pela qual os dados das tabelas podem ser visualizados ou modificados. As tabelas nas quais uma visão é baseada são chamadas de tabelas básicas. A visão é armazenada como um comando SELECT no dicionário de dados.

Por que utilizar visões?

Para restringir o acesso ao banco de dados Para tornar simples consultas complexas Para permitir independência de dados Para apresentar visões diferentes dos mesmos dados

Page 2: 07_Views(1)

Vantagens de visões

Restringem o acesso para o banco de dados porque a visão pode exibir uma porção seletiva do banco de dados;

Permitem aos usuários fazer consultas simples para recuperar os resultados de consultas complexas. Por exemplo, visões permitem aos usuários consultar informações de múltiplas tabelas sem saber escrever um comando join;

Provê independência dos dados para os usuários e programas de aplicação. Uma visão pode ser utilizada para recuperar dados de várias tabelas;

Provê acesso aos dados para grupos de usuários de acordo com seus critérios particulares.

Criando uma Visão

Você pode criar uma visão inserindo uma subconsulta dentro do comando CREATE VIEW. Sintaxe:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nome_da_view [(alias[, alias]…)]AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY]

OR REPLACE Recria a visão caso ela já existaFORCE Cria a visão mesmo que as tabelas básicas não existamNOFORCE Cria a visão somente se as tabelas básicas existem.

Este é o default.Nome_da_view É o nome da visãoAlias Especifica nomes para as expressões selecionadas pela

consulta da visão. O número de alias deve corresponder ao número de expressões selecionadas pela visão.

Subquery É um comando SELECT completo. Você pode utilizar alias para as colunas na lista da cláusula SELECT.

WITH CHECK OPTION Especifica que somente as linhas acessíveis para a visão podem ser inseridas ou atualizadas

Constraint É o nome atribuído a constraint da cláusula CHECK OPTION

WITH READ ONLY Assegura que nenhuma operação DML possa ser executada nesta visão

Exemplo: criar uma view que retorne todas as contas da agência 45.CREATE VIEW vContas45 AS SELECT * FROM CONTA WHERE COD_AGENCIA = 45;

Comentários sobre a Criação de Visões: A subconsulta que define uma visão pode conter uma sintaxe complexa no

comando SELECT, incluindo joins, agrupamentos e subconsultas; Se você não especificar um nome de constraint para a visão criada com CHECK

OPTION, o sistema atribui um nome default no formato SYS_Cn.

Page 3: 07_Views(1)

Você pode utilizar a opção OR REPLACE para modificar a definição da visão sem ter que removê-la e recriá-la ou ter que repassar os privilégios de objeto previamente concedidos.

Recuperando Dados de uma Visão

Você pode recuperar dados de uma visão da mesma forma que qualquer tabela. Você pode exibir o conteúdo de toda a visão ou apenas linhas e colunas específicas.

SELECT *FROM nome_da_view

Visões no Dicionário de Dados

Uma vez criada a visão, você pode consultar a tabela do dicionário de dados chamada USER_VIEWS para obter o nome da visão e sua definição. O texto do comando SELECT que constitui a visão é armazenado em uma coluna tipo LONG.

Quando você acessa dados, utilizando uma visão, o Servidor Oracle executa as seguintes operações:

1. Recupera a definição da visão no dicionário de dados (USER_VIEWS);2. Confere os privilégios de acesso para a tabela básica da visão;3. Converte a consulta para a visão em uma operação equivalente para a tabela

ou tabelas básicas. Em outras palavras, os dados são recuperados a partir das tabelas básicas.

Page 4: 07_Views(1)

Modificando uma Visão

CREATE OR REPLACE VIEW nome_da_view ASSubquery

A opção OR REPLACE permite recriar uma visão mesmo se outra já existir com este nome, substituindo a versão anterior. Isto significa que a visão pode ser alterada sem ser removida, recriando-a e mantendo os privilégios de objeto.

Visões Simples e Visões Complexas

Existem duas classificações para as visões: simples e complexas. A diferença básica está relacionada às operações DML (INSERT, UPDATE e DELETE) que poderão ser efetuadas.Uma visão simples:

Deriva dados de uma única tabela Não utiliza funções ou grupos de dados Pode executar operações DML através da visão

Uma visão complexa: Deriva dados de várias tabelas Utiliza funções ou grupos de dados Normalmente não permite operações DML através da visão

Característica Visão Simples Visão Complexa

Número de tabelas Uma Uma ou maisContém funções Não SimPossui grupos de dados Não SimDML através da visão Sim Talvez

Regras para Executar Operações DML em uma Visão

Você pode executar operações DML nos dados através de uma visão desde que estas operações sigam certas regras. Pode-se remover uma linha de uma visão a menos que ela contenha um dos seguintes:- Funções de Grupo- Cláusula GROUP BY- A palavra chave DISTINCT

Você pode modificar dados em uma visão a menos que ela contenha quaisquer das condições mencionadas para a exclusão de linhas ou qualquer uma das seguintes:- Colunas definidas por expressões, por exemplo: SALDO * 1.10- A pseudo-coluna ROWNUM

Você pode adicionar dados por uma visão a menos que ela contenha quaisquer das condições mencionadas anteriormente ou se existirem colunas NOT NULL, sem um valor default, na tabela básica que não foram selecionadas pela visão. Todos os valores exigidos devem estar presentes na visão. Lembre-se que você está adicionando valores diretamente na tabela referenciada pela visão.

Page 5: 07_Views(1)

Impedindo Operações DML

Você pode assegurar que nenhuma operação DML execute sobre a visão criando ela com a opção WITH READ ONLY. Qualquer tentativa de alterar, excluir ou inserir uma linha da visão resultará em um erro.

Removendo uma Visão

DROP VIEW nome_da_view

Você utiliza o comando DROP VIEW para remover uma visão. O comando remove a definição da visão do banco de dados. Remover visões não possui nenhum efeito nas tabelas nas quais a visão estava baseada. Visões ou outras aplicações baseadas em visões apagadas tornam-se inválidas. Somente o dono ou um usuário com privilégio DROP ANY VIEW pode remover uma visão.

Exercícios

Exercício 1 – Criar uma view, chamada vContasAg30 apenas com as contas da agência 30.

CREATE VIEW VCONTASAG30 ASSELECT * FROM CONTA WHERE COD_AGENCIA=30;

Exercício 2 - Criar uma view, chamada vCorrentistas, com o número da conta, nome do correntista, telefone e endereço.

CREATE VIEW VCORRENTISTAS AS SELECT NRO_CONTA, NOME, DDD_FONE, ENDERECO FROM CONTA;

Exercício 3 – Criar uma view contendo informações bancárias relacionadas às contas. A consulta deve retornar:- código e nome da agência- número da conta- nome do correntista- saldo na conta corrente

CREATE VIEW VINFOCORRENTISTAS AS SELECT A.COD_AGENCIA, A.NOME AS NOME_AGENCIA, C.NRO_CONTA, C.NOME, C.SALDO FROM AGENCIA A JOIN CONTA C ON C.COD_AGENCIA=A.COD_AGENCIA;

Exercício 4 - Criar uma view, chamada vDadosAgencia, com o código e nome da agência, número de contas correntes, Saldo Mínimo, Saldo Máximo e Saldo Médio da Agência.

CREATE VIEW VDADOSAGENCIA AS SELECT C.COD_AGENCIA,A.NOME, COUNT(C.NRO_CONTA) AS "QTD CONTAS", MIN(C.SALDO) AS "SALDO MÍN", MAX(C.SALDO) AS "SALDO MÁX", AVG(C.SALDO) AS "SALDO MÉDIO"FROM CONTA C JOIN AGENCIA A ON A.COD_AGENCIA=C.COD_AGENCIAGROUP BY C.COD_AGENCIA, A.NOME;

Page 6: 07_Views(1)

Exercício 5 - Criar uma view com o valor total aplicado por aplicação. Nome da view: vSaldoAplic. Tabelas envolvidas:- Aplicacao- Aplic_conta- Apliccota_cotaColunas resultantes da view:- Código da Aplicação- Nome de Aplicação- Saldo Total Aplicado (arredondar na 2ª casa após a vírgula).

CREATE VIEW VSALDOAPLIC AS SELECT A.COD_APLICACAO, A.DESCRICAO, ROUND(SUM(AC.NRO_COTAS * CO.VALOR_COTA), 2) AS VLR_APLICFROM APLICACAO A JOIN APLIC_CONTA AC ON A.COD_APLICACAO = AC.COD_APLICACAO JOIN APLIC_COTA CO ON AC.COD_APLICACAO = CO.COD_APLICACAOWHERE CO.DATA= (SELECT MAX(DATA) FROM APLIC_COTA WHERE COD_APLICACAO = CO.COD_APLICACAO)GROUP BY A.COD_APLICACAO, A.DESCRICAOORDER BY A.COD_APLICACAO;

Obs.: Valor Aplicado = aplic_conta.nro_cotas * aplic_cota.valor_cota.

Exercício 6 – Criar uma view que retorne o valor aplicado, totalizando por conta corrente. Colunas da view:- número da conta- nome do correntista- saldo em conta corrente- valor total em aplicações financeirasObservação: a view deve retornar todas as contas correntes.

CREATE VIEW VTOTALCONTA AS SELECT CT.NRO_CONTA, CT.NOME, CT.SALDO, COALESCE(ROUND(SUM(AC.NRO_COTAS * CO.VALOR_COTA), 2),0) AS VLR_APLICFROM CONTA CT LEFT JOIN APLIC_CONTA AC ON CT.NRO_CONTA=AC.NRO_CONTA LEFT JOIN (SELECT COD_APLICACAO, MAX(DATA) AS MAIOR_DATA FROM APLIC_COTA GROUP BY COD_APLICACAO ) MA ON AC.COD_APLICACAO = MA.COD_APLICACAO LEFT JOIN APLIC_COTA CO ON MA.COD_APLICACAO = CO.COD_APLICACAO AND CO.DATA= MA.MAIOR_DATAGROUP BY CT.NRO_CONTA,CT.NOME, CT.SALDOORDER BY CT.NRO_CONTA;

Exercício 7 – (valerá nota na composição da avaliação da disciplina). Criar uma view consolidando as informações bancárias relacionadas às contas. A view deve retornar:- código e nome da agência- número da conta- nome do correntista- saldo na conta corrente

Page 7: 07_Views(1)

- valor total em aplicações financeiras- média mensal de gastos com cartão de crédito nos últimos 3 meses (pela dt vencto)Observação: a view deve retornar todas as contas correntes.

Nome para view: vInfosContas

Para a média, considerar os 3 meses completos, anteriores a data do sistema (sysdate). Ex.: considerando que a data do sistema seja xx/03/2015, o período para a média seria de 01/12/2014 à 28/02/2015.

Funções de apoio que podem ser utilizadas ara chegar a este período de 3 meses:- TRUNC (com o uso do parâmetro 'MONTH')- ADD_MONTHS

Publicar no Blackboard até a data definida no Ambiente.Dicas:11 registros4 contas com valor aplicadoValor aplicado = resultado questão 6Media gastos:- Utilizando a tabela fatura: 4 cartoes terão gastos- Utilizando a tabela movto_cartao: 5 cartoes terão gastos

CREATE VIEW VINFOSCONTAS ASSELECT CT.NRO_CONTA, CT.NOME, CT.SALDO, COALESCE(ROUND(SUM(AC.NRO_COTAS * CO.VALOR_COTA), 2),0) AS VLR_APLIC,COALESCE(ROUND(MIN(SC.TOTAL_CARTAO/3), 2),0) AS MEDIA_CARTAOFROM CONTA CT LEFT JOIN APLIC_CONTA AC ON CT.NRO_CONTA=AC.NRO_CONTA LEFT JOIN (SELECT COD_APLICACAO, MAX(DATA) AS MAIOR_DATA FROM APLIC_COTA GROUP BY COD_APLICACAO ) MA ON AC.COD_APLICACAO = MA.COD_APLICACAO LEFT JOIN APLIC_COTA CO ON MA.COD_APLICACAO = CO.COD_APLICACAO AND CO.DATA= MA.MAIOR_DATA LEFT JOIN (SELECT CA.NRO_CONTA,SUM(FT.VALOR) AS TOTAL_CARTAO FROM FATURA FT JOIN CARTAO CA ON CA.NRO_CARTAO=FT.NRO_CARTAO WHERE FT.DATA_VECTO>=TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-3),'DD/MM/YYYY') AND FT.DATA_VECTO<=TO_CHAR(TRUNC(SYSDATE,'MONTH')-1 ,'DD/MM/YYYY') GROUP BY CA.NRO_CONTA) SC ON CT.NRO_CONTA = SC.NRO_CONTAGROUP BY CT.NRO_CONTA,CT.NOME, CT.SALDOORDER BY CT.NRO_CONTA;

Select obter data distema, data inicio e fim do mês, período

SELECT sysdate, TO_CHAR(TRUNC(SYSDATE,'MONTH'),'DD/MM/YYYY') AS PRIMEIRO_DIA, TO_CHAR(LAST_DAY(SYSDATE),'DD/MM/YYYY') AS ULTIMO_DIA , TO_CHAR( ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-3),'DD/MM/YYYY') AS PERIODO_INICIAL,

Page 8: 07_Views(1)

TO_CHAR( TRUNC(SYSDATE,'MONTH')-1,'DD/MM/YYYY') AS PERIODO_FINAL FROM DUAL;