You are on page 1of 20

RESUMO ORACLE PARTE II BANCO DE DADOS II

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.

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


INSERT MULTITABELAS Ex 1) INSERT INCONDICIONAL Criao das tabelas com base na tabela EMPLOYEES: CREATE TABLE sal_history (empid, hiredate, sal) AS SELECT employee_id, hire_date, salary FROM employees; CREATE TABLE mgr_history (empid, mgr, sal) AS SELECT employee_id, manager_id, salary FROM employees; TRUNCATE TABLE mgr_history; TRUNCATE TABLE sal_history; O TRUNCATE elimina o contedo da tabela. INSERT ALL INTO sal_history VALUES (empid, hiredate, sal) INTO mgr_history VALUES (empid, mgr, sal) SELECT employee_id empid, hire_date hiredate, salary sal, manager_id mgr FROM employees WHERE employee_id > 200; O exemplo acima seleciona os valores de employee_id, hire_date, salary e manager_id da tabela EMPLOYEES para os funcionrios cujo employee_id maior que 200 e insere estes valores nas tabelas SAL_HISTORY e MGR_HISTORY. Ex 2) INSERT CONDICIONAL INSERT ALL WHEN sal > 10000 THEN INTO sal_history VALUES (empid, hiredate, sal) WHEN mgr > 200 THEN INTO mgr_history VALUES (empid, mgr, sal) SELECT employee_id empid, hire_date hiredate, salary sal, manager_id mgr FROM employees WHERE employee_id > 200; O exemplo acima seleciona os valores de employee_id, hire_date, salary e manager_id da tabela employees para os funcionrios cujo employee_id maior que 200. Se o salrio for superior a 10.000, insere na tabela SAL_HISTORY usando uma instruo INSERT multitabelas condicional. Se MANAGER_ID for maior que 200, insere estes valores na tabela MGR_HISTORY usando um INSERT multitabelas condicional.

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 3) Criao das tabelas com base na tabela employees: CREATE TABLE sal_history (empid, admissao, sal) AS SELECT employee_id, hire_date, salary FROM employees; CREATE TABLE mgr_history (empid, ger, sal) AS SELECT employee_id, manager_id, salary FROM employees; CREATE TABLE special_sal (empid,sal) AS SELECT employee_id, salary FROM employees; TRUNCATE TABLE sal_history; TRUNCATE TABLE mgr_history; TRUNCATE TABLE special_sal; INSERT ALL WHEN sal > 20000 THEN INTO special_sal VALUES (empid, sal) ELSE INTO sal_history VALUES (empid, hiredate, sal) INTO mgr_history VALUES (empid, mgr, sal) SELECT employee_id empid, hire_date hiredate, salary sal, manager_id mgr FROM employees WHERE employee_id < 125; No exemplo acima, se o salrio for maior que 20000, ir inserir os detalhes do ID e do salrio do funcionrio na tabela SPECIAL_SAL. Caso contrrio, insere os detalhes de ID de funcionrio, data de admisso e salrio na tabela SAL_HISTORY e detalhes de ID de funcionrio, ID do gerente e salrio na tabela MGR_HISTORY. Tambm recupera os detalhes do id, data de admisso, salrio e do ID do gerente dos funcionrios cujo id seja menor que 125 na tabela EMPLOYEES; Ex 4) FIRST INSERT CONDICIONAL INSERT first WHEN empid > 150 then INTO sal_especial values (empid, sal) WHEN admissao like ('%00') then INTO historico_2000 values (empid, admissao) ELSE INTO historico values (empid, admissao) SELECT employee_id empid, salary sal, hire_date admissao FROM employees; O exemplo acima seleciona o id do empregado, o salrio e a data de admisso da tabela employees. Se o id for maior que 150 ir inserir na tabela sal_especial usando o INSERT FIRST. Insere os registros dos empregados que foram admitidos em 2000 na tabela historico_2000, caso contrrio insere na tabela historico.

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


