Você está na página 1de 8

Views (vises)

View representao lgica de um subconjunto de dados de uma ou mais tabelas.


View uma tabela virtual cujo contedo definido por uma query. Para o usurio,
a view aparece como uma tabela real, com um conjunto de colunas (cada uma com
um nome) e com registros de dados. Mas, ao contrrio de uma tabela, uma view no
existe no banco de dados como um conjunto de dados armazenados. Ao invs disto,
os registros e colunas de dados visveis pela view so resultado da execuo da query
que define a view.
O que uma viso?
Voc pode apresentar subconjuntos lgicos ou combinaes de dados criando vises
das tabelas. Uma viso uma tabela lgica baseada em uma tabela ou outra viso.
Uma viso no possui dados prprios, mas como uma janela pela qual os dados das
tabelas podem ser visualizados ou modificados. As tabelas nas quais uma viso
baseada so chamadas de tabelas bsicas. A viso armazenada como um comando
SELECT no dicionrio de dados.

Por que utilizar vises?

Para
Para
Para
Para

restringir o acesso ao banco de dados


tornar simples consultas complexas
permitir independncia de dados
apresentar vises diferentes dos mesmos dados

Vantagens de vises
Restringem o acesso para o banco de dados porque a viso pode exibir uma
poro seletiva do banco de dados;
Permitem aos usurios fazer consultas simples para recuperar os resultados de
consultas complexas. Por exemplo, vises permitem aos usurios consultar
informaes de mltiplas tabelas sem saber escrever um comando join;
Prov independncia dos dados para os usurios e programas de aplicao.
Uma viso pode ser utilizada para recuperar dados de vrias tabelas;
Prov acesso aos dados para grupos de usurios de acordo com seus critrios
particulares.
Criando uma Viso
Voc pode criar uma viso 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
FORCE
NOFORCE
Nome_da_view
Alias

Subquery
WITH CHECK OPTION
Constraint
WITH READ ONLY

Recria a viso caso ela j exista


Cria a viso mesmo que as tabelas bsicas no existam
Cria a viso somente se as tabelas bsicas existem.
Este o default.
o nome da viso
Especifica nomes para as expresses selecionadas pela
consulta da viso. O nmero de alias deve
corresponder ao nmero de expresses selecionadas
pela viso.
um comando SELECT completo. Voc pode utilizar
alias para as colunas na lista da clusula SELECT.
Especifica que somente as linhas acessveis para a
viso podem ser inseridas ou atualizadas
o nome atribudo a constraint da clusula CHECK
OPTION
Assegura que nenhuma operao DML possa ser
executada nesta viso

Exemplo: criar uma view que retorne todas as contas da agncia 45.
CREATE VIEW vContas45 AS
SELECT *
FROM CONTA
WHERE COD_AGENCIA = 45;
Comentrios sobre a Criao de Vises:
A subconsulta que define uma viso pode conter uma sintaxe complexa no
comando SELECT, incluindo joins, agrupamentos e subconsultas;

Se voc no especificar um nome de constraint para a viso criada com CHECK


OPTION, o sistema atribui um nome default no formato SYS_Cn.
Voc pode utilizar a opo OR REPLACE para modificar a definio da viso sem
ter que remov-la e recri-la ou ter que repassar os privilgios de objeto
previamente concedidos.

Recuperando Dados de uma Viso


Voc pode recuperar dados de uma viso da mesma forma que qualquer tabela. Voc
pode exibir o contedo de toda a viso ou apenas linhas e colunas especficas.
SELECT *
FROM nome_da_view

Vises no Dicionrio de Dados


Uma vez criada a viso, voc pode consultar a tabela do dicionrio de dados chamada
USER_VIEWS para obter o nome da viso e sua definio. O texto do comando
SELECT que constitui a viso armazenado em uma coluna tipo LONG.
Quando voc acessa dados, utilizando uma viso, o Servidor Oracle executa as
seguintes operaes:
1. Recupera a definio da viso no dicionrio de dados (USER_VIEWS);
2. Confere os privilgios de acesso para a tabela bsica da viso;
3. Converte a consulta para a viso em uma operao equivalente para a tabela
ou tabelas bsicas. Em outras palavras, os dados so recuperados a partir das
tabelas bsicas.

