Professional Documents
Culture Documents
MANIPULANDO DADOS MERGE Atualiza ou insere uma linha condicionalmente em uma tabela, evitando vrias instrues UPDATE. INSERT + UPDATE Se o registro existir atualiza (update), caso o contrrio insere dados (insert).
Vantagens: Evita a atualizao separada, aumenta o desempenho e muito til em aplicaes de Data Warehouse. Ex 1) Cria uma tabela com base na tabela EMPLOYEES: CREATE TABLE copia AS SELECT * FROM employees; Insere/atualiza a tabela COPIA para que corresponda EMPLOYEES: MERGE INTO copia c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name, c.last_name = e.last_name, c.email = e.email, c.phone_number = e.phone_number, c.hire_date = e.hire_date, c.job_id = e.job_id, c.salary = e.salary, c.commission_pct = e.commission_pct, c.manager_id = e.manager_id, c.department_id = e.department_id WHEN NOT MATCHED THEN INSERT VALUES (e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date,e.job_id,e.salary, e.commission_pct, e.manager_id, e.department_id); O exemplo acima ir atualizar ou inserir a tabela copia para que corresponda employees. Obs.: quando forem iguais, ir atualizar, quando no, ir inserir.
Ao consultar a tabela departments podemos ver que os valores inseridos na VIEW esto l. SELECT * FROM departments; Ex 8) Recria a view vw_dept para que seja somente leitura: CREATE OR REPLACE VIEW vw_dept (id, nome) AS SELECT department_id, department_name FROM departments WITH READ ONLY;
Ex 1) Consulta as sequences existentes no usurio: SELECT * FROM user_sequences; Ex 2) Criao de uma sequncia chamada SEQDEPT que inicia em 100, com incremento de 10 e com valor mximo de 1000: CREATE SEQUENCE SEQDEPT START WITH 100 INCREMENT BY 10 MAXVALUE 1000; Ex 3) Criao da tabela depto que utilizar a sequencia SEQDEPT: CREATE TABLE depto (id NUMBER(6) primary key, nome VARCHAR2(100)); Utilizando a sequencia criada SEQDEPT inserir registros na tabela depto: INSERT INTO depto VALUES(seqdept.NEXTVAL, '&nome_depto'); NEXTVAL - busca o prximo valor da sequncia. A varivel ser substituda pelo valor digitado. Ex 4) Consultar a view USER_SEQUENCES SELECT min_value, max_value, increment_by, last_number "Prox. valor" FROM user_sequences WHERE sequence_name = 'SEQDEPT'; OBS. A coluna last_number est buscando os valores que se encontram na memria cache. Por padro a sequncia aloca os 20 prximos valores a serem utilizados. Ex 5) Exibir as seguintes informaes sobre as sequncias: nome, valor mximo, tamanho do incremento e o ltimo nmero utilizado. SELECT sequence_name, max_value, increment_by, last_number FROM user_sequences;
Ex 1) NDICE ARVORE B Um ndice rvore B o convencional, pode ser composto em vrias colunas.
Criao de ndice: CREATE INDEX idx_depto ON departments(department_name); Ex 2) Pode ser composto com vrias colunas: CREATE INDEX idx_nome_completo ON employees(first_name,last_name); Ex 3) Consultar no dicionrio de dados: SELECT * FROM user_indexes; Ex 4) Remover um ndice: DROP INDEX idx_depto; Ex 5) Alterar um ndice: ALTER INDEX idx_depto RENAME TO idx_depto1; Ex 6) NDICE BITMAP usado em tabelas que contm um grande nmero de dados e cujo contedo no modificado com muita freqncia e que tenham poucos valores diferentes.
10
11
Criao de uma role (atribuio): CREATE ROLE turma; Ex 12) Uma vez criada, a role pode receber privilgios e ser concedida a vrios usurios: GRANT create sequence TO turma; Concesso da atribuio turma para o usurio bd2: GRANT turma TO bd2; Os privilgios so concedidos s roles, que podem ser usadas por vrios usurios, facilitando a concesso de privilgios. Ex 13) Conceder privilegio de selecionar e inserir na tabela DEPARTMENTS para o usurio bd2: GRANT select, insert ON departments TO bd2; Conectar para fazer o teste: connect bd2/bd SELECT * FROM hr.departments;
12
13
OBS: a quantidade e o tipo de colunas devem ser idnticos, porm o nome da coluna no precisa ser igual. Exibe os detalhes dos cargos anteriores e atual de todos os funcionrios. Exibe somente uma ocorrncia: SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history; Obs.: O Operador UNION elimina as ocorrncias duplicadas. Ex 2) UNION ALL Retorna todas as linhas, inclusive as duplicadas.
SELECT employee_id,job_id,department_id FROM employees UNION ALL SELECT employee_id,job_id,department_id FROM job_history; Ex 3) Exibe somente as colunas employee_id e job_id com UNION ALL com apelido na coluna job_id na tabela employees como ATUAL e na tabela job_history como ANTERIOR: SELECT employee_id"Atual",job_id FROM employees UNION ALL SELECT employee_id"Anterior",job_id FROM job_history; Ex 4) INTERSECT Retorna as linhas em comum entre as consultas:
Exibir o id do funcionrio e o id dos cargos dos funcionrios que ocupavam o mesmo cargo antes do incio na empresa: SELECT employee_id, job_id FROM employees INTERSECT SELECT employee_id, job_id from job_history;
14
SELECT employee_id, job_id FROM employees MINUS SELECT EMPLOYEE_ID, job_id FROM job_history; Ex 6) Exibe o ID e o nome dos pases nos quais no existem departamentos, usando o operador SET. (Tabela: COUNTRIES). SELECT country_id, country_name FROM countries MINUS SELECT l.country_id, c.country_name FROM locations l, countries c WHERE c.country_id = l.country_id; Ex 7) Cria uma lista de cargos dos departamentos 10, 50 e 20, nessa ordem. Exibe o ID de cargo e o ID de departamento, usando o operador SET UNION. SELECT job_id, department_id, 'x' "ORDEM" FROM employees WHERE department_id = 10 UNION SELECT job_id, department_id, 'y' "ORDEM" FROM employees WHERE department_id = 50 UNION SELECT job_id, department_id, 'z' "ORDEM" FROM employees WHERE department_id = 20 ORDER BY 3; Ex 8) Cria uma consulta composta que relacione o seguinte: Os sobrenomes e o ID do departamento de todos os funcionrios da tabela EMPLOYEES independente de pertencerem ou no a um departamento. ID de departamento e o nome de todos os departamentos da tabela DEPARTMENTS independente de terem ou no funcionrios. SELECT last_name, department_id, TO_CHAR(null) FROM employees UNION SELECT TO_CHAR(null), department_id, department_name FROM departments;
15
16
complexas
quanto
mais
elementos,
melhor
17
LEVEL - retorna 1, raiz, 2 filho e assim por diante START WITH - o inicio da hierarquia CONNECT BY - especifica coluna com relacionamento hierrquico Ex 1) Exibe uma lista de gerentes de forma hierrquica iniciando a matricula 101: SELECT employee_id, last_name, job_id, manager_id FROM employees START WITH employee_id = 101 CONNECT BY PRIOR manager_id = employee_id; Ex 2) Exibe a hierarquia da empresa, iniciando em King: SELECT last_name || ' e subordinado a ' || PRIOR last_name FROM employees START WITH last_name = 'King' CONNECT BY PRIOR employee_id = manager_id; Ex 3) Produz um relatrio exibindo um organograma do departamento de Mourgos. Exibe tambm os sobrenomes, salrios e os IDs de departamento. SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'-') nome, manager_id, department_id FROM employees START WITH last_name = 'Kochhar' CONNECT BY PRIOR manager_id = employee_id;
18
19
20