Obs.: Se a primeira clusula WHEN for avaliada como verdadeira, as clusulas WHEN subsequentes para essa linha sero ignoradas. Ex 5) INSERT DE CRIAO DE PIVS uma operao na qual podemos precisar criar uma transformao de maneira que cada registro de um fluxo de entrada, como uma tabela de banco de dados no relacional, seja convertido em vrios registros para um ambiente de tabela de banco de dados mais relacional. Criao da tabela: CREATE TABLE vendas_data (employee_id number (6), semana number (2), segunda number (10,2), terca number (10,2), quarta number (10,2), quinta number (10,2), sexta number (10,2)); Insert: INSERT ALL INTO vendas values (employee_id, semana, segunda) INTO vendas values (employee_id, semana, terca) INTO vendas values (employee_id, semana, quarta) INTO vendas values (employee_id, semana, quinta) INTO vendas values (employee_id, semana, sexta) SELECT employee_id, semana, segunda, terca, quarta, quinta, sexta FROM vendas_data; Cria uma transformao de maneira que cada registro de fluxo de entrada no relacional seja convertido em vrios registros pra um ambiente de tabela de banco de dados no formato relacional. Usando a criao de pivs, armazena na tabela o contedo da tabela vendas_data.

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


VIEWS (VISES) Ex 1) CREATE VIEW emp50 AS SELECT employee_id, first_name, salary FROM employees WHERE department_id=50; O exemplo acima cria uma view chamada emp50 que contendo as colunas employee_id, first_name e salary somente dos empregados do departamento 50. Ex 2) DESC user_views; O exemplo acima consulta no dicionrio de dados as views existentes neste usurio logado. Ex 3) Apagar uma view: DROP VIEW emp50; Ex 4) SELECT text FROM user_views WHERE view_name = 'EMP_DETAILS_VIEW'; O exemplo acima consulta o texto da view emp_details_view. Ex 5) CREATE OR REPLACE VIEW emp_clerk (nome, cargo, depto) AS SELECT e.first_name, e.job_id, d.department_name FROM employees e, departments d WHERE e.department_id = d.department_id AND e.job_id = 'ST_CLERK'; O exemplo acima cria ou atualiza (caso j exista) a view chamada EMP_CLERK com as colunas nome, cargo e nome do departamento de todos os empregados com cargo igual a JOB_ID. Coloca tambm os seguintes apelidos respectivamente: nome, cargo e depto. Tabela lgica que exibe colunas e acrescenta condies para exibio dos dados.

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 6) VIEW COMPLEXA Contm funes, grupos de dados e nem sempre faz uma operao DML. Pode ser de uma ou mais tabelas. CREATE VIEW soma_depto (depto, maior, menor, media) AS SELECT d.department_name, MAX(e.salary), MIN(e.salary), AVG(e.salary) FROM departments d, employees e WHERE d.department_id = e.department_id GROUP BY department_name; O exemplo acima cria uma view chamada soma_depto com as colunas nome do departamento, maior, menor e mdia salarial, agrupadas por nome de departamento (tabelas sintticas). Ex 7) Cria uma view chamada vw_dept que tenha as colunas id e nome do departamento com os seguintes apelidos (id e nome) usando a tabela DEPARTMENTS. Permite a atualizao da view: CREATE OR REPLACE VIEW vw_dept (id, nome) AS SELECT department_id, department_name FROM departments; Insere dados na view: INSERT INTO vw_dept VALUES (1, 'CPD'); Obs.: Para inserir dados utilizando a VIEW necessrio: Todos os dados NOT NULL devem fazer parte da VIEW; No pode ser VIEW complexa (funes de grupo ou de linha); No pode ter JOIN, somente uma tabela.

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;

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 9) VIEW DE LINHA Exibe o nome, o salrio, o departamento e o maior salrio por departamento somente dos funcionrios que recebem menos que a mdia do seu departamento: SELECT a.first_name, a.salary, b.maior FROM employees a, (SELECT department_id, MAX(salary) maior FROM employees GROUP BY department_id) b WHERE a.department_id = b.department_id AND a.salary < b.maior; Ex 10) ANLISE TOP-N ROWNUM - coluna existente em todas as tabelas. Exibe os 10 maiores salrios da empresa: SELECT ROWNUM "Rank", first_name, salary FROM (SELECT first_name, salary FROM employees ORDER BY salary DESC) WHERE ROWNUM <=10; Ex 11) Criao de uma viso chamada SALARIO_VU com base no nome, salrio do funcionrio, nome do departamento e classe de salrio de todos os funcionrios: CREATE OR REPLACE VIEW salario_vu AS SELECT e.last_name, d.department_name, e.salary, DECODE(j.min_salary, 2000, 'A', 2500, 'B', 3000, 'C', 3500, 'D', 4000, 'E', 4500, 'F', 5000, 'G', 5500, 'H', 6000, 'I')Grade FROM employees e, departments d, jobs j WHERE e.department_id=d.department_id AND e.salary BETWEEN j.min_salary AND j.max_salary AND e.job_id = j.job_id;

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


