Visões no Oracle: Criação, Modificação e Análise Top-N

No contexto de bancos de dados relacionais, visões são objetos essenciais que permitem criar consultas abstratas a partir de tabelas base. Eles oferecem benefícios como controle de acesso, simplificação de consultas e independência de dados, evitando repetição de operações de leitura.

Objetos Comuns em Bancos de Dados

Objeto Descrição
Tabela Coleção primária de armazenamento de dados, estruturada em linhas e colunas
Visão Conjunto lógico de dados derivado de tabelas subjacentes
Sequência Gerador de valores numéricos sequenciais
Índice Melhora o desempenho de consultas
Sinônimo Fornece um nome alternativo para objetos do banco de dados

Categorias de Visões

As visões podem ser classificadas com base em sua complexidade:

Característica Visão Simples Visão Complexa
Tabelas envolvidas Uma única tabela Uma ou múltiplas tabelas
Funções agregadas Não utiliza Pode encluir
Cláusula GROUP BY Não utilizada Frequentemente presente
Operações DML Permitidas Restritas ou parcialmente permitidas

Criação de Visões

A sintaxe básica para criar uma visão envolve a cláusula CREATE VIEW com uma subconsulta:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nome_visao
    [(apelido_coluna1 [, apelido_coluna2]...)]
    AS subconsulta
[WITH CHECK OPTION [CONSTRAINT nome_restricao]]
[WITH READ ONLY [CONSTRAINT nome_restricao]];

Exemplo prático: criar uma visão para filtrar funcionários de um departamento específico.

CREATE VIEW func_dept_a
AS 
SELECT id_func, nome_func, salario
FROM tabela_funcionarios
WHERE cod_dept = 10;

Para visualizar a estrutura da visão:

DESCRIBE func_dept_a;

Ao definir apelidos nas colunas da subconsulta, eles devem ser usados nas consultas posteriores:

CREATE VIEW func_sal_anual
AS
SELECT id_func ID, nome_func NOME, salario * 12 SALARIO_ANUAL
FROM tabela_funcionarios
WHERE cod_dept = 10;

Consultando a visão:

SELECT * FROM func_sal_anual;

Os resultados refletem os apelidos definidos, e o servidor Oracle resolve a consulta na tabela base subjacente.

Modificação de Visões

Utilize CREATE OR REPLACE VIEW para alterar uma visão existente, garantindo que os apelidos nas colunas correspondam à subconsulta:

CREATE OR REPLACE VIEW func_dept_a
  (id, nome, sal, dept_cod)
AS 
SELECT id_func, nome_func, salario, cod_dept
FROM tabela_funcionarios
WHERE cod_dept = 10;

Após a modificação, a consulta exibirá as novas colunas definidas:

SELECT * FROM func_dept_a;

Visões Complexas

Visões que envolvem múltiplas tabelas ou agregações são consideradas complexas. Exemplo com funções de grupo:

CREATE VIEW resumo_dept
  (nome_dept, sal_minimo, sal_maximo, sal_medio)
AS 
SELECT d.nome_dept, MIN(f.salario), MAX(f.salario), AVG(f.salario)
FROM tabela_funcionarios f, tabela_departamentos d
WHERE f.cod_dept = d.cod_dept 
GROUP BY d.nome_dept;

Consultando o resumo:

SELECT * FROM resumo_dept;

Operações DML em Visões

Regras para operações de inserção: não são permitidas quando a visão contém funções agregadas, GROUP BY, DISTINCT, ROWNUM, expressões nas colunas ou se colunas NOT NULL da tabela base não estão incluídas.

Para atualizações: restrições semelhantes, exceto para colunas NOT NULL.

Uso do WITH CHECK OPTION

Esta cláusula garante que alterações DML respeitem a condição da visão. Qualquer operação que viole a restrição será rejeitada:

CREATE OR REPLACE VIEW func_dept_b
AS 
SELECT *
FROM tabela_funcionarios
WHERE cod_dept = 20
WITH CHECK OPTION CONSTRAINT ck_dept_b;

Proteção contra DML com WITH READ ONLY

Para bloquear totalmente operações DML, utilize WITH READ ONLY. Qualquer tentativa de modificação gerará um erro:

CREATE OR REPLACE VIEW func_dept_c
  (num_func, nome_cargo)
AS 
SELECT id_func, cargo
FROM tabela_funcionarios
WHERE cod_dept = 30
WITH READ ONLY;

Remoção de Visões

A exclusão de uma visão remove apenas sua definição; os dados na tabela base permanecem intactos:

DROP VIEW func_dept_a;

Visões Temporárias

Subconsultas na cláusula FROM atuam como visões temporárias, não persistindo como objetos do banco de dados. Elas são úteis para consultas ad-hoc.

Análise Top-N

A análise Top-N identifica os N maiores ou menores valores em uma coluna. Utilize ROWNUM em conjunto com uma subconsulta ordenada:

SELECT [colunas], ROWNUM 
FROM (SELECT [colunas] 
      FROM tabela
      ORDER BY coluna_top_n DESC)
WHERE ROWNUM <= N;

Exemplo: encontrar os três maiores salários:

SELECT ROWNUM as POSICAO, nome_func, salario 
FROM (SELECT nome_func, salario 
      FROM tabela_funcionarios
      ORDER BY salario DESC)
WHERE ROWNUM <= 3;

Os resultados mostram a posição, nome e salário dos funcionários mais bem remunerados.

Tags: Oracle SQL Visões banco de dados Top-N

Publicado em 7-16 03:27