Modificando uma Viso


CREATE OR REPLACE VIEW nome_da_view AS
Subquery
A opo OR REPLACE permite recriar uma viso mesmo se outra j existir com este
nome, substituindo a verso anterior. Isto significa que a viso pode ser alterada sem
ser removida, recriando-a e mantendo os privilgios de objeto.
Vises Simples e Vises Complexas
Existem duas classificaes para as vises: simples e complexas. A diferena bsica
est relacionada s operaes DML (INSERT, UPDATE e DELETE) que podero ser
efetuadas.
Uma viso simples:
Deriva dados de uma nica tabela
No utiliza funes ou grupos de dados
Pode executar operaes DML atravs da viso
Uma

viso complexa:
Deriva dados de vrias tabelas
Utiliza funes ou grupos de dados
Normalmente no permite operaes DML atravs da viso

Caracterstica
Nmero de tabelas
Contm funes
Possui grupos de dados
DML atravs da viso

Viso Simples Viso Complexa


Uma
Uma ou mais
No
Sim
No
Sim
Sim
Talvez

Regras para Executar Operaes DML em uma Viso


Voc pode executar operaes DML nos dados atravs de uma viso desde que estas
operaes sigam certas regras. Pode-se remover uma linha de uma viso a menos
que ela contenha um dos seguintes:
- Funes de Grupo
- Clusula GROUP BY
- A palavra chave DISTINCT
Voc pode modificar dados em uma viso a menos que ela contenha quaisquer das
condies mencionadas para a excluso de linhas ou qualquer uma das seguintes:
- Colunas definidas por expresses, por exemplo: SALDO * 1.10
- A pseudo-coluna ROWNUM
Voc pode adicionar dados por uma viso a menos que ela contenha quaisquer das
condies mencionadas anteriormente ou se existirem colunas NOT NULL, sem um
valor default, na tabela bsica que no foram selecionadas pela viso. Todos os
valores exigidos devem estar presentes na viso. Lembre-se que voc est
adicionando valores diretamente na tabela referenciada pela viso.

Impedindo Operaes DML


Voc pode assegurar que nenhuma operao DML execute sobre a viso criando ela
com a opo WITH READ ONLY. Qualquer tentativa de alterar, excluir ou inserir uma
linha da viso resultar em um erro.
Removendo uma Viso
DROP VIEW nome_da_view
Voc utiliza o comando DROP VIEW para remover uma viso. O comando remove a
definio da viso do banco de dados. Remover vises no possui nenhum efeito nas
tabelas nas quais a viso estava baseada. Vises ou outras aplicaes baseadas em
vises apagadas tornam-se invlidas. Somente o dono ou um usurio com privilgio
DROP ANY VIEW pode remover uma viso.

Exerccios
Exerccio 1 Criar uma view, chamada vContasAg30 apenas com as contas da
agncia 30.
CREATE VIEW VCONTASAG30 AS
SELECT * FROM CONTA WHERE COD_AGENCIA=30;
Exerccio 2 - Criar uma view, chamada vCorrentistas, com o nmero da conta, nome
do correntista, telefone e endereo.
CREATE VIEW VCORRENTISTAS AS
SELECT NRO_CONTA, NOME, DDD_FONE, ENDERECO
FROM CONTA;
Exerccio 3 Criar uma view contendo informaes bancrias relacionadas s contas.
A consulta deve retornar:
- cdigo e nome da agncia
- nmero 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;
Exerccio 4 - Criar uma view, chamada vDadosAgencia, com o cdigo e nome da
agncia, nmero de contas correntes, Saldo Mnimo, Saldo Mximo e Saldo Mdio da
Agncia.
CREATE VIEW VDADOSAGENCIA AS
SELECT C.COD_AGENCIA,A.NOME, COUNT(C.NRO_CONTA) AS "QTD CONTAS",
MIN(C.SALDO) AS "SALDO MN", MAX(C.SALDO) AS "SALDO MX", AVG(C.SALDO) AS
"SALDO MDIO"

