DO BÁSICO AO AVANÇADO PARA MANIPULAÇÃO E OTIMIZAÇÃO DE DADOS Fábio Roberto Octaviano
Criação de Outros Objetos
Após o término do Capítulo: Criar visões simples e complexas. Recuperar dados de visões. Criar, manter e utilizar sequences. Criar e manter índices. Criar sinônimos privados e públicos.
Objeto Tabela Visão Sequence Índice Sinônimo Descrição Unidade básica de armazenamento; composta por linhas. Representa logicamente conjuntos de dados de uma ou mais tabelas. Gera valores numéricos Melhora a performance de consultas. Dá nomes alternativos a objetos.
Tabela EMPLOYEES
Restringir acesso a dados Tornar consultas complexas mais fáceis Prover independência de dados Apresentar visões diferentes dos mesmos dados
Característica Visões Simples Visões Complexas Número de tabelas Uma Uma ou mais Contém funções Não Sim Contém agrupamento de dados Operações DML por meio da visão Não Sim Sim Nem sempre
Sintaxe de criação de Views: CREATE [OR REPLACE] [FORCE NOFORCE] VIEW view [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY [CONSTRAINT constraint]]; A subconsulta utilizada para a criação da view pode conter instrução SELECT complexa.
Crie a view EMPVU80, a qual contém detalhes dos empregados do departamento 80: CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80; View created. Descreva a estrutura de uma view por meio do comando DESCRIBE do isql*plus: DESCRIBE empvu80
Crie uma view utilizando aliases de colunas na subquery: CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50; View created. Selecione as colunas desta view pelos aliases dados.
Uma alternativa de criação para: CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50; poderia ser: CREATE VIEW salvu50 (ID_NUMBER, NAME, ANN_SALARY) AS SELECT employee_id, last_name, salary*12 FROM employees WHERE department_id = 50;
SELECT * FROM salvu50;
Modifique a view EMPVU80 utilizando uma cláusula CREATE OR REPLACE VIEW. Adicione um alias para cada nome de coluna: CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id) AS SELECT employee_id, first_name ' ' last_name, salary, department_id FROM employees WHERE department_id = 80; View created.
Crie uma visão complexa que contenha funções de agrupamento para exibir valores de 2 tabelas: CREATE OR REPLACE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary) FROM employees e JOIN departments d ON (e.department_id = d.department_id) GROUP BY d.department_name; View created.
Geralmente é permitido realizar operações DML em visões simples. Não é possível remover uma linha se uma view contém: Funções de Agrupamento. Uma cláusula GROUP BY. A palavra-chave DISTINCT. A palavra chave ROWNUM (pseudo-coluna).
Não é possível modificar dados em uma view se ela contém: Funções de Agrupamento. Uma cláusula GROUP BY. A palavra-chave DISTINCT. A palavra chave ROWNUM (pseudo-coluna). Colunas definidas por expressões.
Não é possível inserir dados em uma view se ela contém: Funções de Agrupamento. Uma cláusula GROUP BY. A palavra-chave DISTINCT. A palavra chave ROWNUM (pseudo-coluna). Colunas definidas por expressões. Colunas NOT NULL nas tabelas bases que não são selecionadas pela view.
Você pode assegurar que operações DML realizadas sobre a view fiquem no domínio da view utilizando a cláusula WITH CHECK OPTION: CREATE OR REPLACE VIEW empvu20 AS SELECT * FROM employees WHERE department_id = 20 WITH CHECK OPTION CONSTRAINT empvu20_ck ; View created. Qualquer tentativa de alterar o número do departamento para qualquer linha falhará porque violará a constraint WITH CHECK OPTION.
Você pode assegurar que operações DML não serão realizadas sobre a view utilizando a cláusula WITH READ ONLY: CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT employee_id, last_name, job_id FROM employees WHERE department_id = 10 WITH READ ONLY ; View created. Qualquer tentativa de executar uma operação DML em qualquer linha da view resultará em um erro no servidor ORACLE.
Você pode remover uma view sem perder dados nas tabelas base que compõem a visão. Sintaxe: DROP VIEW view; Exemplo: DROP VIEW empvu80; View dropped.
Objetivos: Criação de uma visão simples. Criação de uma visão complexa. Criação de uma visão com WITH CHECK OPTION. Tentativa de modificar dados em uma visão. Remoção de visões.
1. O RH deseja esconder alguns dados da tabela EMPLOYEES. Querem uma visão chamada EMPLOYEES_VU que possua os números dos empregados, seus sobrenomes e os números dos departamentos que trabalham. A coluna referente ao sobrenome deve chamar EMPLOYEE. Confirme que a view funcione, mostrando seu conteúdo. CREATE OR REPLACE VIEW employees_vu AS SELECT employee_id, last_name employee, department_id FROM employees; SELECT * FROM employees_vu;
2. Utilizando a visão EMPLOYEES_VU, escreva uma consulta para listar todos os sobrenomes e departamentos. SELECT employee, department_id FROM employees_vu;
3. O departamento 50 precisa de acesso aos dados de seus empregados. Crie uma visão DEPT50 que contenha os números dos empregados, seus sobrenomes e departamentos para todos os empregados do departamento 50. As colunas devem se chamar EMPNO, EMPLOYEE e DEPTNO, respectivamente. Para segurança, não permita que nenhum empregado seja realocado a outro departamento por meio da view criada. Chame a constraint criada de emp_dept_50.
3. Solução: CREATE VIEW dept50 AS SELECT employee_id empno, last_name employee, department_id deptno FROM employees WHERE department_id = 50 WITH CHECK OPTION CONSTRAINT emp_dept_50;
4. Exiba a estrutura da visão DEPT50, e depois todos os seus registros. DESCRIBE dept50 SELECT * FROM dept50; 5. Tente realocar Matos para o departamento 80. Verifique se a operação é ou não bem sucedida. UPDATE dept50 SET deptno = 80 WHERE employee = 'Matos';
Uma sequence: Pode automaticamente gerar números únicos. É um objeto compartilhável. Pode ser utilizado para criar valores em chaves primárias. Substitui código de aplicação. Aumenta a eficiência acesso a valores seqüenciais quando alocados na memória (cache). 1 2 4 3 5 6 8 7 9
Sintaxe: CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n NOMAXVALUE}] [{MINVALUE n NOMINVALUE}] [{CYCLE NOCYCLE}] [{CACHE n NOCACHE}]; Permite especificar valores de incremento, início, máximo e mínimo, se é cíclica e quantos valores são pré-alocados e armazenados em cache pelo Oracle (default=20).
Existem duas pseudo-colunas para utilização em uma sequence: NEXTVAL: retorna o próximo valor seqüencial disponível. Retorna um valor único toda vez que é referenciada, não importa por qual usuário. CURRVAL: obtém o valor atual da sequence. NEXTVAL precisa ser executado para a sequence antes de CURRVAL conter um valor.
Insira uma novo departamento chamado Support no location ID 2500: INSERT INTO departments(department_id, department_name, location_id) VALUES (dept_deptid_seq.nextval, 'Support', 2500); 1 row created. Verifique o valor atual da sequence DEPT_DEPTID_SEQ: SELECT FROM dept_deptid_seq.currval dual;
Armazenando valores de uma sequence na memória faz com que obtanhamos acesso mais rápido a esses valores. Vazios (gaps) em valores de sequence ocorrem quando: Um rollback ocorre. O sistema falha (crash). Uma sequence é utilizada em outra tabela.
É possível alterar o valor de incremento, valor máximo, valor mínimo, opções de ciclo ou cache. ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE; Sequence altered.
Guias de uso para modificar uma sequence: Você deve ser o dono ou ter privilégio de ALTER para a sequence. Apenas números futuros de uma sequence são afetados. A sequence deve ser eliminada e re-criada para reiniciar a sequence com um valor diferente. Alguma validação é executada (ex: máximo) Para remover uma sequence use o DROP: DROP SEQUENCE dept_deptid_seq; Sequence dropped.
Um índice: É um objeto de esquema (tem dono). Pode ser usado pelo Oracle para acelerar a busca por registros utilizando ponteiros. Pode reduzir I/O utilizando acesso de caminho rápido para localizar dados rapidamente. É independente da tabela que ele indexa (pode ser criado e removido sem afetar a tabela). É utilizado e mantido automaticamente pelo servidor Oracle.
Automaticamente: Um UNIQUE INDEX é criado automaticamente quando você define uma PRIMARY KEY ou UNIQUE constraint em uma tabela. Manualmente:Usuários podem criar índices nonunique em colunas para acelerar a busca.
Crie um índice para uma ou mais colunas: CREATE INDEX index ON table (column[, column]...); Aumente a velocidade de busca para a coluna LAST_NAME da tabela EMPLOYEES: CREATE INDEX emp_last_name_idx ON employees(last_name); Index created.
Crie um índice quando: Uma coluna contiver um range amplo de valores. Uma coluna contiver um grande número de valores NULL. Uma ou mais colunas são frequentemente usadas juntas na cláusula WHERE ou condição de JOIN. Uma tabela é grande e a maioria das consultas esperam receber menos de 10% das linhas da tabela. Não crie índices quando: As colunas não são frequentemente usadas no WHERE. A tabela é pequena ou a maioria das consultas esperam receber mais de 10% das linhas da tabela A tabela sofre updates frequentemente. As colunas indexadas são referenciadas como parte de expressões.
Índices com base em Funções: A expressão utilizada pode ser composta por colunas da tabelas, constantes, funções SQL e UDF. CREATE INDEX upper_dept_name_idx ON dept2(upper(department_name)); Index created. SELECT * FROM dept2 WHERE UPPER(department_name) = 'SALES';
Remova índices do dicionário de dados com DROP: DROP INDEX index; Exemplo: DROP INDEX emp_last_name_idx; Index dropped. Para remover um índice, você deve ser o dono do índice ou ter o privilégio DROP ANY INDEX.
Simplifica o acesso a objetos, dando outro nome a um objeto. Com sinônimos, é possível: Criar uma referência fácil a uma tabela cujo dono seja outro usuário. Conseguir nomes mais curtos a objetos. Sintaxe: CREATE [PUBLIC] SYNONYM synonym FOR object;
Crie um nome mais curto para a visão DEPT_SUM_VU: CREATE SYNONYM d_sum FOR dept_sum_vu; Synonym Created. Elimine um sinônimo com DROP: DROP SYNONYM d_sum; Synonym dropped.
Objetivos: Criação de sequences. Uso de sequences. Criação de índices. Criação de sinônimos.
6. Crie uma sequence que será usada como PK da tabela DEPT. A sequence deve começar com o valor 200 e ter um valor máximo 1000. O incremento a cada valor deve ser 10. Chame a sequence DEPT_ID_SEQ. CREATE SEQUENCE dept_id_seq START WITH 200 INCREMENT BY 10 MAXVALUE 1000;
7. Escreva um script que insira linhas na tabela DEPT. Cretifique-se de usar a sequence criada no exercício anterior para o ID. Adicione 2 departamentos: Education e Administration. Confirme as inserções. INSERT INTO dept VALUES (dept_id_seq.nextval, 'Education'); INSERT INTO dept VALUES (dept_id_seq.nextval, 'Administration');
8. Crie um índice nonunique na coluna NAME da tabela DEPT. CREATE INDEX dept_name_idx ON dept (name);
9. Crie um sinônimo para sua tabela EMPLOYEES. Chame o sinônimo de EMP. CREATE SYNONYM emp FOR EMPLOYEES;