SEQUNCIAS (SEQUENCES) Objeto usado para gerar nmeros exclusivos de chave primria. No est vinculado a nenhuma tabela. Nome da sequncia que no pode ser o mesmo de uma tabela ou view.

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;

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 6) Exibir o valor corrente da sequncia: SELECT seqdept.CURRVAL FROM dual; Ex 7) Altera a sequencia SEQDEPT para que o incremento seja de 5 em 5 com valor minimo de 120 e no aceite o ciclo e no aloque numero na memoria cache. ALTER SEQUENCE seqdept INCREMENT BY 5 MINVALUE 120 NOCYCLE NOCACHE; MINVALUE - Clausula que informa o menor valor da sequencia CYCLE|NOCYCLE - ao atingir o maior valor ele retorna para o valor inicial da sequncia. CACHE numero|NOCACHE - aloca nmeros da sequncia na memria Por default: NOCYCLE e CACHE= 20. No podemos alterar de uma sequncia o START WITH. Ex 8) Consultar no dicionrio de dados: SELECT * FROM user_sequences WHERE sequence_name = 'SEQDEPT'; Ex 9) Apagar a sequencia SEQDEPT: DROP SEQUENCE seqdept; SINNIMOS So apelidos de objetos. Ex 1) Criao de sinnimo: CREATE SYNONYM empregado FOR employees; OBS.: Tanto faz agora, utilizar o nome EMPLOYEES ou o nome EMPREGADO: SELECT * FROM empregado WHERE department_id = 20; Ex 2) Consultar os sinnimos no banco de dados: SELECT object_name FROM user_objects WHERE object_type = 'SYNONYM';

Thas Paiva Alonso

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 3) Apagar o sinnimo: DROP SYNONYM empregado; NDICES Um ndice um objeto de um esquema que pode acelerar a recuperao de linhas usando um ponteiro. Usados para armazenar os dados em uma ordem pr-estabelecida.

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.

CREATE BITMAP INDEX idx_dept ON departments (department_name);

Thas Paiva Alonso

10

RESUMO ORACLE PARTE II BANCO DE DADOS II


USURIOS E PRIVILGIOS Ex 1) Criar um usurio chamado BD2 e a senha tambm BD2: CREATE USER bd2 IDENTIFIED BY bd2; Ex 2) Exibir o nome dos usurios existentes no banco de dados: SELECT username FROM all_users; Ex 3) Para visualizar os privilgios de sistema: SELECT * FROM USER_SYS_PRIVS; Ex 4) Alterar o usurio bd2 para que tenha espao ilimitado de armazenamento das tablespaces SYSTEM: ALTER USER bd2 DEFAULT TABLESPACE users QUOTA UNLIMITED ON users QUOTA UNLIMITED ON system; Ex 5) PRIVILGIOS: H dois tipos: OBJETO e SISTEMA. SISTEMA: CREATE SESSION, CREATE TABLE, CREATE SYNONYM, CREATE PROCEDURE, CREATE SEQUENCE, CREATE VIEW. OBJETO: SELECT, INSERT, UPDATE, DELETE E EXECUTE (usado em PROCEDURES). Conceder privilgio de conexo com banco de dados: GRANT create session TO bd2; Ex 6) Alterar o usurio bd2 para que a senha seja alterada na prxima conexo. ALTER USER bd2 PASSWORD EXPIRE; Ex 7) Criao de usurio com quota de 10M para a tablespace USERS e quota de 5M para a tablespace. Solicita troca de senha na primeira conexo. CREATE USER usuario IDENTIFIED BY usu DEFAULT tablespace users QUOTA 10M on users QUOTA 5M on system PASSWORD EXPIRE;

Thas Paiva Alonso

11

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 8) Concede privilgio de conexo e criao de tabelas: GRANT create session, create table TO usuario; Ex 9) Para exibir o usurio que est conectado: SHOW USER Ex 10) Concedendo privilgios de objeto: GRANT select, insert on cursos TO usuario; Ex 11) ROLES um grupo de privilgios (sistema ou objeto), reunidos sob um nico nome, que pode ser concedido a um ou mais usurios. uma atribuio um grupo de usurios que facilita para conceder privilgios.

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;