FROM CONTA C JOIN AGENCIA A ON A.COD_AGENCIA=C.COD_AGENCIA


GROUP BY C.COD_AGENCIA, A.NOME;
Exerccio 5 - Criar uma view com o valor total aplicado por aplicao. Nome da view:
vSaldoAplic. Tabelas envolvidas:
- Aplicacao
- Aplic_conta
- Apliccota_cota
Colunas resultantes da view:
- Cdigo da Aplicao
- Nome de Aplicao
- Saldo Total Aplicado (arredondar na 2 casa aps a vrgula).
CREATE VIEW VSALDOAPLIC AS
SELECT A.COD_APLICACAO, A.DESCRICAO,
ROUND(SUM(AC.NRO_COTAS * CO.VALOR_COTA), 2) AS VLR_APLIC
FROM APLICACAO A
JOIN APLIC_CONTA AC ON A.COD_APLICACAO = AC.COD_APLICACAO
JOIN APLIC_COTA CO ON AC.COD_APLICACAO = CO.COD_APLICACAO
WHERE CO.DATA= (SELECT MAX(DATA)
FROM APLIC_COTA
WHERE COD_APLICACAO = CO.COD_APLICACAO)
GROUP BY A.COD_APLICACAO, A.DESCRICAO
ORDER BY A.COD_APLICACAO;
Obs.: Valor Aplicado = aplic_conta.nro_cotas * aplic_cota.valor_cota.
Exerccio 6 Criar uma view que retorne o valor aplicado, totalizando por conta
corrente. Colunas da view:
- nmero da conta
- nome do correntista
- saldo em conta corrente
- valor total em aplicaes financeiras
Observao: 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_APLIC
FROM 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
GROUP BY CT.NRO_CONTA,CT.NOME, CT.SALDO
ORDER BY CT.NRO_CONTA;
Exerccio 7 (valer nota na composio da avaliao da disciplina).
Criar uma view consolidando as informaes bancrias relacionadas s contas. A view
deve retornar:

- cdigo e nome da agncia


- nmero da conta
- nome do correntista
- saldo na conta corrente
- valor total em aplicaes financeiras
- mdia mensal de gastos com carto de crdito nos ltimos 3 meses (pela dt vencto)
Observao: a view deve retornar todas as contas correntes.
Nome para view: vInfosContas
Para a mdia, considerar os 3 meses completos, anteriores a data do sistema
(sysdate). Ex.: considerando que a data do sistema seja xx/03/2015, o perodo para a
mdia seria de 01/12/2014 28/02/2015.
Funes de apoio que podem ser utilizadas ara chegar a este perodo de 3 meses:
- TRUNC (com o uso do parmetro 'MONTH')
- ADD_MONTHS
Publicar no Blackboard at a data definida no Ambiente.
Dicas:
11 registros
4 contas com valor aplicado
Valor aplicado = resultado questo 6
Media gastos:
- Utilizando a tabela fatura: 4 cartoes tero gastos
- Utilizando a tabela movto_cartao: 5 cartoes tero gastos
CREATE VIEW VINFOSCONTAS AS
SELECT 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_CARTAO
FROM 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_CONTA
GROUP BY CT.NRO_CONTA,CT.NOME, CT.SALDO
ORDER BY CT.NRO_CONTA;
Select obter data distema, data inicio e fim do ms, perodo

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,
TO_CHAR( TRUNC(SYSDATE,'MONTH')-1,'DD/MM/YYYY') AS PERIODO_FINAL
FROM DUAL;