Thas Paiva Alonso

12

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 14) Conceder privilgios para todos os usurios do banco de dados de selecionar os dados da tabela JOBS: GRANT select on jobs TO PUBLIC; Ex 15) Para visualizar roles: SELECT * FROM user_role_privs; Ex 16) Exibir os privilgios do usurio bd2: SELECT grantor, table_name, privilege FROM user_tab_privs_made WHERE grantee='bd2'; GRANTEE: recebeu os privilgios. GRANTOR: concedeu privilgios. Ex 17) REVOKE: utilizado para revogar privilgios concedidos ao usurio ou atribuio atravs do comando GRANT. - Revogar o privilgio de CREATE SYNONYM para o usurio: Passo 1) CONECTAR COMO SYSTEM CONNECT system/oracle123 Passo 2) Tirar o privilegio REVOKE create synonym FROM aula; Ex 18) Apagar o usurio bd2: DROP USER bd2 CASCADE;

Thas Paiva Alonso

13

RESUMO ORACLE PARTE II BANCO DE DADOS II


OPERADORES SET So UNION, UNION ALL, INTERSECT e MINUS Ex 1) UNION Retorna todas as linhas selecionadas por uma das consultas.

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;

Thas Paiva Alonso

14

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 5) MINUS Obtm linhas retornadas pela 1 consulta que ausente na 2 consulta.

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;

Thas Paiva Alonso

15

RESUMO ORACLE PARTE II BANCO DE DADOS II


FUNES DE DATA/HORA Ex 1) Consulta no dicionrio de dados: DESC v$TIMEZONE_NAMES Ex 2) SELECT * FROM v$TIMEZONE_NAMES; Ex 3) Exibe a data e hora atual do fuso horrio: SELECT CURRENT_TIMESTAMP FROM DUAL; Ex 4) Retorna a data e o horrio atual da sesso: SELECT LOCALTIMESTAMP FROM DUAL; Ex 5) Retorna o valor do fuso horrio da sesso: SELECT SESSIONTIMEZONE FROM DUAL; Ex 6) EXTRACT Extrai e retorna o valor de um campo de data/hora. SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; Ex 7) SELECT EXTRACT(YEAR FROM hire_date) FROM employees where department_id = 80; Ex 8) Alterar o formato da data na sesso: ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'); Ex 9) Retorna o valor do fuso horrio do banco de dados: SELECT DBTIMEZONE FROM DUAL; Ex 10) CONVERSO DE TIMESTAMP USANDO FROM_TZ Esta funo converte um valor TIMESTAMP em um valor TIMESTAMP WITH TIME ZONE.

SELECT FROM_TZ(TIMESTAMP '2003-03-28' 08:00:00,'Australia/North') FROM DUAL;

Thas Paiva Alonso

16

RESUMO ORACLE PARTE II BANCO DE DADOS II


GROUP BY AVANADO Possui 4 clusulas: ROLLUP, CUBE, GROUPING SETS, GROUPING. ROLLUP: Resultado com linhas agrupadas e subtotais. CUBE: conj. de resultados que contem o ROLLUP em uma tabulao cruzada (todas as combinaes possveis). GROUPING: Usado com CUBE ou ROLLUP. Localiza o grupo que contem um subtotal de registros. Diferencia nulos calculados(0) dos nulos armazenados(1). um flag: GROUPING SETS: define os agrupamentos da mesma coluna. Calcula todos os agrupamentos e combina os resultados: Vantagens: Analise da tabela-base; No necessita de UNION's desempenho. Ex 1) SELECT department_id, job_id, SUM(salary) "Salario" FROM employees WHERE department_id < 60 GROUP BY ROLLUP (department_id, job_id) ORDER BY 1, 2; OBS.: O ROLLUP criou um subtotal por departamento e no final da consulta, criou um total geral. Ex 2) Exibe a media salarial por gerente (manager_id) e por cargo dos gerentes maiores que 101: SELECT manager_id, AVG(salary) "Salario" FROM employees WHERE manager_id > 101 GROUP BY ROLLUP (manager_id) ORDER BY 1; Ex 3) SELECT department_id, job_id, SUM(salary) salario FROM employees WHERE department_id < 60 GROUP BY CUBE (department_id, job_id) ORDER BY 1, 2; OBS.: O CUBE funciona como um cubo, acima, fez a somatria de departamento com cargo, subtotal por depto e subtotal por cargo. Ex 4) Exibe o flag informando a linha que contem um valor agregado:

complexas

quanto

mais

elementos,

melhor

Thas Paiva Alonso

17

RESUMO ORACLE PARTE II BANCO DE DADOS II


SELECT department_id, job_id, SUM(salary) salario, GROUPING(department_id), GROUPING(job_id) FROM employees WHERE department_id < 60 GROUP BY ROLLUP (department_id, job_id) ORDER BY 1, 2; OBS.: 0 sempre indica um valor calculado sobre um valor armazenado. 1 sempre vai indicar um valor calculado pelo ROLLUP ou CUBE. Ex 5) SELECT department_id, job_id, manager_id, AVG(salary) "Media" FROM employees GROUP BY GROUPING SETS ((department_id, job_id, manager_id), (department_id, manager_id), (job_id, manager_id)); RECUPERAO HIERRQUICA Exibe registros baseados em uma hierarquia natural, um relatrio com ramificaes em arvore.

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;

Thas Paiva Alonso

18

RESUMO ORACLE PARTE II BANCO DE DADOS II


Ex 4) Compactar ramificaes: Produz um organograma da empresa que exiba a hierarquia de gerenciamento. Comea com a pessoa no nvel mais alto, exclui todas as pessoas com um ID de cargo IT_PROG e exclui De Haan e os funcionrios subordinados a ele: SELECT last_name, employee_id, manager_id FROM employees WHERE job_id != 'IT_PROG' START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id AND last_name != 'De Hann'; OBJETO RELACIONAL TEMOS: Tipo objeto, Tipo herana, Tipo array e Tabelas Aninhadas OBJETOS: tipo de dados adicionais para simplificar dados complexos. Ex 1) Criar um tipo pessoal com cdigo, nome, endereo: CREATE TYPE pessoa AS OBJECT (cdpessoa NUMBER(5), nmpessoa VARCHAR(50), nmendereco VARCHAR(100)) NOT FINAL; / Ex 2) HERANA: podemos herdar um objeto (superclasse) e este que recebeu a herana ser uma subclasse (deriva do objeto principal). Cria o objeto FISICA com as colunas cpf e sexo. Herdar as caracteristicas do objeto PESSOA: CREATE TYPE fisica UNDER pessoa (cdcpf CHAR(11), icsexo CHAR(1)); / Ex 3) TABELAS ANINHADAS Tabelas com colunas formadas por tipos de dados compostos (domnio de outra tabela). Cria um tipo T_END que tenha: logradouro VARCHAR(50), numero INTEGER, bairro VARCHA(30), cidade VARCHAR(50), uf CHAR(1), cep CHAR(9): CREATE OR REPLACE TYPE t_end AS OBJECT (logradouro VARCHAR(50),

Thas Paiva Alonso

19

RESUMO ORACLE PARTE II BANCO DE DADOS II


numero INTEGER, bairro VARCHAR(50), cidade VARCHAR(50), uf CHAR(2), cep CHAR(9)); / Ex 4) TIPO ARRAY - tipo VETOR no banco de dados. Quando uma coluna pode conter mais de um valor. Define um tipo array chamado tel que armazene ate 5 telefones com tamanho de 10 caracteres: CREATE TYPE tel AS VARRAY(5) OF VARCHAR(10); / Criar tabelas com os tipos criados acima: CREATE TABLE cliente_lojas (cpf CHAR(11), nome VARCHAR(50), tel_cliente tel, end_cliente lista_end) NESTED TABLE end_cliente STORE AS end_cliente_tab; XML COM BANCO DE DADOS Ex 1) Acrescentando mais de uma coluna: SELECT XMLELEMENT("cliente", XMLELEMENT("id", customer_id), XMLELEMENT("nome", first_name||last_name)) XML FROM customers WHERE customer_id = 3; Ex 2) Obter os valores das colunas customer_id na tabela CUSTOMERS: SELECT XMLELEMENT("cliente", XMLELEMENT("id", customer_id), XMLELEMENT("nome", first_name||last_name)) XML FROM customers; Ex 3) Definindo atributos dentro dos elementos: SELECT XMLELEMENT("cliente", XMLATTRIBUTES(customer_id AS "id", first_name || ' ' || last_name AS "nome", TO_CHAR(dob, 'DD/MM/YYYY') AS "data")) XML FROM customers;

Thas Paiva Alonso

20

You might also like