Você está na página 1de 87

SQL

APOSTILA DE SQL
Para Aulas de Laboratrio

Prof. Alan F Sousa

NDICE
INTRODUO AO SQL, SQL*PLUS E PL/SQL (ORACLE) ..............................................................................4 COMANDOS SQL ........................................................................................................................................................4 SQL*PLUS ................................................................................................................................................................6 EXEMPLO DE UM BLOCO PL/SQL ...............................................................................................................................7 COMANDO SELECT .................................................................................................................................................8 COMO SELECIONAR LINHAS DE UMA NICA TABELA..................................................................................................8 COMO ORDENAR E LIMITAR AS LINHAS SELECIONADAS ...........................................................................................10 FUNES APLICADAS A LINHAS ...............................................................................................................................14 COMO SELECIONAR DADOS DE MAIS DE UMA TABELA ...............................................................................................18 FUNES DE GRUPO .................................................................................................................................................21 A CLUSULA GROUP BY ...........................................................................................................................................23 A CLUSULA HAVING ...............................................................................................................................................24 A RECUPERAO DE DADOS COM SUBCONSULTAS (SUBQUERIES) ............................................................................26 A RECUPERAO DE DADOS COM SUBCONSULTAS CORRELACIONADAS ....................................................................28 SCRIPTS REUTILIZVEIS ...................................................................................................................................33 CRIAO DE TABELAS ........................................................................................................................................35 DICIONRIO DE DADOS.......................................................................................................................................40 COMANDOS DE MANIPULAO DE DADOS..............................................................................................43 O COMANDO INSERT..............................................................................................................................................43 O COMANDO UPDATE ...........................................................................................................................................45 O COMANDO DELETE............................................................................................................................................46 CONTROLE DE TRANSAES..........................................................................................................................48 ALTERANDO TABELAS E CONSTRAINTS ....................................................................................................51 SEQNCIAS ...........................................................................................................................................................56 VISES ......................................................................................................................................................................59 NDICES ....................................................................................................................................................................64 CONTROLANDO O ACESSO DOS USURIOS AO BANCO DE DADOS ......................................................69 TIPOS DE PRIVILGIOS ..............................................................................................................................................69 GERENCIANDO ROLES ..............................................................................................................................................73 UTILIZAO DE ROLE COM PASSWORD ....................................................................................................................73 ROLES QUE J VEM DE FBRICA................................................................................................................................74 INFORMAES SOBRE ROLES NO DICIONRIO DE DADOS .........................................................................................75 ROLES ASSOCIADAS AO SISTEMA OPERACIONAL ......................................................................................................75 LISTAS DE EXERCCIOS ....................................................................................................................................77 BIBLIOGRAFIA .......................................................................................................................................................85

[R1] Comentrio: Este ndice do tipo Formal. Selecionar Inserir ndice e selecionar Formal.

INTRODUO AO SQL, SQL*Plus e PL/SQL (Oracle)

Comandos SQL, SQL*Plus e PL/SQL so utilizados para acessar e manipular dados armazenados em um servidor de Banco de Dados Oracle.

Linguagem ou Ferramenta SQL

SQL*Plus

PL/SQL

Descrio Uma linguagem no procedural para a comunicao com Bancos de Dados Relacionais a partir de ferramentas ou aplicaes. Uma ferramenta Oracle que reconhece e submete comandos SQL e PL/SQL para execuo no servidor. Edita comandos SQL com um editor de linha, formata o resultado de queries, controla variveis de ambiente, etc. Para executar estas tarefas o SQL*Plus possui seus prprios comandos. Uma linguagem procedural da Oracle para controlar a lgica de aplicaes.

Comandos SQL Comando SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVEPOINT GRANT REVOKE Descrio Recupera dados do Banco de Dados. Insere novas linhas, altera linhas existentes e remove linhas de tabelas do banco de dados, respectivamente. Estes comandos so conhecidos como comandos DML (Data Manipulation Language). Cria, altera e remove objetos do banco de dados. So conhecidos como comandos DDL (Data Definition Language).

Gerenciam as modificaes realizadas pelos comandos DML. As modificaes efetuadas pelos comandos DML podem ser agrupadas em transaes lgicas. Atribuem e removem direitos de acesso ao banco de dados e aos objetos a ele pertencentes. So conhecidos como comandos DCL (Data Control Language).

Tipos de Dados Oracle NUMBER NUMBER(p,s) DATE CHAR(s) VARCHAR2(s) LONG RAW LONG RAW Nmero ponto flutuante com preciso de 38 dgitos significativos Valor numrico com um nmero mximo de dgitos igual a p, e com s posies decimais. Data e Hora String de caracteres de tamanho fixo igual a s. O valor de s pode variar de 1 a 255. String de caracteres de tamanho varivel. Tamanho mximo igual a s. O valor de s pode variar de 1 a 2000. String de tamanho varivel at 2 gigabytes. Somente uma coluna deste tipo permitida por tabela. Utilizado para armazenar dados binrios limite: 2MB Utilizado para armazenar dados binrios limite: 2GB

SQL*PLUS Connect User/Password @String de Conexo

Comandos SQL*PLUS para a Edio de Linhas no Buffer L - Lista todas as linhas no buffer n - Torna corrente a linha especificada C/valor anterior/novo valor - Modifica um string no buffer R ou / - Executa o comando SQL que se encontra no buffer Del n - Apaga a n-sima linha no buffer

Comandos SQL*PLUS para a Manipulao de Arquivos SAVE Nome_do_Arquivo GET Nome_do_Arquivo START Nome_do_Arquivo @ Nome_do_Arquivo EDIT Nome_do_Arquivo EXIT Obs.: S comandos SQL vo para o buffer do SQL*PLUS, isto , comandos SQL*PLUS no vo para o buffer.

Consultando a Descrio de uma Tabela Desc Nome_da_Tabela O comando (SQL*Plus) Describe exibe a estrutura de uma tabela. So exibidos os nomes de colunas, as colunas NOT NULL e o tipo de cada coluna.

Criando as Tabelas a serem Utilizadas ao Longo do Curso Utilizando o SQL*PLUS conecte-se ao Banco de Dados. Na janela de logon no servidor de banco de dados digite na caixa de textos Conta o string AlunoX, na caixa de textos password digite AlunoX e no string de conexo digite ORACLE. Digite no SQL*Plus: @A:\TABELAS.SQL

Exemplo de um bloco PL/SQL

CREATE OR REPLACE REMOVE_PROFESSORES (V_Nome_Depart IN VARCHAR2) IS V_Numero_Depart NUMBER BEGIN -- Este procedimento tem como objetivo remover, da tabela de professores, todos os -- professores lotados em um determinado departamento. O procedimento recebe o -- nome do departamento e, aps descobrir o nmero associado a este departamento, -- remove todos os empregados que possuem este numero na coluna relativa ao nmero -- do departamento, na tabela de empregados.

SELECT Numero_Depart INTO V_Numero_Depart FROM Tab_Departamentos WHERE Nome_Depart = V_Nome_Depart; DELETE FROM Tab_Professores WHERE Tab_Professores.Numero_Depart = V_Numero_Depart; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END;

COMANDO SELECT Como Selecionar Linhas de uma nica Tabela

Exemplo 1: preciso informar as colunas desejadas da tabela. SELECT TABLE_NAME FROM USER_TABLES; DESC EMPREGADOS SELECT NUMERO, NOME FROM EMPREGADOS;

Exemplo 2: Utilizando a clusula DISTINCT para suprimir linhas duplicatas. SELECT CARGO FROM EMPREGADOS; SELECT DISTINCT CARGO FROM EMPREGADOS;

Exemplo 3: Utilizando a clusula DISTINCT com vrias colunas. SELECT DISTINCT CARGO, NUMERO_DEPT FROM EMPREGADOS;

Exemplo 4: Utilizando a clusula * para listar todas as colunas da tabela. SELECT * FROM EMPREGADOS;

Exemplo 5: Utilizando operadores aritmticos ( +, -, *, / ) na clusula Select. SELECT NOME, SALARIO * 12, DT_ADMISSAO FROM EMPREGADOS;

Exemplo 6: Utilizando Alias. SELECT NOME, SALARIO * 12 AS SAL_ANUAL, DT_ADMISSAO FROM EMPREGADOS;
8

OU SELECT NOME, SALARIO * 12 SAL ANUAL, DT_ADMISSAO FROM EMPREGADOS;

Exemplo 7: Utilizando operador de concatenao. SELECT NOME|| ||SOBRENOME FROM EMPREGADOS;

Exemplo 8: Como formatar relatrios simples. COL[UMN] Nome HEADING Nome do | Empregado FORMAT A9 COL[UMN] Salario HEADING Salrio FORMAT $99,990.00 SELECT NOME, SALARIO FROM EMPREGADOS; COL Nome CLEAR COL Salario CLEAR OU CLEAR COL

Como Ordenar e Limitar as Linhas Selecionadas Exemplo 1: Ordenando as linhas selecionadas com a clusula ORDER BY SELECT NOME, SALARIO FROM EMPREGADOS ORDER BY SALARIO; OU SELECT NOME, SALARIO FROM EMPREGADOS ORDER BY SALARIO DESC; Obs: Na ordenao ascendente, valores NULOS aparecem no final.

Exemplo 2: Ordenando pela posio da coluna selecionada SELECT NOME, SALARIO * 12 FROM EMPREGADOS ORDER BY SALARIO * 12; OU SELECT NOME, SALARIO * 12 FROM EMPREGADOS ORDER BY 2;

Exemplo 3: Selecionando apenas os empregados lotados no departamento 20. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT = 20 ORDER BY SALARIO;

10

Exemplo 4: Selecionando apenas o empregado denominado SMITH. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NOME = CELIO;

Observaes: 1. Usar aspas simples quando a comparao for com um literal. 2. literal Case Sensitive. 3. default para datas DD-MON-YY

Exemplo 5: Selecionando com operadores lgicos. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE SALARIO > 1000; Observaes: 1. Operadores para comparaes lgicas: 2. Outros comparadores: - BETWEEN ... AND ... ou - IN (Lista) ou - LIKE ou - IS NULL ou 3. Operadores lgicos: - AND - OR - NOT = > >= <= <> NOT BETWEEN NOT IN NOT LIKE IS NOT NULL

Exemplo 6: Selecionando linhas com BETWEEN ... AND ... SELECT NOME, DT_ADMISSAO FROM EMPREGADOS WHERE DT_ADMISSAO BETWEEN 28-SEP-90 AND 30-JAN-91;

11

Exemplo 7: Selecionando linhas com a clusula IN. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT IN (10, 20) ORDER BY NUMERO_DEPT, SALARIO;

Exemplo 8: Selecionando linhas com a clusula LIKE. SELECT NOME, SALARIO FROM EMPREGADOS WHERE NOME LIKE S% ORDER BY NOME; OU SELECT NOME, SALARIO FROM EMPREGADOS WHERE NOME NOT LIKE %I% ORDER BY NOME; OU SELECT NOME, SALARIO FROM EMPREGADOS WHERE NOME LIKE _A%; Observaes: % representa nenhum ou muitos caracteres. _ representa um nico caracter.

12

Exemplo 9: Selecionando linhas com a clusula IS NULL. 1. A coluna Num_supervisor contm o nmero do empregado que supervisiona o empregado corrente. SELECT NUMERO, NOME, CARGO, NUM_SUPERVISOR FROM EMPREGADOS; 2. Com esta Query recuperamos o nico empregado da empresa que no gerenciado por ningum, isto , o Presidente da empresa. SELECT NOME, CARGO, NUM_SUPERVISOR FROM EMPREGADOS WHERE NUM_SUPERVISOR IS NULL; Observao: O resultado da clusula Where abaixo sempre falso pois um valor nulo no pode ser igual ou diferente de outro valor, mesmo que este outro valor seja nulo. Se valores nulos forem comparados por operadores que no o IS NULL o resultado ser sempre falso. SELECT NOME, CARGO, NUM_SUPERVISOR FROM EMPREGADOS WHERE NUM_SUPERVISOR = NULL;

Exemplo 10: Selecionando linhas com operadores lgicos. SELECT NOME, SALARIO, NUMERO_DEPT FROM EMPREGADOS WHERE SALARIO >= 3000 AND (NUMERO_DEPT = 10 OR NUMERO_DEPT = 30);

[R2] Comentrio: AQUI ENTRA A LISTA DE EXERCCIOS NMERO 1.

13

Funes Aplicadas a Linhas

H dois tipos de funes: Funes de linhas Funes de grupos

Um funo de linha retorna um resultado por linha da tabela acessada. J uma funo de grupo retorna um resultado por grupo de registros. Exemplos de Funes de Linha: LOWER (UFF) uff UPPER (uff) UFF INITCAP (UNIVERSIDADE FEDERAL) Universidade Federal CONCAT (String1, String2) String1String2 SUBSTR (String, 1, 3) Str LENGTH (UFF) 3 NVL (SAL, 0) Se SAL for NULO seu valor ser convertido para zero. ROUND (78.731, 2) 78.73 (At 4 p/ baixo, Acima de 4 p/ cima) ROUND (78.731, 0) 79 TRUNC (78.731, 2) 78.73 TRUNC (78.731) 78 MOD (100, 30) 10

[R3] Comentrio: Por enquanto vamos ver apenas as funes de linhas. Funes de grupo sero vistas mais adiante quando estivermos estudando comandos SQL que lidam com grupos.

[R4] Comentrio: Com relao funo NVL, se o primeiro argumento numrico o segundo tambm dever ser numrico. Isto , no posso escrever: NVL(SAL, NADA). Por outro lado se o primeiro argumento um string ento devo colocar como segundo argumento outro string.

Exemplo 1: Utilizao da funo UPPER em uma sentena SQL. SELECT NOME, SALARIO, NUMERO_DEPT FROM EMPREGADOS WHERE UPPER (NOME) = CELIO;

Exemplo 2: Utilizao da funo CONCAT em uma sentena SQL. SELECT CONCAT (CONCAT(NOME, ), SOBRENOME) NOME FROM EMPREGADOS;

14

Exemplo 3: Utilizao das funes SUBSTR e LENGTH em uma sentena SQL. SELECT NOME, LENGTH (NOME) FROM EMPREGADOS WHERE SUBSTR (NOME, 1, 3) = CEL;

Exemplo 4: Utilizao das funes ROUND e TRUNC em uma sentena SQL. SELECT ROUND (78.731, 2), TRUNC (78.731) FROM EMPREGADOS; SELECT ROUND (78.731, 2), TRUNC (78.731) FROM SYS.DUAL; DESC SYS.DUAL SELECT DUMMY FROM SYS.DUAL; Observao: Dual uma tabela (dummy) do usurio SYS que pode ser utilizada quando se deseja, por exemplo, buscar a data do sistema.

Formato de Data As datas no Oracle so armazenadas em um formato numrico interno que representa o sculo, o ano, o ms, o dia, a hora, o minuto e os segundos. O formato de exibio default DD-MON-YY

Exemplos de Funes de Linha que manipulam Datas: SYSDATE Retorna a data do sistema no formato DD-MMM-YY MONTHS_BETWEEN (10-JAN-97, 10-JAN-98) 12 ADD_MONTHS (03-MAR-98, -3) 03-DEC-97 NEXT_DAY (03-MAR-98, SATURDAY) 07-MAR-98

Exemplo 1: Utilizao da funo SYSDATE em uma sentena SQL. SELECT SYSDATE FROM SYS.DUAL;

15

Para mudar o formato de uma data na sesso corrente ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YY';
[R5] Comentrio: Para se mudar permanentemente a data na mquina do usurio preciso acessar o registry do Windows e alterar ou incluir em HKEY_LOCAL_MACHINE\SOF TWARE\ORACLE a entrada NLS_DATE_FORMAT (acho) com o valor DD/MM/YY.

Exemplos de Funes de Linha que Realizam Converses de Dados: TO_CHAR Converte um nmero ou uma data para VARCHAR2. Um formato pode ser especificado. TO_NUMBER Converte um string contendo dgitos para NUMBER TO_DATE Converte um string representando uma data para DATE de acordo com o formato especificado. O formato default DD-MON-YY.

Exemplo 1: Utilizao da funo TO_CHAR. Como exibir uma data no formato DD/MM/AA. SELECT NOME, TO_CHAR (DT_ADMISSAO, DD/MM/YY) ADMISSO FROM EMPREGADOS; Observaes: Por default, a largura de uma coluna que resulta de uma expresso de 80 posies. YYYY ou YYY ou YY ou Y Os ltimos 4, 3, 2 ou 1 dgitos do ano. MM O ms representado em 2 dgitos. MON O nome do ms abreviado em 3 letras. DDD ou DD ou D Dia do ano, ms ou semana. DAY O nome do dia por extenso, completado com brancos at 9 caracteres. MM/AA Apenas o ms e o ano so exibidos.

Exemplo 2: Utilizao da funo TO_CHAR para exibir o dia da semana. SELECT NOME, TO_CHAR (DT_ADMISSAO, DAY) ADMISSO FROM EMPREGADOS;

Exemplo 3: Utilizao da funo TO_CHAR para exibir a data no formato completo. SELECT NOME, TO_CHAR (DT_ADMISSAO, DD-MM-YY HH:MI:SS) ADMISSO FROM EMPREGADOS;

16

Exemplo 4: Utilizao da funo TO_CHAR para formatar um valor numrico. SELECT NOME, TO_CHAR (SALARIO, $99,990.00) SALRIO FROM EMPREGADOS; Obs: Atravs do formato na funo TO_CHAR no h como trocar o separador decimal para a vrgula. Geralmente este tipo de coisa configurada no prprio software que ser utilizado para exibir os dados. Ex. Delphi.

Exemplo 5: Utilizao da funo TO_CHAR SELECT O funcionrio ||NOME|| recebeu ||TO_CHAR(SALARIO*0.2, fm$999,990.00) As Gratificao FROM EMPREGADOS; Obs: O fm no formato da coluna SALARIO utilizado para retirar espaos em branco.

Exemplo 6: Utilizao da funo TO_CHAR SELECT NOME, TO_CHAR(DT_ADMISSAO, fmDD de Month de YYYY.) Admisso FROM EMPREGADOS; Observaes: fm (full mode) no formato utilizado para retirar espaos em branco. Aspas ponto e aspas seguido de um plic fecham o formato da data.

Exemplo 6: Utilizao da funo TO_NUMBER. Somando um a DT_ADMISSAO. SELECT NOME, TO_NUMBER(TO_CHAR(DT_ADMISSAO, YYYY)) + 1 Admisso + 1 FROM EMPREGADOS;

Exemplo 7: Outra maneira de somar um a DT_ADMISSAO. SELECT NOME, TO_CHAR(ADD_MONTHS(DT_ADMISSAO, 12), YYYY) Admisso + 1 FROM EMPREGADOS;

Exemplo 8: Utilizando a funo TO_DATE. SELECT NOME, DT_ADMISSAO FROM EMPREGADOS WHERE DT_ADMISSAO = TO_DATE(February 20, 1991, Month dd, YYYY);
[R6] Comentrio: AQUI ENTRA A LISTA DE EXERCCIOS NMERO 2.

17

Como selecionar dados de mais de uma tabela Para se exibir dados de mais de uma tabela, atravs de um comando SQL, preciso definir condies de juno. (Joins) Os joins geralmente ocorrem entre valores de chave primria e de chave estrangeira. Tipos de Joins: Equijoin Non-equijoin Outer join Self Join Set operators Um produto cartesiano geralmente ocorre quando a condio de juno omitida ou invlida. Para evitar produtos cartesianos preciso incluir, na clusula Where, condies de juno vlidas.

[R7] Comentrio: Ocorrer tb um produto cartesiano quando todas as linhas da primeira tabela se relacionarem com todas as linhas da Segunda tabela.

Exemplo 1: Uma juno simples entre a Tabela de Empregados (Emp) e a tabela de Departamentos (Dept). SELECT EMPREGADOS.NOME, NUMERO_DEPT, DEPARTAMENTOS.NOME FROM EMPREGADOS, DEPARTAMENTOS WHERE EMPREGADOS.NUMERO_DEPT = DEPARTAMENTOS.NUMERO; Obs: Haver um ganho de desempenho e de clareza se voc sempre qualificar as colunas com o nome das tabelas s quais elas pertencem.
[R8] Comentrio: preciso informar de que tabela vem DEPTNO uma vez que esta coluna existe nas duas tabelas com o mesmo nome. Caso contrrio ocorrer um erro.

Exemplo 2: Uma juno simples entre a Tabela de Empregados e a tabela de Departamentos considerando apenas aqueles empregados que ganham mais de 2500,00. SELECT EMPREGADOS.NOME, EMPREGADOS.NUMERO_DEPT, DEPARTAMENTOS.NOME FROM EMPREGADOS, DEPARTAMENTOS WHERE EMPREGADOS.NUMERO_DEPT = DEPARTAMENTOS.NUMERO AND EMPREGADOS.SALARIO > 2500; OU SELECT E.NOME, E.NUMERO_DEPT, D.NOME FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO AND E.SALARIO > 2500;
[R9] Comentrio: Aliases.

18

Exemplo 3: Uma juno entre a tabela de Empregados, a tabela de Departamentos e a tabela de Dependentes. SELECT E.NOME, E.NUMERO_DEPT, DPT.NOME, DEP.NOME FROM EMPREGADOS E, DEPARTAMENTOS DPT, DEPENDENTES DEP WHERE E.NUMERO_DEPT = DPT.NUMERO AND E.NUMERO = DEP.NUMERO_EMP;

Exemplo 4: Uma juno com maior que e menor que (Between). SELECT E.NOME, E.CARGO, E.SALARIO, F.NIVEL FROM EMPREGADOS E, FAIXA_SALARIAL F WHERE E.SALARIO BETWEEN F.MENOR_SAL AND F.MAIOR_SAL;

Exemplo 5: Um exemplo de juno do tipo Outer Join. Recuperar o Nome de todos os empregados seguido do nome do departamento onde o empregado se encontra lotado. Caso o empregado no esteja lotado em nenhum departamento o nome do empregado deve aparecer seguido de um espao em branco. SELECT E.NOME Nome, D.NOME Nome do Depto FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO(+);

Nome ---------INGO TERESA CHICO CELIO JOSE LUIZA ARMANDO WALTER MARTA TUTTI JAMES JOHN SEBASTIAN ABELARDO SILVIO
15 rows selected.

Nome do Depto -------------COMPRAS COMPRAS COMPRAS VENDAS VENDAS MARKETING MARKETING VENDAS COMPRAS PESQUISA COMPRAS VENDAS VENDAS

19

Observaes: - Observe que o empregado Tutti no est lotado em nenhum departamento. - O sinal de + deve ficar do lado do valor nulo. - O sinal de + no pode ser colocado em ambos os lados da clusula Where. O que aconteceria se o comando fosse escrito conforme vem abaixo? SELECT E.NOME Nome, D.NOME Nome do Depto FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT(+) = D.NUMERO;

[R10] Comentrio: Na verdade o valor nulo est na coluna Numero_dept na tabela de empregados.

Exemplo 6: Juno de uma tabela com ela prpria. Recuperar o Nome de todos os empregados seguido do nome de seu respectivo supervisor. SELECT E1.NOME Supervisor, E2.NOME Empregado FROM EMPREGADOS E1, EMPREGADOS E2 WHERE E1.NUMERO = E2.NUM_SUPERVISOR; Supervisor ---------INGO INGO INGO TERESA TERESA CHICO CHICO CHICO CHICO CHICO CELIO JOSE LUIZA LUIZA 14 rows selected. O que precisaria ser feito para que o empregado Ingo (que o presidente) aparea na coluna de empregados, porem sem Supervisor? Empregado ---------TERESA CHICO CELIO JOSE LUIZA ARMANDO WALTER MARTA TUTTI JAMES JOHN SEBASTIAN ABELARDO SILVIO

[R11] Comentrio: Caso haja um departamento sem empregado, ficar em branco o nome do empregado e ao lado o nome do departamento.

[R12] Comentrio: SELECT E1.NOME Supervisor, E2.NOME Empregado FROM EMPREGADOS E1, EMPREGADOS E2 WHERE E1.NUMERO(+) = E2.NUM_SUPERVISOR;

20

Funes de Grupo Funes de grupo operam com um conjunto de linhas para dar um resultado por grupo de linhas. Um conjunto de linhas pode ser uma tabela inteira ou linhas desta tabela divididas em grupos. Funes de grupo podem aparecer tanto na clusula Select quanto na clusula Having. A clusula Group By divide as linhas de uma ou mais tabelas em grupos de linhas. A clusula Having seleciona os grupos que sero aceitos.

Funes de Grupo Existentes: AVG COUNT MAX MIN STDDEV SUM VARIANCE Observaes: A clusula Distinct pode ser utilizada para que sejam considerados apenas valores no duplicatas. Todas as funes de grupo ignoram valores nulos. Para substituir um valor nulo por outro valor utilize a funo NVL.

Exemplo 1: Utilizao de funes de grupo, considerando todas as linhas de uma tabela um nico grupo. SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO), SUM(SALARIO) FROM EMPREGADOS; OU SELECT MIN(NOME), MAX(NOME) FROM EMPREGADOS;

Exemplo 2: Um nico grupo definido atravs da clusula Where. SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO), SUM(SALARIO) FROM EMPREGADOS WHERE CARGO LIKE VEND%; Exemplo 3: Utilizao da funo COUNT para contar o nmero de empregados lotados no departamento nmero 10.

21

SELECT COUNT(*) FROM EMPREGADOS WHERE NUMERO_DEPT = 10;

Exemplo 4: Utilizao da funo COUNT para contar o nmero de empregados que possuem percentual de comisso diferente de nulo. SELECT COUNT(PERC_COMISSAO) FROM EMPREGADOS;

Exemplo 5: Utilizao da funo COUNT para contar o nmero de empregados na tabela. SELECT COUNT(NVL(PERC_COMISSAO, 0)) FROM EMPREGADOS;

Observaes: COUNT(*) conta o nmero de linhas na tabela. COUNT(PERC_COMISSAO) conta o nmero de linhas com percentual de comisso diferente de nulo. COUNT(NUMERO) conta o nmero de linhas na tabela uma vez que a coluna NUMERO a chave primria da tabela e toda chave primria no pode conter valores nulos.

22

A clusula Group By Exemplo 6: Utilizao da clusula GROUP BY e da funo COUNT para se contar quantos empregados esto lotados em cada departamento. SELECT NUMERO_DEPT, COUNT(*) FROM EMPREGADOS GROUP BY NUMERO_DEPT; Observaes: Qualquer coluna includa na clusula SELECT, se no estiver em uma funo de grupo, dever constar da clusula GROUP BY. Com a clusula WHERE possvel excluir determinadas linhas dos grupos. Por default as linhas so ordenadas ascendentemente conforme a lista de colunas especificada na clusula GROUP BY. Para modificar este comportamento preciso utilizar a clusula ORDER BY.

Exemplo 7: Utilizao da clusula Group By, da funo COUNT e de um JOIN para se contar quantos empregados esto lotados em cada departamento. SELECT D.NOME DEPARTAMENTO, COUNT(*) QTD FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO GROUP BY D.NOME;

[R13] Comentrio: No possvel fazer o Group By por Numero_Dept e na clusula Select colocar o Nome do Departamento.

Exemplo 8: Utilizao da clusula Group By e da funo COUNT para se contar quantos empregados esto lotados em cada departamento. SELECT D.NOME DEPARTAMENTO, COUNT(*) QTD FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO GROUP BY D.NOME ORDER BY 2;

[R14] Comentrio: No possvel fazer o Group By por Numero_Dept e na clusula Select colocar o Nome do Departamento. [R15] Comentrio: Normalme nte esta query estaria ordenada ascendentemente por D.Nome.

23

Exemplo 9: A query abaixo est correta? A inteno listar o nmero dos departamentos seguido da mdia salarial. No entanto, deseja-se listar apenas aqueles departamentos cuja mdia salarial superior a 2000. SELECT NUMERO_DEPT, AVG(SALARIO) FROM EMPREGADOS WHERE AVG(SALARIO) > 2000 GROUP BY NUMERO_DEPT;

A clusula Having Para se restringir a incluso de grupos no se pode utilizar a clusula WHERE. A clusula WHERE deve ser utilizada para se restringir a incluso de linhas em um grupo. Para se omitir a incluso de grupos inteiros do resultado de uma query deve-se utilizar a clusula HAVING.

Exemplo 10: A utilizao da clusula HAVING para listar o nmero dos departamentos seguido da mdia salarial de seus empregados. No entanto, deseja-se listar apenas aqueles departamentos cuja mdia salarial superior a 2000. SELECT NUMERO_DEPT, AVG(SALARIO) FROM EMPREGADOS GROUP BY NUMERO_DEPT HAVING AVG(SALARIO) > 2000;

Exemplo 11: A utilizao da clusula GROUP BY para listar a quantidade de empregados por departamento/cargo. Isto , grupos dentro de grupos. No deve ser exibido Nmero de Departamento NULO. SELECT NUMERO_DEPT, CARGO, COUNT(*) FROM EMPREGADOS GROUP BY NUMERO_DEPT, CARGO HAVING NUMERO_DEPT IS NOT NULL;

24

Exemplo 12: A utilizao da clusula GROUP BY para listar a quantidade de empregados por departamento/cargo. S devem ser exibidos os grupos de departamentos/cargo com mais de 1 empregado. SELECT NUMERO_DEPT, CARGO, COUNT(*) FROM EMPREGADOS GROUP BY NUMERO_DEPT, CARGO HAVING COUNT(*) > 1;

As clusulas do comando Select so avaliadas na seguinte ordem: 1. Se o comando SQL contem a clusula WHERE, o SGBD seleciona as linhas candidatas. 2. O SGBD identifica os grupos especificados pela clusula GROUP BY. 3. A clusula HAVING restringe os grupos resultantes que no esto de acordo com os critrios especificados nesta clusula.

25

A recuperao de dados com subconsultas (Subqueries)

Uma subconsulta um comando SELECT embutido em uma clusula de outro comando SQL. Quando e como utilizar: Escreva subconsultas para recuperar dados baseados em critrios desconhecidos. Pode ser muito til quando se necessita selecionar linhas de uma tabela com uma condio que depende dos dados que esto na prpria ou em outra tabela. Subconsultas no podem conter a clusula ORDER BY. Duas classes de operadores de comparaes so utilizadas em subconsultas: Operadores de uma nica linha: >, =, >=, <, <=, <> Operadores de multiplas linhas: IN e NOT IN. Como uma subconsulta processada? Primeiramente executado o comando SELECT aninhado. Em seguida o resultado utilizado em uma condio da consulta principal.

Exemplo 1: A utilizao de uma subconsulta aninhada para recuperar o nome e salrio de todos os empregados que trabalham no mesmo departamento que o JOSE trabalha. SELECT NOME, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT = (SELECT NUMERO_DEPT FROM EMPREGADOS WHERE NOME = JOSE);

[R16] Comentrio: Primeiro executada esta query para em seguida executar a query principal.

Exemplo 2: A utilizao de uma subconsulta aninhada para recuperar o nome e salrio de todos os empregados que ganham mais do que a mdia salarial da empresa. SELECT NOME, SALARIO FROM EMPREGADOS WHERE SALARIO > (SELECT AVG(SALARIO) FROM EMPREGADOS);

26

Exemplo 3: A utilizao de uma subconsulta aninhada para recuperar o nome, nmero do departamento e salrio de todos os empregados que trabalham no departamento situado no RIO ou no departamento denominado VENDAS. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT = (SELECT NUMERO FROM DEPARTAMENTOS WHERE LOCAL = RIO OR NOME = VENDAS);

[R17] Comentrio: Isso no funciona se a subquery recuperar mais de um nmero de departamento.

Exemplo 4: A utilizao de uma subconsulta aninhada para recuperar o nome, nmero do departamento e salrio de todos os empregados que trabalham no departamento situado no RIO ou no departamento denominado VENDAS. Correo da query anterior com a utilizao da clusula IN uma vez que esta subconsulta retorna mais de uma linha. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT IN (SELECT NUMERO FROM DEPARTAMENTOS WHERE LOCAL = RIO OR NOME = VENDAS);

Exemplo 5: A utilizao de uma subconsulta aninhada para recuperar o nmero do departamento e sua mdia salarial. Devem ser recuperados apenas os departamentos cuja mdia salarial maior do que a mdia salarial do departamento nmero 30. SELECT NUMERO_DEPT, AVG(SALARIO) FROM EMPREGADOS GROUP BY NUMERO_DEPT HAVING AVG(SALARIO) >= (SELECT AVG(SALARIO) FROM EMPREGADOS WHERE NUMERO_DEPT = 30);

Exemplo 6: A utilizao de uma subconsulta aninhada para recuperar, por departamento, o nome e o salrio do empregado mais bem pago. SELECT NOME, SALARIO FROM EMPREGADOS WHERE (SALARIO, NUMERO_DEPT) IN (SELECT MAX(SALARIO), NUMERO_DEPT FROM EMPREGADOS GROUP BY NUMERO_DEPT);
27

A recuperao de dados com subconsultas correlacionadas O exemplo abaixo difere do anterior (Exemplo 6 da pg. anterior) uma vez que neste caso a subconsulta executada uma vez para cada linha da tabela de empregados na consulta mais externa. Exemplo 1: A utilizao de uma subconsulta correlacionada para recuperar, por departamento, o nome e o salrio do empregado mais bem pago. SELECT NOME, SALARIO FROM EMPREGADOS E1 WHERE SALARIO = (SELECT MAX(SALARIO) FROM EMPREGADOS E2 WHERE E1.NUMERO_DEPT = E2.NUMERO_DEPT);

Exemplo 2: A utilizao de uma subconsulta correlacionada para recuperar o nome dos empregados que trabalham no projeto numero 2. SELECT NOME FROM EMPREGADOS E WHERE 2 IN ( SELECT NUMERO_PROJ FROM TRABALHAM WHERE NUMERO_EMP = E.NUMERO);

Exemplo 3: A mesma query acima sem a utilizao de subconsulta correlacionada. SELECT NOME FROM EMPREGADOS E, TRABALHAM T WHERE E.NUMERO = T.NUMERO_EMP AND T.NUMERO_PROJ = 2;

28

Quantificador Existencial Exists representa o quantificador existencial, uma noo emprestada da lgica formal. Em SQL, um predicado existencialmente quantificado representado pela expresso da forma EXISTS (SELECT * FROM ... ). Essa expresso ser verdadeira se o resultado do clculo da subconsulta representado por SELECT * FROM ... no estiver vazio, isto , se existir pelo menos um registro na tabela FROM da subconsulta que satisfaz a condio WHERE dessa mesma subconsulta. Quanquer consulta que utilize IN pode alternativamente ser formulada com EXISTS, porm o inverso no verdadeiro.

Exemplo 1: Obter o nome dos empregados que trabalham no projeto n 2. SELECT NOME FROM EMPREGADOS E WHERE EXISTS (SELECT * FROM TRABALHAM WHERE NUMERO_EMP = E.NUMERO AND NUMERO_PROJ = 2); OU SELECT NOME FROM EMPREGADOS E, TRABALHAM T WHERE E.NUMERO = T.NUMERO_EMP AND T.NUMERO_PROJ = 2;

Exemplo 2: Obter o nome dos empregados que no trabalham no projeto n 2. SELECT NOME FROM EMPREGADOS E WHERE NOT EXISTS (SELECT * FROM TRABALHAM WHERE NUMERO_EMP = E.NUMERO AND NUMERO_PROJ = 2); OU

29

SELECT NOME FROM EMPREGADOS MINUS SELECT NOME FROM EMPREGADOS E, TRABALHAM T WHERE T.NUMERO_EMP = E.NUMERO AND T.NUMERO_PROJ = 2;

Exemplo 3: Obter o nome dos empregados que trabalham em todos os projetos. SELECT NOME FROM EMPREGADOS E WHERE NOT EXISTS (SELECT * FROM PROJETOS P WHERE NOT EXISTS (SELECT * FROM TRABALHAM T WHERE T.NUMERO_EMP = E.NUMERO AND T.NUMERO_PROJ = P.NUMERO));

Observaes: Deve ser selecionado um nome de empregado quando no existir um projeto no qual ele no trabalhe.

Exemplo 4: Obter o nome dos empregados que trabalham em todos os projetos nos quais o empregado 7521 trabalha. SELECT NOME FROM EMPREGADOS E WHERE NOT EXISTS (SELECT * FROM TRABALHAM T1 WHERE NUMERO_EMP = 7521 AND NOT EXISTS (SELECT * FROM TRABALHAM T2 WHERE T2.NUMERO_EMP = E.NUMERO AND T2.NUMERO_PROJ = T1.NUMERO_PROJ));

30

Unio (Union e Union All) Linhas duplicatas so eliminadas do resultado de uma unio a no ser que o operador UNION inclua explicitamente o quantificador ALL. Assim, no exemplo n 1, o projeto n 3 selecionado em ambos os SELECTS, mas s aparece uma vez no resultado final. J o exemplo n 2 retornar os nmeros de projeto 2, 3 e 3. Qualquer nmero de SELECTS pode ser unido pelo UNION. Quando sabemos que no haver elementos duplicados no resultado conveniente utilizarmos UNION ALL para que o sistema no seja forado a eliminar duplicidades, desnecessariamente.

Exemplo 1: Obter o nmero dos projetos que, ou se iniciaram aps 31-JUL-97, ou possuem o empregado 7566 nele trabalhando. Unio sem repetio. SELECT NUMERO FROM PROJETOS WHERE DT_INICIO > 31-JUL-97 UNION SELECT NUMERO_PROJ FROM TRABALHAM WHERE NUMERO_EMP = 7566;

Exemplo 2: Obter o nmero dos projetos que, ou se iniciaram aps 31-JUL-97, ou possuem o empregado 7566 nele trabalhando. Unio com repetio. SELECT NUMERO FROM PROJETOS WHERE DT_INICIO > 31-JUL-97 UNION ALL SELECT NUMERO_PROJ FROM TRABALHAM WHERE NUMERO_EMP = 7566;

31

Exemplo 3: A possibilidade de incluirmos constantes numa clusula SELECT frequentemente til quando a clusula UNION utilizada. Por exemplo, para indicar qual das duas condies WHERE foi atendida para a incluso do elemento no resultado final. SELECT NUMERO, DT_INICIO > 07-JAN-90 CONDIO FROM PROJETOS WHERE DT_INICIO > 07-JAN-90 UNION ALL SELECT NUMERO_PROJ, NUMERO_EMP = 7566 FROM TRABALHAM WHERE NUMERO_EMP = 7566; Resultado: NUMERO -----------2 3 4 3 CONDIO --------------------DT_INICIO > 07-JAN-90 DT_INICIO > 07-JAN-90 DT_INICIO > 07-JAN-90 NUMERO_EMP = 7566

32

SCRIPTS REUTILIZVEIS

O objetivo aqui escrever scripts que, em tempo de execuo, indaguem o usurio sobre o valor de variveis utilizadas na clusula WHERE de comandos SQL embutidos no script. Exemplo 1: Usando Variveis de Substituio em Instrues SQL. SELECT NOME, SALARIO FROM EMPREGADOS WHERE CARGO = '&CARGO'; Enter value for cargo: VENDEDOR

Como Gerar um Script para esta Instruo Chame o EDIT e aps editar o comando abaixo, salve este arquivo com o nome EXERC01.SQL no diretrio Z: SELECT NOME, SALARIO FROM EMPREGADOS WHERE CARGO = '&CARGO'; Para executar, d ALT+TAB para o SQL*PLUS e digite: START Z:\EXERC01.SQL (com ou sem o .SQL) ou @Z:\EXERC01.SQL (com ou sem o .SQL) A Execuo Aparecer Assim: SQL> @Z:\Exerc01 Enter value for cargo: VENDEDOR old 3: WHERE CARGO = '&CARGO' new 3: WHERE CARGO = 'VENDEDOR' NOME --------------ARMANDO WALTER MARTA TUTTI SALARIO ------------1600.45 1250 1250 1100

33

Definindo Variveis do Usurio Exemplo 2: Chamar o EDIT e aps editar o comando abaixo, salvar este arquivo com o nome EXERC02.SQL no diretrio Z: SET ECHO OFF SET VERIFY OFF ACCEPT DATA_ADM DATE FORMAT DD-MON-YY PROMPT "Entre com a data da contratao: " SELECT NOME, DT_ADMISSAO ADMISSAO FROM EMPREGADOS WHERE DT_ADMISSAO > '&DATA_ADM' / UNDEFINE DATA_ADM SET VERIFY ON SET ECHO ON Para executar, d ALT+TAB para o SQL*PLUS e digite: START EXERC02 Observaes: SET ECHO OFF evita que os comandos ecoem na tela do SQL*PLUS. (Assim como ocorre no DOS). SET VERIFY OFF faz desaparecer da tela os valores OLD e NEW da varivel de substituio. Note que &DATA_ADM na clusula WHERE acima encontra-se entre plics. Isto evita que o usurio seja obrigado a digitar os PLICS. Sem os plics o usurio teria de digit-los para tudo que necessitasse ser tratado como caracter ou data. O comando ACCEPT cria a varivel (caso ela j no tenha sido criada anteriormente), l o valor digitado pelo usurio e o atribui varivel. Sintaxe do comando: ACCEPT varivel [datatype] [FORMAT] [PROMPT texto] [HIDE] O comando UNDEFINE libera a rea de memria ocupada pela varivel. Assim como no DOS, se digito a clusula WHERE assim: WHERE CARGO = &1 ento ser possvel executar este script assim: @Z:\Exerc02.SQL VENDEDOR S comandos SQL vo para o buffer. Todos os demais comandos no vo para o buffer do SQL*Plus.

34

CRIAO DE TABELAS

Estruturas de dados que podem ser criadas com um SGBD Oracle 7 Estruturas de Dados Tabela Viso Sequncia ndice Descrio Armazena dados. Representa logicamente subconjuntos de dados de uma ou mais tabelas. Gera valores de chaves primrias. Melhora o desempenho de algumas consultas.

Tabelas Uma tabela pode ser criada a qualquer momento. No necessrio especificar seu tamanho, no momento da sua criao, embora seja possvel. A estrutura de uma tabela pode ser modificada a qualquer momento, sem a necessidade de se tirar o banco do ar. Quando uma tabela criada sua definio armazenada no dicionrio de dados. Para se poder criar tabelas preciso ter o privilgio de CREATE TABLE e o direito de utilizar algum espao em disco, alocado para o banco de dados. Quem concede estes direitos para os usurios do banco o Administrador de Banco de Dados. (DBA)

Comando Create Table Exemplo: CREATE TABLE FORNECEDORES (NUMERO NUMBER(2) PRIMARY KEY, NOME VARCHAR2(25) NOT NULL, TELEFONE CHAR(7), ENDERECO VARCHAR2(20), VALOR_FORNEC NUMBER (8,2));

[R18] Comentrio: Os alunos devero criar esta tabela exatamente como est aqui.

Observaes: O nome de uma tabela deve comear por uma letra. Pode ter at 30 caracteres. Deve conter apenas: A-Z, a-z, 0-9, _, $ e #. No pode ter o mesmo nome de qualquer outro objeto existente no esquema do usurio.

35

Tipos de Dados Oracle NUMBER NUMBER(p,s) DATE CHAR(s) VARCHAR2(s) LONG RAW e LONG RAW Nmero ponto flutuante com preciso de 38 dgitos significativos Valor numrico com um nmero mximo de dgitos igual a p, e com s posies decimais. Data e Hora String de caracteres de tamanho fixo igual a s. O valor de s pode variar de 1 a 255. String de caracteres de tamanho varivel. Tamanho mximo igual a s. O valor de s pode variar de 1 a 2000. String de tamanho varivel at 2 gigabytes. Somente uma coluna do tipo Long permitida por tabela. Equivalem a VARCHAR2 e LONG, respectivamente. So utilizados para armazenar dados binrios, que no devem ser interpretados pelo servidor Oracle.

Tipos de Constraints PRIMARY KEY FOREIGN KEY NOT NULL UNIQUE CHECK Observaes: possvel criar uma constraint aps a criao da tabela. Uma constraint pode ser definida a nvel de coluna ou a nvel de tabela. Constraints so armazenadas no Dicionrio de Dados e podem ser facilmente recuperadas se possurem nomes razoveis.

[R19] Comentrio: Automatic amente ser criado um ndice nico para a(a) coluna(s) especificada(s), se ele j no existir. [R20] Comentrio: Para teste em cima de faixas de valores.

Como dar Nome s Constraints Exemplo 1: Constraints Primary Key e Not Null. CREATE TABLE FORNECEDORES (NUMERO NUMBER(2) CONSTRAINT FORNECEDORES_NUMERO_PK PRIMARY KEY, NOME VARCHAR2(25) CONSTRAINT FORNECEDORES_NOME_NN NOT NULL, TELEFONE CHAR(7) CONSTRAINT FORNECEDORES_TELEFONE_NN NOT NULL, ENDERECO VARCHAR2(20), VALOR_FORNEC NUMBER (8,2));

[R21] Comentrio: Os alunos devero Dropar a tabela de Fornecedores existente (foi criada pelos prprios alunos) e, em seguida, devero cri-la novamente, agora com as constraints.

36

Verificando o Comportamento da Constraint Primary Key da Tabela de Fornecedores INSERT INTO FORNECEDORES VALUES (10, 'NAYA CONSTRUCOES LTDA', '5555555', NULL, 0); INSERT INTO FORNECEDORES VALUES (10, 'NAYA CONSTRUCOES LTDA', '5555555', NULL, 0); INSERT INTO FORNECEDORES * ERROR at line 1: ORA-00001: unique constraint (CARLOS.SYS_C00660) violated

Exemplo 2: Constraints Primary Key e Not Null. CREATE TABLE DEPARTAMENTOS (NUMERO NUMBER(2) CONSTRAINT DEPARTAMENTOS_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(14) CONSTRAINT DEPARTAMENTOS_NOME_NN NOT NULL, LOCAL VARCHAR2(13)); Exemplo 3: Constraint Check e Integridade Referecial com a prpria tabela de Empregados e com a tabela de Departamentos. CREATE TABLE EMPREGADOS (NUMERO NUMBER(4) CONSTRAINT EMPREGADOS_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(10), SOBRENOME VARCHAR2(10), CPF CHAR(11) CONSTRAINT EMPREGADOS_CPF_UN UNIQUE, CARGO VARCHAR2(9), NUM_SUPERVISOR NUMBER(4) CONSTRAINT EMP_EMP_NUM_SUPERVISOR_FK REFERENCES EMPREGADOS (NUMERO), DT_ADMISSAO DATE, SALARIO NUMBER(7,2), PERC_COMISSAO NUMBER(4,2) CONSTRAINT EMPREGADOS_PERC_COMISSAO_CK CHECK (PERC_COMISSAO IN (10, 12.5, 15, 17.5, 20)), NUMERO_DEPT NUMBER(2) CONSTRAINT EMPR_DEPARTAMENTOS_NUMERO_DEPT_FK REFERENCES DEPARTAMENTOS (NUMERO) ON DELETE CASCADE);
37

[R22] Comentrio: Ver observaes na pg 35. Para que valores nulos no sejam aceitos seria preciso acrescentar uma constraint Not Null. [R23] Comentrio: Quando se usa a Constraint Check no quer dizer que um valor nulo no possa ser informado. [R24] Comentrio: Nome da tabela filho Nome da tabela pai Nome da coluna na tabela filho Tipo da constraint. A tabela filho a de Empregados. A tabela pai a de Departamentos. [R25] Comentrio: Permite deleo na tabela pai e a deleo das linhas dependentes na tabela filho. Pode no haver a clusula ON DELETE CASCADE.

Exemplo 4: CREATE TABLE DEPENDENTES (NUMERO_EMP NUMBER(4) CONSTRAINT DEPENDENTES_EMP_NUMERO_EMP_FK REFERENCES EMPREGADOS (NUMERO), NUM_ORDEM NUMBER(2), NOME VARCHAR2(10), CONSTRAINT DEPENDENTES_NUM_EMP_NUM_ORD_PK PRIMARY KEY(NUMERO_EMP, NUM_ORDEM));

Observaes sobre a Constraint Primary Key: A constraint Primary Key uma combinao das constraints Unique e Not Null. Um ndice nico automaticamente criado.

Observaes sobre a Constraint Unique: Designa uma coluna ou uma combinao de colunas de tal forma que duas linhas no possam ter o mesmo valor. Valores nulos so aceitos. Automaticamente criado um ndice nico para a(s) coluna(s) especificada(s).

Observaes sobre a Constraint Foreign Key: Estabelece um relacionamento com a chave primria ou nica da mesma ou de outra tabela. Deve referenciar um valor existente na tabela pai ou ser nulo. Chaves estrangeiras so baseadas em dados e so puramente lgicas, isto , no so ponteiros fsicos. Uma chave estrangeira, parte de uma chave primria, no pode ser nula pois uma chave primria no pode ser nula, nem parcialmente nula. Havendo a clusula ON DELETE CASCADE, uma deleo na tabela pai causa a deleo das linhas relacionadas na tabela filho.

Observaes sobre a Constraint Check: A constraint Check define uma condio que cada linha deve satisfazer. No pode fazer referncia a CURRVAL, NEXTVAL, LEVEL e ROWNUM ou chamadas s funes SYSDATE, UID, USER. Subconsultas no so permitidas na definio de uma constraint check.

38

Outras Formas de se Validar uma Restrio de Integridade Triggers Procedimentos ou funes armazenados no servidor de banco de dados Atravs do cdigo na prpria aplicao.

Como Consultar uma Constraint no Dicionrio de Dados SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'EMPREGADOS_PERC_COMISSAO_CK';

[R26] Comentrio: Na verdade Search_Condition a nica informao que no consta do prprio nome da constraint 'EMPREGADOS_PERC_COMIS SAO_CK'.

Como Criar uma Tabela Atravs de uma Subconsulta

CREATE TABLE EMPREGADOS_VENDAS AS SELECT * FROM EMPREGADOS WHERE CARGO = VENDEDOR;

[R27] Comentrio: Poderia especificar aqui quais colunas desejo copiar.

Observao: A tabela Empregados_Vendas criada contendo todos os empregados no cargo de vendedores. Apenas a constraint NOT NULL copiada. Ao trmino da execuo do comando, confirme a sua criao executando um DESCRIBE.

39

DICIONRIO DE DADOS

um dos mais importantes componentes do servidor Oracle7. Os componentes do dicionrio so criados quando um banco de dados criado. Sempre que um banco de dados est em operao, o dicionrio de dados atualizado e mantido pelo servidor Oracle7. O Owner de todas as tabelas do dicionrio de dados o usurio SYS. As tabelas que compem o dicionrio de dados so raramente acessadas diretamente pois so difceis de entender. Logo, os usurios costumam acessar vises das tabelas do dicionrio que possuem as informaes num formato mais fcil de entender.

Exemplo de informaes no Dicionrio de Dados: Informaes sobre os usurios; Privilgios concedidos a usurios; Informaes sobre os objetos existentes no banco: tabelas, vises, ndices, etc; Constraints associadas a tabelas do banco, etc.

Existem 4 classes de vises no dicionrio de dados: PREFIXO USER_ ALL_ DBA_ V$ DESCRIO Contm objetos cujo owner o prprio usurio. Ex. USER_TABLES Acessa objetos aos quais o usurio recebeu algum direito em adio aos objetos possuidos pelo usurio. Permite que um usurio com o privilgio de DBA acesse qualquer objeto no banco de dados. Apresenta informaes de performance do Servidor e informaes de lock. Disponvel apenas para o DBA.

Outras Vises: Vrias vises do dicionrio de dados no usam os prefixos listados acima. Por exemplo:

Nome da Viso DICTIONARY DICT_COLUMNS IND

Descrio Descreve todas as tabelas, vises e sinnimos que compem o dicionrio de dados. Descreve as colunas das tabelas, vises e sinnimos que compem o dicionrio de dados. sinnimo para USER_INDEXES

[R28] Comentrio: Muito Importantes.

40

Exemplo 1: Como saber que vises existem no dicionrio de dados e para que servem. DESC DICTIONARY SELECT TABLE_NAME, COMMENTS FROM DICTIONARY;

Exemplo 2: Para conhecer a descrio das colunas de qualquer tabela ou viso do dicionrio de dados, veja o contedo de DICT_COLUMNS. Na clusula WHERE voc dever informar o nome da tabela ou viso do dicionrio que deseja conhecer. SELECT COLUMN_NAME, COMMENTS FROM DICT_COLUMNS WHERE TABLE_NAME = USER_OBJECTS;

Exemplo 3: Como saber que objetos (tabelas, no caso) um usurio possui. Que tipos de objetos um usurio pode possuir? Resposta: Tables, Views, Sequences, Indexes e Clusters. DESC USER_OBJECTS SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = TABLE;

Exemplo 4: Como saber que tipos de objetos um usurio possui. SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS;

Exemplo 5: Como saber a que tabela e a que coluna uma constraint pertence? SELECT TABLE_NAME, COLUMN_NAME FROM USER_CONS_COLUMNS WHERE CONSTRAINT_NAME = EMPR_DEPARTAMENTOS_NUMERO_DEPT_FK;

41

Exemplo 6: Como recuperar o nome de todas as constraints da tabela de Empregados acompanhado do nome das colunas associadas s contraints. SELECT CONSTRAINT_NAME, COLUMN_NAME FROM USER_CONS_COLUMNS WHERE TABLE_NAME = EMPREGADOS; Resultado: CONSTRAINT_NAME ----------------------------------------------------------EMPREGADOS_CPF_UK EMPREGADOS_NUMERO_PK EMPREGADOS_PERC_COMISSAO_CK EMPREG_DEPARTAMENTOS_NUMERO_FK EMP_EMP_NUM_SUPERVISOR_FK COLUMN_NAME -----------------------------CPF NUMERO PERC_COMISSAO NUMERO_DEPT NUM_SUPERVISOR

42

COMANDOS DE MANIPULAO DE DADOS

Comandos INSERT UPDATE DELETE COMMIT SAVEPOINT ROLLBACK

Descrio Adiciona novas linhas a uma tabela. Modifica linhas existentes em uma tabela. Remove linhas existentes de uma tabela. Torna permanente todas as modificaes pendentes. Permite um Rollback at a marca de savepoint. Desfaz todas as manipulaes efetuadas.

O Comando INSERT Exemplo 1: Quando so informados os dados de todas as colunas e na ordem default, no necessrio informar o nome das colunas.

INSERT INTO DEPARTAMENTOS VALUES (10, 'COMPRAS', 'RIO');

Exemplo 2: Os nomes das colunas foram informados desnecessariamente. INSERT INTO DEPARTAMENTOS (NUMERO, NOME, LOCAL) VALUES (50, 'PROJETOS', 'RIO');
[R29] Comentrio: Numero Primary Key Nome Not Null Local Pode ser nulo.

Exemplo 3: Mtodo implcito de insero de nulos. INSERT INTO DEPARTAMENTOS (NUMERO, NOME) VALUES (50, 'PROJETOS');

Exemplo 4: Mtodo explcito de insero de nulos. Alm da palavra-chave NULL, tambm pode ser utilizado o string vazio INSERT INTO DEPARTAMENTOS (NUMERO, NOME, LOCAL) VALUES (50, 'PROJETOS', NULL);

43

Exemplo 5: Os nomes das colunas precisaram ser informados uma vez que os dados no esto na ordem default. INSERT INTO DEPARTAMENTOS (NOME, NUMERO, LOCAL) VALUES ('PROJETOS', 50, RIO);

Exemplo 6: A clusula NULL foi utilizada. INSERT INTO EMPREGADOS VALUES (7788, 'JOSE', 'NONATO', '55555555555', NULL, 7566, '17-DEC-91', 3000, 12.5, 20); Para mudar o separador decimal e o separador de grupos ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.' Quando o caracter decimal no o ponto (.) ou quando o separador de grupos utilizado, os nmeros que aparecem em instrues SQL devem aparecer entre plics, pois a vrgula costuma ser utilizada como separador de itens em instrues SQL. Exemplo: INSERT INTO EMPREGADOS VALUES (7788, 'JOSE', 'NONATO', '55555555555', 'ANALISTA', 7566, '17-DEC-91', 3000, 12,5, 20);

Exemplo 7: Insero de valores especiais: USER e SYSDATE. INSERT INTO EMPREGADOS VALUES (7788, USER, '55555555555', NULL, 7566, TO_CHAR (SYSDATE, DD/MON/YY), 3000, 12.5, 20);

[R30] Comentrio: SYSDAT E DATA e HORA.

Exemplo 8: Utilizando variveis de substituio. INSERT INTO DEPARTAMENTOS (NUMERO, NOME, LOCAL) VALUES (&Numero_dep, &Nome_dep, &Local_dep);

44

Exemplo 9: Como copiar linhas de outra tabela. CREATE TABLE DEPT (NUMERO NUMBER(2) CONSTRAINT DEPT_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(14) CONSTRAINT DEPT_NOME_NN NOT NULL, LOCAL VARCHAR2(13));

INSERT INTO DEPT (NUMERO, NOME, LOCAL) SELECT NUMERO, NOME, LOCAL FROM DEPARTAMENTOS WHERE LOCAL = RIO;

[R31] Comentrio: Uma outra alternativa seria: CREATE TABLE DEPT AS SELECT NUMERO, NOME, LOCAL FROM DEPARTAMENTOS WHERE LOCAL = RIO;

O Comando UPDATE Exemplo 1: Atualizao da coluna LOCAL. UPDATE DEPARTAMENTOS SET LOCAL = ORLANDO WHERE NUMERO = 40;

Exemplo 2: Atualizao da coluna NOME e da coluna LOCAL. UPDATE DEPARTAMENTOS SET NOME = MARKETING, LOCAL = ORLANDO WHERE NUMERO = 40;

Exemplo 3: Atualizao com subconsulta. UPDATE DEPARTAMENTOS SET LOCAL = FLORIANOPOLIS WHERE NUMERO IN (SELECT NUMERO FROM DEPARTAMENTOS WHERE LOCAL = PORTO ALEGRE);

Exemplo 4: Todas as linhas so atualizadas quando no h a clusula WHERE. UPDATE DEPARTAMENTOS SET LOCAL = ORLANDO;

45

Exemplo 5: Atualizao de chave primria. UPDATE DEPARTAMENTOS SET NUMERO = 70 WHERE NUMERO = 10; UPDATE DEPARTAMENTOS *
ERROR at line 1: ORA-02292: integrity constraint (CARLOS.EMPR_DEPARTAMENTOS_NUMERO_DEPT_FK) violated child record found

Observao: No se pode atualizar a chave primria de uma tabela pai se houver filhos na tabela filho.
[R32] Comentrio: Como fazer? 1.Recuperar os empregados lotados no departamento 10. 2.Armazenar estes numeros de empregados em uma tabela. 3.Alterar para nulo o nmero do departamento onde estes empregados esto lotados. 4.Alterar o nmero do departamento de 10 para 70. 5.Alterar para 70 o nmero do departamentos onde os empregados (slavos) esto lotados. O professor disse que havendo um trigger para fazer a atualizao em cascata est atualizao possvel.

O Comando DELETE Exemplo 1: Apagar o empregado 7788 da tabela de empregados. DELETE FROM EMPREGADOS WHERE NUMERO = 7788;

Exemplo 2: Apagar todos os empregados admitido em dezembro de 1980. DELETE FROM EMPREGADOS WHERE TO_CHAR (DT_ADMISSAO, MM-YY) = 12-90;

Exemplo 3: Apagar todos as linhas da tabela TRABALHAM. SELECT * FROM TRABALHAM; DELETE FROM TRABALHAM; SELECT * FROM TRABALHAM; ROLLBACK; SELECT * FROM TRABALHAM;

46

Exemplo 4: Apagar todos as linhas da tabela TRABALHAM. TRUNCATE TABLE TRABALHAM; ROLLBACK; SELECT * FROM TRABALHAM;

47

CONTROLE DE TRANSAES Uma transao contm: um ou mais comandos DML um comando DDL um comando DCL Uma transao comea quando o primeiro comando SQL executado e termina quando ocorre um dos seguintes eventos: execuo de um comando COMMIT ou ROLLBACK execuo de um comando DDL ou DCL (ocorre um COMMIT automtico Antes e Depois da execuo destes comandos. Logo, mesmo que o comando DDL ou DCL falhe, no ser possvel dar ROLLBACK nos comandos que antecederam este comando.) ocorrncia de certos tipos de erro como, por exemplo, um deadlock (ocorre um ROLLBACK) trmino de uma sesso (se o usurio sai normalmente do SQL*PLUS ocorre um COMMIT) falha na estao (por exemplo, quando se desliga a mquina estando logado no SQL*PLUS) ou no servidor Quando uma transao termina, o prximo comando SQL inicia automaticamente a prxima transao.

Vantagens do COMMIT ou ROLLBACK Garante a consistncia dos dados agrupando operaes logicamente relacionadas. Agrupa os comandos de manipulao logicamente relacionados. Permite que se veja o resultado de manipulaes antes que elas sejam confirmadas.

48

Controlando Transaes Atravs de SavePoints INSERT INTO EMPREGADOS VALUES (7844, 'TUTTI', 'VASQUES', '12222222222', 'VENDEDOR', 7698, '08-SEP-93', 1100, NULL, NULL); INSERT INTO EMPREGADOS VALUES (7900, 'JAMES', 'BOND', '13333333333', 'PORTEIRO', 7698, '03-DEC-93', 950, NULL, 40); SAVEPOINT ABC; UPDATE EMPREGADOS SET SALARIO = SALARIO * 1.5; IF (CONDIO) THEN ROLLBACK TO ABC; ELSE COMMIT END IF Obs: Se um nico comando DML falha durante a execuo de uma transao apenas este comando sofre ROLLBACK. Quanto s demais modificaes caber ao usurio dar COMMIT ou ROLLBACK explicitamente.

O Estado dos Dados antes do Commit ou Rollback Antes do commit os dados so vistos por outros usurios como se no tivessem sofrido nenhuma manipulao. As linhas afetadas so bloqueadas (locked). Outros usurios no podem modificar os dados manipulados uma vez que estes dados encontram-se bloqueados.

O que Acontece aps o Commit As manipulaes efetuadas nos dados so escritas no banco. Os dados anteriores so permanentemente perdidos. Todos os usurios autorizados podem ver os resultados. Todas as linhas bloqueadas so liberadas. Todos os Savepoints so apagados.

O que Acontece aps o Rollback As manipulaes efetuadas nos dados so desfeitas. As linhas bloqueadas so liberadas.
49

Rollbak a Nvel de Comando Se um nico comando DML falha durante sua execuo, somente este comando sofre Rollback. Todas as demais modificaes so provisoriamente mantidas at que um comando Commit ou Rollback seja executado.

50

ALTERANDO TABELAS E CONSTRAINTS

O comando Alter Table lhe permite: Adicionar e modificar colunas de uma tabela. Adicionar e remover constraints. Habilitar e desabilitar constraints.

O comando Drop Table: Remove as linhas e a estrutura de uma tabela.

Outros comandos que afetam uma tabela so: Rename - Para trocar o nome de uma tabela. Truncate - Para remover todas as linhas de uma tabela. Comment - Para adicionar um comentrio sobre um objeto do dicionrio de dados.

Todos os trs comandos acima so comandos DDL. Quando executados causam um COMMIT automtico. Cuidado...

51

Exemplo 1: Adicionando trs colunas tabela de Empregados. Como a tabela de Empregados foi criada: CREATE TABLE EMPREGADOS (NUMERO NUMBER(4) CONSTRAINT EMPREGADOS_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(10), SOBRENOME VARCHAR2(10), CPF CHAR(11) CONSTRAINT EMPREGADOS_CPF_UK UNIQUE, CARGO VARCHAR2(9), NUM_SUPERVISOR NUMBER(4) CONSTRAINT EMP_EMP_NUM_SUPERVISOR_FK REFERENCES EMPREGADOS (NUMERO), DT_ADMISSAO DATE, SALARIO NUMBER(7,2), PERC_COMISSAO NUMBER(4,2) CONSTRAINT EMPREGADOS_PERC_COMISSAO_CK CHECK (PERC_COMISSAO IN (10, 12.5, 15, 17.5, 20)), NUMERO_DEPT NUMBER(2) CONSTRAINT EMPREG_DEPARTAMENTOS_NUMERO_FK REFERENCES DEPARTAMENTOS (NUMERO));

Comando Alter Table: ALTER TABLE EMPREGADOS ADD (RUA VARCHAR2(50), NUM NUMBER(6), COMPLEMENTO VARCHAR2(30));

[R33] Comentrio: Numero j existe.

Regras a serem observadas na utilizao do Alter Table: possvel adicionar e modificar colunas de uma tabela mas no se pode remover uma coluna de uma tabela. A tabela deve ser criada novamente sem a coluna que se deseja remover. No se pode especificar em que posio da tabela voc deseja que a coluna aparea. Ela aparecer no final da tabela, isto , ser a ltima coluna. Ao se criar uma nova coluna em uma tabela s se pode especificar a clusula NOT NULL se a tabela estiver vazia. A largura (preciso) de uma coluna s deve ser diminuda se a coluna s possui valores nulos ou se a tabela se encontra vazia. A modificao de um tipo de dado de uma coluna s deve ser efetuada se a coluna s contm valores nulos. Para converter uma coluna CHAR em VARCHAR2 ou de VARCHAR2 para CHAR a coluna dever estar vazia ou o tamanho no dever ser modificado.
52

[R34] Comentrio: Os valores no sero truncados. Ocorrer um erro.

A modificao do valor Default de uma coluna s afeta as linhas inseridas posteriormente a esta modificao.

Exemplo 2: Modificando o tamanho de uma coluna na tabela de Empregados. ALTER TABLE EMPREGADOS MODIFY (RUA VARCHAR2 (40)); A modificao abaixo ser concluda com sucesso? _____ Porque? _______________________ _____________________________________________________________________________

Exemplo 3: Dropando uma constraint da tabela Trabalham. Passos a serem executados: 1. Descobra o nome da constraint que se deseja dropar acessando a USER_CONSTRAINTS. 2. Digamos que aps voc descobrir os nomes das constraints associadas tabela Trabalham voc ainda estivesse na dvida sobre qual constraint deveria ser dropada. Para voc descobrir a que coluna da tabela Trabalham cada uma das constraints recuperadas acima se referem seria preciso pesquisar a viso do dicionrio de dados USER_CONS_COLUMNS 3. Execute o comando abaixo para dropar a constraint desejada: ALTER TABLE TRABALHAM DROP CONSTRAINT NOME_DA_CONSTRAINT;
[R35] Comentrio: SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'TRABALHAM'; [R36] Comentrio: SELECT UC.CONSTRAINT_NAME, UC.CONSTRAINT_TYPE, UCC.COLUMN_NAME FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME AND UC.TABLE_NAME = 'TRABALHAM';

Exemplo 4: Criando uma Constraint. ALTER TABLE TRABALHAM ADD CONSTRAINT NOME_DA_CONSTRAINT FOREIGN KEY (NUMERO_PROJ) REFERENCES PROJETOS (NUMERO);

Exemplo 5: Coma dropar uma constraint de primary key forando a remoo da respectiva constraint de foreign key. ALTER TABLE PROJETOS DROP CONSTRAINT PROJETOS_NUMBER_PK CASCADE; OU ALTER TABLE PROJETOS DROP PRIMARY KEY CASCADE;

53

Exemplo 5: Como habilitar e desabilitar constraints. Digamos que voc deseja remover a coluna DT_FIM da tabela de Projetos. Como voc j sabe no h como fazer isto atravs do comando ALTER TABLE. preciso remover a tabela e recri-la sem esta coluna. Siga os passos a seguir: 1. Em primeiro lugar salve os dados da tabela Projetos. CREATE TABLE PROJETO_AUX AS SELECT NUMERO, NOME, DT_INICIO FROM PROJETOS; 2. Agora tente Dropar a tabela de Projetos. Conseguiu? ____ A menssagem ORA-02266: unique/primary keys in table referenced by enabled foreign keys dever ter aparecido. A foreign key a que a menssagem se refere a foreign key da tabela Trabalham. Veja, a seguir, o comando de criao desta tabela: CREATE TABLE TRABALHAM (NUMERO_EMP NUMBER(4) CONSTRAINT TRABALHAM_EMPREGADOS_NUMERO_FK REFERENCES EMPREGADOS (NUMERO), NUMERO_PROJ NUMBER(2) CONSTRAINT TRABALHAM_PROJETOS_NUMERO_FK REFERENCES PROJETOS (NUMERO), CONSTRAINT TRABALHAM_PK PRIMARY KEY(NUMERO_EMP, NUMERO_PROJ)); 3. Para que possamos apagar a tabela Projetos ser preciso desabilitar a constraint que est provocando este erro, isto , a constraint TRABALHAM_PROJETOS_NUMERO_FK. ALTER TABLE TRABALHAM DISABLE CONSTRAINT TRABALHAM_PROJETOS_NUMERO_FK; 4. Agora podemos dropar a tabela Projetos. DROP TABLE PROJETOS;

[R37] Comentrio: No funcionou. Ao dropar a tabela Projetos (passo 4) o SGBD reclama como se houvesse outra constraint habilitada.

54

5. Recrie a tabela Projetos sem a coluna DT_FIM. CREATE TABLE PROJETOS (NUMERO NUMBER(2) CONSTRAINT PROJETOS_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(14), DT_INICIO DATE); 6. Copie os dados da tabela PROJETO_AUX para a tabela PROJETO. INSERT INTO PROJETOS SELECT * FROM PROJETO_AUX; 7. E, finalmente, reabilite a constraint TRABALHAM_PROJETOS_NUMERO_FK. ALTER TABLE ENABLE CONSTRAINT TRABALHAM_PROJETOS_NUMERO_FK;

Exemplo 6: Como dropar uma tabela e as constraints que dela dependam. DROP TABLE PROJETOS CASCADE CONSTRAINTS; Observao: Esta uma alternativa para os itens 3 e 4 do exemplo 5. Neste caso seria necessrio recriar as constraints dropadas com o cascade.
[R38] Comentrio: Todos os dados so deletados. A transao corrente comitada. Todos os ndices so dropados. Todas as constraints relacionadas so dropadas. No possvel rollbecar este comando. [R39] Comentrio: preciso ter direitos sobre o objeto renomeado e sobre os demais afetados.

Exemplo 7: Como renomear uma tabela, uma viso, uma seqncia ou um sinnimo. RENAME PROJETOS TO PROJ;

55

SEQNCIAS

Para que servem as seqncias: So utilizadas na gerao de nmeros nicos para a funo de chaves primrias. Uma seqncia um objeto que pode ser compartilhado. Quando mantidas na memria aumentam a performance das aplicaes.

Exemplo 1: Criao de uma seqncia para ser utilizada na gerao de valores de chave primria para a tabela de departamentos. CREATE SEQUENCE S_DEPARTAMENTOS_NUMERO INCREMENT BY 1 START WITH 41 MAXVALUE 99 NOCACHE NOCYCLE;

[R40] Comentrio: O default 1. [R41] Comentrio: O default 1. [R42] Comentrio: Por default o valor mximo 10 elevado a 27.

Exemplo 2: Utilizao da seqncia na insero de uma linha na tabela de departamentos. INSERT INTO DEPARTAMENTOS (NUMERO, NOME, LOCAL) VALUES (S_DEPARTAMENTOS_NUMERO.NEXTVAL, CONTABILIDADE, NITEROI);

[R43] Comentrio: O default CACHE 20. Posso escrever CACHE 100, por exemplo. Se no quero o cache escrevo NOCACHE. [R44] Comentrio: O default NOCYCLE. A outra opo CYCLE.

Observaes: A opo CYCLE no deve ser utilizada se a seqncia ser utilizada para gerar valores de chave primria. Com a opo CACHE possvel pedir para o Oracle manter na memria uma certa quantidade de valores da seqncia que, quando solicitados, sero buscados na memria e no no disco. Intervalos na seqncia podem ocorrer quando: Ocorre um Rollback Ocorre um crash no sistema A seqncia utilizada em mais de uma tabela Para se saber que valor da seqncia foi utilizado no mais recente Insert em Departamentos devese utilizar S_DEPARTAMENTOS.CURRVAL.

[R45] Comentrio: O default CACHE 20

[R46] Comentrio: Observe que uma sequencia no tem qq vncula com tabela nenhuma. [R47] Comentrio: Digamos que insiro um departamento na tabela de departamentos e, em seguida, desejo inserir os empregados lotados naquele departamento. Como saber que valor informar na chave estrangeira NUMERO_DEPT em empregados?

56

Exemplo 3: Utilizao de CURRVAL na insero de um empregado. INSERT INTO EMPREGADOS(NUMERO, NOME, SOBRENOME, CPF, CARGO, NUM_SUPERVISOR, DT_ADMISSAO, SALARIO, PERC_COMISSAO, NUMERO_DEPT) VALUES (7567, 'VINICIUS', 'AGUIAR', '84630817492', 'VENDEDOR', 7566, '10-JAN-92', 1200, 10, S_DEPARTAMENTOS_NUMERO.CURRVAL); Exemplo 4: Criao de uma seqncia utilizando todos os defaults. CREATE SEQUENCE ABC;
[R48] Comentrio: Acho que isso para saber se a sequencia ascendente ou descendente. [R49] Comentrio: Quando se cria uma sequence sem cache (NOCACHE), cache size igual a zero. [R50] Comentrio: Indica o prximo nmero a ser utilizado quando os nmeros do cache acabarem. [R51] Comentrio: SELECT S_DEPARTAMENTOS_NOME.C URRVAL FROM SYS.DUAL; [R52] Comentrio: DELETE FROM EMPREGADOS WHERE NUMERO_DEPT = (SELECT NUMERO FROM DEPARTAMENTOS

Como consultar os dados de uma seqncia no dicionrio de dados: Desc USER_SEQUENCES

Name ------------------------------SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG CACHE_SIZE LAST_NUMBER

Null? --------------NOT NULL NUMBER NOT NULL

Type -------------------VARCHAR2(30) NUMBER NUMBER VARCHAR2(1) VARCHAR2(1) NUMBER NUMBER

NOT NULL NOT NULL

Regras a respeito da utilizao de NEXTVAL e CURRVAL Onde possvel utilizar NEXTVAL e CURRVAL: Em um comando SELECT que no seja parte de uma sub-query. Em um comando SELECT, sub-query de um INSERT. Na clusula VALUE de um INSERT. Na clusula SET de um UPDATE. Quando no possvel utilizar NEXTVAL e CURRVAL: Em um SELECT de uma VIEW. Em um comando SELECT com a palavra-chave DISTICT Em um comando SELECT com as clusulas GROUP BY, HAVING E ORDER BY. Em uma subquery em um comando SELECT, DELETE ou UPDATE. Em uma expresso DEFAULT no comando CREATE TABLE ou ALTER TABLE.

WHERE LOCAL = RIO; UPDATE EMPREGADOS SET NUMERO = (SELECT S_DEPARTAMENTOS_NOME. NEXTVAL FROM SYS.DUAL) INVLIDO. Vlido sem subquery. WHERE NUMERO = (SELECT NUMERO FROM EMPREGADOS WHERE CARGO = FAXINEIRO) Sequencia na subquery no VLIDO. [R53] Comentrio: CREATE TABLE TESTE (N1 NUMBER(3), N2 NUMBER(3) DEFAULT 3);

57

Como modificar uma seqncia Exemplo 4: Modificao de uma seqncia atravs do comando ALTER SEQUENCE. ALTER SEQUENCE S_DEPARTAMENTOS_NUMERO INCREMENT BY n MAXVALUE n ou NOMAXVALUE MINVALUE n ou NOMINVALUE CYCLE ou NOCYCLE CACHE n ou NOCACHE;

[R54] Comentrio: Note que no possvel mexer no START WITH. preciso dropar a sequence e recri-la.

Observao: Para se poder alterar uma seqncia preciso ser o OWNER da seqncia ou ter o privilgio de ALTER para a seqncia.

Como remover uma seqncia Exemplo 5: Como remover a seqncia S_DEPARTAMENTOS_NUMERO. DROP SEQUENCE S_DEPARTAMENTOS_NUMERO;

58

VISES

O que uma viso: Uma viso (VIEW) uma tabela virtual baseada em tabelas base ou em outras vises.

Vantagens na Utilizao de Vises: Restringem o acesso aos dados (linhas e colunas); Fazem com os usurios tenham que implementar queries mais simples. Pode-se utilizar uma viso para gerar um dado derivado, inexistente na tabela base. Provem independncia de dados. Uma viso pode ser utilizada para recuperar dados de mais de uma tabela. Podem ser utilizadas na definio de grupos de usurios com direitos de acesso comuns. Cada grupo de usurios teria acesso a determinadas vises.

Como criar uma Viso: Exemplo 1: Sintaxe quase completa. CREATE [OR REPLACE] [FORCE] VIEW Nome_da_View AS Sub-query [WITH CHECK OPTION [CONSTRAINT NAME]] [WITH READ ONLY]
[R55] Comentrio: Se um usurio possui privilgio de objeto sobre uma view que lhe permita alterar a view, ele no precisar drop-la para efetuar a alterao. At porque ele precisar Ter o privilgio de sistema CREATE VIEW para poder recri-la. [R56] Comentrio: Cria a view mesmo que a tabela base no exista. [R57] Comentrio: With check option s permite atualizao se a view continuar a enxergar o dado aps a atualizao. Esta constraint pode ter um nome. [R58] Comentrio: Garante que nenhuma operao DML ser executada sobre esta view.

Exemplo 2: Criao de uma viso sobre a tabela de empregados. CREATE VIEW V_EMPREGADOS AS SELECT NUMERO, NOME, SOBRENOME FROM EMPREGADOS WHERE NUMERO_DEPT = 10;

59

Como utilizar uma viso: Exemplo 3: Utilizao da viso V_EMPREGADOS. SELECT * FROM V_EMPREGADOS; NUMERO -----------7839 7566 7698 7654 7876 NOME ---------------INGO TERESA CHICO MARTA SEBASTIAN SOBRENOME ---------HOFFMANN AGUIAR SERRA ROCHA COAL

[R59] Comentrio: Isso ficiu na pgina anterior na verso anterior.

Exemplo 4: Criao de uma viso com a utilizao de alias. CREATE OR REPLACE VIEW V_EMPREGADOS AS SELECT NUMERO CODIGO, NOME || || SOBRENOME NOME FROM EMPREGADOS WHERE NUMERO_DEPT = 10;

Exemplo 5: Criao de uma viso com a utilizao de alias. CREATE OR REPLACE VIEW V_EMPREGADOS (CODIGO, NOME) AS SELECT NUMERO, NOME || || SOBRENOME FROM EMPREGADOS WHERE NUMERO_DEPT = 10; Vises Complexas: Exemplo 1: Criao de uma viso sobre a tabela de empregados. CREATE VIEW V_DEPT_SALARIO (NOME, MENOR_SAL, MAIOR_SAL, MEDIA) AS SELECT D.NOME, MIN(E.SALARIO), MAX(E.SALARIO), AVG(E.SALARIO) FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO GROUP BY D.NOME;

[R60] Comentrio: Fazem a mesma coisa.

60

Regras relativas utilizao de comandos DML sobre vises: possvel emitir comandos DML contra vises baseadas em uma nica tabela, exceto nos casos abaixo: No se pode remover uma linha de uma viso se ela contm: Funes de grupo. A clusula Group by. O comando Distinct. No se pode atualizar dados de uma viso se ela contm: Qualquer das condies acima. Colunas definidas por expresses. A pseudocoluna ROWNUM. No se pode adicionar dados a uma viso se: A viso contm qualquer das condies acima. A viso no contm uma coluna NOT NULL da tabela sobre a qual se baseia. possvel emitir comandos DML contra vises baseadas em mais de uma tabela quando: As linhas que se pretende excluir, pertencem tabela cuja chave primria preservada na viso. As colunas que se pretende alterar ou incluir pertencem tabela cuja chave primria preservada na viso.

[R61] Comentrio: Exemplo: salario * 12 [R62] Comentrio: Invertigar o que isso.

Restries de integridade em vises atualizveis As restries de Integridade especificadas para tabelas base so automaticamente garantidas independentemente da aplicao trabalhar diretamente com estas tabelas ou com vises atualizveis. Opcionalmente, pode-se definir uma viso atualizvel com uma restrio de integridade do tipo CHECK. Quando este tipo de restrio de integridade utilizada, o Oracle permite que linhas sejam inseridas ou atualizadas atravs da viso apenas se a viso puder acess-las aps a insero ou atualizao.

61

Exemplo de utilizao da clausula WITH CHECK OPTION: Exemplo 1: Criao da viso V_EMP_DEPT_20 com a clusula WITH CHECK OPTION. CREATE OR REPLACE VIEW V_Emp_Dept_20 AS SELECT NUMERO, NOME, NUMERO_DEPT FROM EMPREGADOS WHERE NUMERO_DEPT = 20 WITH CHECK OPTION CONSTRAINT V_EMP_DEPT_20_WCO;

Exemplo 2: Exemplo de violoo da constraint WITH CHECK OPTION. UPDATE V_EMP_DEPT_20 SET NUMERO_DEPT = 30 WHERE NUMERO_DEPT = 20; UPDATE V_EMP_DEPT_20 ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation

[R63] Comentrio: Uma View s pode Ter uma constraint WITH CHECK OPTION da no ser importante o nome da constraint.

Exemplos de utilizao da clausula WITH READ ONLY: Exemplo 1: Criao da viso V_EMP_DEPT_20 com a clusula WITH READ ONLY. CREATE OR REPLACE VIEW V_Emp_Dept_20 AS SELECT NUMERO, NOME, NUMERO_DEPT FROM EMPREGADOS WHERE NUMERO_DEPT = 20 WITH READ ONLY CONSTRAINT V_EMP_DEPT_20_WRO;

Exemplo 2: Exemplo de violoo da constraint WITH READ ONLY. UPDATE V_EMP_DEPT_20 SET NOME = SILVIO WHERE NUMERO = 42; SET NOME = 'SILVIO' * ERROR at line 2: ORA-01733: virtual column not allowed here
[R64] Comentrio: Est indicando que uma coluna desta view no pode ser atualizada.

62

Como consultar vises no dicionrio de dados: Consultar a tabela do dicionrio de dados USER_VIEWS Desc USER_VIEWS Name ----------------------VIEW_NAME TEXT_LENGTH TEXT Null? --------------NOT NULL Type --------------------VARCHAR2(30) NUMBER LONG

[R65] Comentrio: Nmero de caracteres que compem o texto da view. [R66] Comentrio: Texto da View. Definio.

Exemplo 1: Para recuperar a definio da viso V_EMP_DEPT_20. SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = V_EMP_DEPT_20; TEXT -------------------------------------------------------------------------------SELECT NUMERO, NOME, NUMERO_DEPT FROM EMPREGADOS WHERE NUMERO_DEPT = 20 WITH READ ONLY CONSTRAINT V_EMP_DEPT_20_WRO;

Como apagar uma viso: Exemplo 1: Para apagar a viso V_EMP_DEPT_20. DROP VIEW V_EMP_DEPT_20;

63

NDICES

O servidor Oracle 7 utiliza, por default, uma estrutura de rvore balanceada (B*Tree) para ndices. Esta estrutura de ndice garante que o acesso a qualquer linha de uma tabela leve aproximadamente o mesmo tempo independentemente da posio da linha na tabela.

Exemplo:
1 2 3 4 5 6 7 8 BETO GILBERTO LAURA NAIR NELSON SERGIO UBALDO VERA

GILBERTO NAIR

BETO GILBERTO

LAURA NAIR NEL NELSON SERGIO UBALDO VERA

ROWID

...
SERGIO VERA

Cada linha da base de dados possui um nmero identificador denominado ROWID que uma composio do nmero do arquivo, do bloco e da linha onde se encontra a linha da tabela desejada.

Exemplo: SELECT ROWID, NUMERO, CPF, NOME FROM EMPREGADOS; 00000099.0000.0002 00000099.0001.0002 00000099.0002.0002 00000099.0003.0002 (Bloco.Linha.Arquivo) 7839 7566 7698 7782 11111111111 22222222222 33333333333 44444444444 INGO TERESA CHICO CELIO

Tipos de ndices
64

B-Tree nico No nico Clusterizado Index Cluster Hash Cluster Bitmap

Regras Gerais para a Criao de ndices adequada a criao de ndices quando: A coluna frequentemente utilizada na clusula Where das queries. A coluna possui um grande nmero de valores diferentes. A coluna possui muitos valores nulos. A tabela grande e a maioria das queries recuperam em torno de 2 a 4% das linhas.

[R67] Comentrio: gerado um ndice do tipo B-Tree para indexar a cluster key. J no tipo Hash aplicada uma funo para encontrar o endereo do bloco onde devem estar os dados. Index Cluster no muito utilizado. Quando se deseja uma performance muito alta em queries procurando dados atravs da igualdade (e no por faixa de valores) se utiliza o hash cluster. Em um nico I/O o bloco do disco onde esto os dados, com aquele cluster index, lido. Exemplo: Pedidos com seus itens. Por outro lado, um ndice B-Tree deve ser utilizado qundo estamos pesquisando dados por faixa de valores. [R68] Comentrio: No so tratados neste curso. O Hash cluster serve para reduzir I/O atravs do uso de uma funo que determina o endereo do bloco onde as linhas que possuem a mesma Hash Key devem ser encontradas. No eficiente se o nmero de linhas para cada Hash Key muito varivel. Indices do tipo Bitmap so utilizados em colunas que possuem poucos valores distintos (Coluna Estado no cadastro de clientes). So tipicamente utilizados apenas em sistemas de suporte a deciso e datawarehouse, isto , em sistemas que manipulam volumes de dados gigantescos. Tabelas organizadas por ndice devem ter uma chave primria que serve de ndice para a estrutura. So apropriados apenas para aplicaes que manipulam dados complexos ou no estruturados. Ver pg 42 do livro: Oracle8 Architecture.

No adequada a criao de ndices quando: A tabela pequena. As colunas no so utilizadas como condies em queries. A maioria das queries recuperam mais de 2 a 4% das linhas. A tabela atualizada frequentemente. Cuidado: Uma maior quantidade de ndices nem sempre aumenta o desempenho do banco. Como criar ndices: Um ndice criado automaticamente quando se define uma constraint: PRIMARY KEY, ou UNIQUE. Manualmente, um ndice pode ser criado com o comando CREATE INDEX.

Exemplo 1: Como criar um ndice nico. CREATE UNIQUE INDEX EMPREGADOS_NOME_IDX ON EMPREGADOS (NOME); Exemplo 2: Como criar um ndice no nico. CREATE INDEX EMPREGADOS_NOME_IDX ON EMPREGADOS (NOME); Exemplo 3: Como criar um ndice do tipo cluster. (Index Cluster)
65

[R69] Comentrio: Note que a constraint Foreign Key no cria ndice.

1. Cria-se o Cluster CREATE CLUSTER CLUSTER_EMPREGADOS (NUM_DEP NUMBER(2)); 2. Cria-se o ndice CREATE INDEX I_CLU_EMPREGADOS_NUMERO_DEPT ON CLUSTER CLUSTER_EMPREGADOS; 3. Cria-se uma ou mais tabelas no cluster CREATE TABLE EMPREGADOS_AUX (NUMERO NUMBER(4) CONSTRAINT EMPREGADOS_AUX_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(10), SALARIO NUMBER(7,2), NUMERO_DEPT NUMBER(2) CONSTRAINT EMPREG_AUX_DEP_NUMERO_FK REFERENCES DEPARTAMENTOS (NUMERO)) CLUSTER CLUSTER_EMPREGADOS (NUMERO_DEPT); 4. Inserem-se os dados na tabela. INSERT INTO EMPREGADOS_AUX VALUES(1111, 'CARLOS', 1000, 10); INSERT INTO EMPREGADOS_AUX VALUES(2222, 'JOSE', 2000, 20); INSERT INTO EMPREGADOS_AUX VALUES(3333, 'SILVIA', 3000, 10); SELECT * FROM EMPREGADOS_AUX;

NUMERO -----------1111 3333 2222

NOME ----------CARLOS SILVIA JOSE

SALARIO -----------1000 3000 2000

NUMERO_DEPT ---------------------10 10 20

[R70] Comentrio: Observe que os dados so armazenados fisicamente na ordem da cluster key e no na ordem de insero.

66

Observaes: A tabela Empregados_Aux ocupar a rea em disco reservada para o cluster. Fisicamente, as linhas da tabela de Empregados ficaro ordenadas pela coluna Numero_dept. Um ndice do tipo cluster prov acesso mais rpido a multiplos registros com o mesmo valor para a cluster key. Selects, Updates e Deletes so mais rpidos. Inseres so um pouco mais lentas do que em uma tabela normal. Uma tabela s pode ter um ndice do tipo cluster uma vez que os dados so fisicamente ordenados pela cluster key.

Como consultar ndices no dicionrio de dados: Na viso USER_INDEXES pode-se verificar se determinado ndice do tipo unique. E na viso USER_IND_COLUMNS encontra-se, para cada ndice, o nome da tabela e os nomes das colunas.

Desc USER_INDEXES Name ----------------------INDEX_NAME TABLE_OWNER TABLE_NAME TABLE_TYPE UNIQUENESS Null? --------------NOT NULL NOT NULL NOT NULL Type --------------------VARCHAR2(30) VARCHAR2(30) VARCHAR2(30) VARCHAR2(11) VARCHAR2(9)

...
Desc USER_IND_COLUMNS Name ----------------------INDEX_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH Null? --------------NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL Type --------------------VARCHAR2(30) VARCHAR2(30) VARCHAR2(30) NUMBER NUMBER

67

Exemplo 1: Para se recuperar detalhes sobre os ndices que existem para a tabela de departamentos. SELECT UI.INDEX_NAME, UI.TABLE_NAME, UI.TABLE_TYPE, UI.UNIQUENESS, UIC.COLUMN_NAME, UIC.COLUMN_POSITION, UIC.COLUMN_LENGTH FROM USER_INDEXES UI, USER_IND_COLUMNS UIC WHERE UI.INDEX_NAME = UIC.INDEX_NAME AND UI.TABLE_NAME = DEPARTAMENTOS; Resultado: INDEX_NAME TABLE_NAME TABLE_TYPE UNIQUENES COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH Como apagar um ndice: Exemplo 1: Para apagar o ndice DEPARTAMENTOS_NUMERO_PK. DROP INDEX DEPARTAMENTOS_NUMERO_PK;
[R71] Comentrio: Observe que o ndice possui o nome da constraint que lhe deu origem. NOTE QUE SE VOC APAGAR A CONSTRAINT QUE CRIOU O NDICE O NDICE TAMBM SER APAGADO.

DEPARTAMENTOS_NUMERO_PK DEPARTAMENTOS TABLE UNIQUE NUMERO 1 22

Caso o ndice seja utilizado para garantir uma chave primria ou coluna nica ocorrer o seguinte erro: ORA-02429: cannot drop index used for enforcement of unique/primary key Neste caso, para apagar o ndice preciso apagar a constraint correspondente: ALTER TABLE DEPARTAMENTOS DROP CONSTRAINT DEPARTAMENTOS_NUMERO_PK CASCADE;

68

CONTROLANDO O ACESSO DOS USURIOS AO BANCO DE DADOS

Privilgio: o direito de executar um comando SQL especfico. Os usurios necessitam de privilgios de Sistema para poderem se conectar a um banco de dados e privilgios de objetos para poderem manipular o contedo de objetos no banco de dados. Os usurios tambm podem receber o privilgio de conceder privilgios a outros usurios ou a roles (grupos de privilgios com um nome). Schema: uma coleo de objetos, tais como tabelas, ndices, vises, etc. Um schema sempre possui um Owner (um usurio do banco de dados) e possui o mesmo nome do usurio. Tipos de Privilgios Privilgios de Sistema Privilgios de Objetos

Exemplos de Privilgios de Sistema: Create Session Create User Create Table Create Index Drop User Drop Any Table Backup Any Table Uma das tarefas que um DBA deve executar a criao dos usurios do banco. No basta apenas criar os usurios. preciso, aps a criao, atribuir direitos a estes usurios. Exemplo 1: Criao de um usurio e a atribuio de alguns privilgios de sistema. CREATE USER JULIO IDENTIFIED BY SENHA; GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, SELECT ANY TABLE TO JULIO;

[R72] Comentrio: ALTER USER ALUNO4 QUOTA 10 M ON ROLLBACK_DATA QUOTA 20 K ON SYSTEM QUOTA 40 M ON TEMPORARY_DATA QUOTA UNLIMITED ON USER_DATA; REVOKE UNLIMITED TABLESPACE FROM ALUNO4;

69

Exemplo 2: Como um usurio autorizado pode conceder a JULIO privilgios de objeto sobre a tabela de DEPARTAMENTOS do usurio CARLOS: GRANT SELECT ON CARLOS.DEPARTAMENTOS TO ALUNO; GRANT ALTER ON CARLOS.DEPARTAMENTOS TO JULIO; GRANT INDEX ON CARLOS.DEPARTAMENTOS TO JULIO; GRANT REFERENCES ON CARLOS.DEPARTAMENTOS TO JULIO; GRANT INSERT ON CARLOS.DEPARTAMENTOS TO JULIO WITH GRANT OPTION; GRANT DELETE ON CARLOS.DEPARTAMENTOS TO JULIO; GRANT UPDATE ON CARLOS.DEPARTAMENTOS TO JULIO;

[R73] Comentrio: Privilgios de objeto podem ser sobre: Tabelas Indices Prcedures e Functions Sequences Views Snapshots Sinonimos

[R74] Comentrio: Se um usurio A atribui a um usurio B um privilgio de objeto, com a clusula With Grant Option, o usurio B ter o direito de atribuir a um usurio C este privilgio de objeto. Com a clusula With Admin Option possvel fazer o mesmo, no entanto, para privilgios de sistema. [R75] Comentrio: Privilgios de objeto podem ser sobre: Tabelas Indices Prcedures e Functions Sequences Views Snapshots Sinonimos [R76] Comentrio: No possvel atribuir privilgio de select sobre determinadas colunas. Para isto ser feito preciso definir views.

Exemplo 3: Como um usurio autorizado pode conceder a JULIO privilgios de objeto sobre colunas da tabela de DEPARTAMENTOS do usurio CARLOS: GRANT INSERT (NUMERO, NOME) ON CARLOS.DEPARTAMENTOS TO JULIO; GRANT UPDATE (NUMERO, NOME) ON CARLOS.DEPARTAMENTOS TO JULIO;

Exemplo 4: Concedendo o privilgio de EXECUTE sobre a Procedure ALTERA_CARGO: GRANT EXECUTE ON CARLOS.ALTERA_CARGO TO JULIO;

Exemplo 5: Concedendo privilgios para Alterar e Utilizar uma SEQUENCE: GRANT ALTER ON CARLOS.S_DEPARTAMENTOS_NOME TO JULIO; GRANT SELECT ON CARLOS.S_DEPARTAMENTOS_NOME TO JULIO;

Exemplo 6: Concedendo privilgios sobre vises: GRANT DELETE ON CARLOS.V_EMP_DEPT_20 TO JULIO; GRANT INSERT ON CARLOS.V_EMP_DEPT_20 TO JULIO; GRANT SELECT ON CARLOS.V_EMP_DEPT_20 TO JULIO; GRANT UPDATE ON CARLOS.V_EMP_DEPT_20 TO JULIO;

Exemplo 7: Como remover privilgios de objeto e de sistema. REVOKE DELETE ON CARLOS.DEPARTAMENTOS FROM JULIO; REVOKE CONNECT FROM JULIO;

70

Como consultar, no dicionrio de dados, quais os privilgios de sistema e de objetos foram concedidos a um usurio: Os privilgios de sistema devem ser consultados na viso DBA_SYS_PRIVS. Os privilgios de objeto devem ser consultados na viso DBA_TAB_PRIVS. Desc DBA_SYS_PRIVS Name ----------------------GRANTEE PRIVILEGE ADMIN_OPTION Null? --------------NOT NULL NOT NULL Type --------------------VARCHAR2(30) VARCHAR2(40) VARCHAR2(3)

Exemplo 1: Para se recuperar os privilgios de sistema concedidos ao usurio Jlio. SELECT GRANTEE, PRIVILEGE FROM SYS.DBA_SYS_PRIVS WHERE GRANTEE = JULIO; Esta viso (DBA_SYS_PRIVS) mostra que usurios e roles receberam privilgios de sistema. Desc DBA_TAB_PRIVS Name ----------------------GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE Null? --------------NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL Type --------------------VARCHAR2(30) VARCHAR2(30) VARCHAR2(30) VARCHAR2(30) VARCHAR2(40) VARCHAR2(3)

Exemplo 2: Para se recuperar os privilgios de objeto concedidos ao usurio Jlio. SELECT OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE FROM DBA_TAB_PRIVS WHERE GRANTEE = 'JULIO';

Outras Vises Disponveis para o DBA DBA_TAB_PRIVS DBA_COL_PRIVS Descrio Todos os privilgios em objetos do banco Todos os privilgios em colunas de tabelas do banco

[R77] Comentrio: Qualquer objeto e no apenas privilgios concedidos sobre tabelas.

71

Vises de Privilgios de Objetos Disponveis para os Usurios USER_TAB_PRIVS USER_COL_PRIVS TABLE_PRIVILEGES COLUMN_PRIVILEGES

Descrio Privilgios em objetos dos quais o usurio Grantor ou Grantee. Privilgios em colunas das quais o usurio Grantor ou Grantee. Privilgios em objetos dos quais o usurio Grantor, Grantee, ou o grupo PUBLIC Grantee. Privilgios em colunas das quais o usurio Grantor, Grantee ou o grupo PUBLIC Grantee.

Owner, Owner, Owner, Owner,

72

Gerenciando Roles Para facilitar a gerncia de concesso de privilgios deve-se atribuir privilgios a perfis (ROLES) e, ento, designar estes perfis a usurios. Um perfil contm um certo nmero de privilgios relacionados. Pode-se criar: Perfis de Funo, e, Perfis de Aplicao

Por exemplo, um usurio desenvolvedor de aplicaes poderia ter o perfil de DESENVOLVEDOR que teria os seguintes privilgios, por exemplo: CREATE CREATE CREATE CREATE CREATE CREATE SESSION TABLE CLUSTER VIEW PROCEDURE TRIGGER

J os usurios finais da aplicao de folha de pagamento poderiam ter a eles associado o perfil FOLHAPGTO que teria os seguintes privilgios: CREATE SESSION EXECUTE sobre as procedures e functions necessrias aplicao.

Utilizao de Role com Password Exemplo 1: Como criar e utilizar um role que necessita de password para ser habilitado CREATE ROLE folhapgto IDENTIFIED BY senha GRANT privilegios TO folhapgto No incio da execuo da aplicao, para fechar o interruptor: SET ROLE folhapgto IDENTIFIED BY senha No final da execuo da aplicao para reabrir o interruptor: SET ROLE ALL Desabilita todos os Roles da sesso atual. SET ROLE folhapgto Desabilita um Role especfico.

73

SQL> CREATE USER NOVO IDENTIFIED BY TIGER; SQL> GRANT CREATE TABLE, CREATE SEQUENCE, CREATE VIEW TO NOVO; SQL> CREATE ROLE manager; Role created. SQL> GRANT CREATE TABLE, CREATE VIEW TO MANAGER; Grant succeeded. Agora que nossa ROLE j tem os privilgios definidos, no exemplo abaixo vou pass-la para algum usurio. No caso o usurio "NOVO" est recebendo os GRANTS da ROLE MANAGER, que so somente criar tabela e view SQL> GRANT MANAGER TO NOVO; Grant succeeded Como mudar a senha de um usurio: no caso estamos mudando do user novo que tinha como senha TIGER ou seja IDENTIFIED igual a TIGER passa a ser LION. SQL> ALTER USER NOVO IDENTIFIED BY LION; User altered. Roles que j vem de fbrica CONNECT RESOURCE DBA EXP_FULL_DATABASE IMP_FULL_DATABASE

Como saber quais privilgios de sistema foram atribudos s roles acima: Exemplo: Para se recuperar os privilgios de sistema concedidos role CONNECT. SELECT GRANTEE, PRIVILEGE FROM SYS.DBA_SYS_PRIVS WHERE GRANTEE = CONNECT; Role CONNECT ALTER SESSION CREATE CLUSTER CREATE DATABASE LINK CREATE SEQUENCE CREATE SESSION
74

CREATE SYNONYM CREATE TABLE CREATE VIEW Role RESOURCE CREATE CREATE CREATE CREATE CREATE CLUSTER PROCEDURE SEQUENCE TABLE TRIGGER

Role EXP_FULL_DATABASE BACKUP ANY TABLE SELECT ANY TABLE Role IMP_FULL_DATABASE 40 Direitos diferentes Role DBA 77 Direitos diferentes Informaes sobre Roles no Dicionrio de Dados

Tabela do Dicionrio de Dados ROLE_SYS_PRIVS ROLE_TAB_PRIVS USER_ROLE_PRIVS SESSION_ROLES USER_ROLE_PRIVS DBA_SYS_PRIVS DBA_ROLES

Descrio Privilgios de Sistema atribudos a ROLES Privilgios em tabelas atribudos a ROLES ROLES que podem ser acessados pelo usurio Privilgios habilitados que o usurio possui correntemente. ROLES atribudos ao usurio. Privilgios de sistema atribudos a usurios e a ROLES. Todos os ROLES que existem no banco de dados.

Roles Associadas ao Sistema Operacional SYSOPER SYSDBA

O Role SYSOPER permite ao usurio executar:

75

STARTUP SHUTDOWN ALTER DATABASE OPEN/MOUNT ALTER DATABASE BACKUP CONTROLFILE ETC. O Role SYSDBA contm: Todos os privilgios de sistema, e, Todos os privilgios de SYSOPER. Apenas o ROLE SYSDBA permite a execuo de CREATE DATABASE.

76

LISTAS DE EXERCCIOS

77

LISTA N 1

1. possvel emitir um comando Select com a clusula Order By mencionando uma coluna que no consta da lista de colunas mencionadas no Select?

2. Indique os 4 erros existentes no comando abaixo: SELECT Numero, Nome, Salario x 12 Salrio Anual FROM Empregados WHERE Sal > 1500 AND Dt_Admissao LIKE %91;

3. Escreva uma conulta para recuperar, da tabela de empregados, os seguintes dados: Numero, nome e departamento de todos os empregados lotados no departamento n 10. Salve a query no arquivo Exerc_01.sql.

4. Carregue o arquivo Exerc_01.sql no buffer do SQL*Plus. Modifique a query no sentido de alterar os cabealhos das colunas conforme vem abaixo: Cdigo --------111 222 Empregado Departamento --------------------- -----------------SILVIO LUIS 10 CLAUDIA LINS 20

5. Modifique a query acima para que ela exiba o resultado ordenado descendentemente pelo nmero do empregado.

6. Escreva uma query para recuperar o nome, sobrenome e nmero do departamento dos empregados lotados nos departamentos 10 e 30. O resultado dever estar em ordem ascendente de sobrenome. As colunas nome e sobrenome devero ser apresentadas como se fossem uma nica coluna. Atribua a esta coluna (resultante da concatenao de nome e sobrenome) o cabealho Nome do Empregado.

7. Escreva uma query para exibir o nome, sobrenome e salrio de todos os empregados cujo sobrenome contem um "S".

8. Escreva uma query para listar o nmero, nome, cargo, data de admisso e nmero do departamento de todos os vendedores contratados em fevereiro de 91 e de todos os vendedores que atualmente no esto lotados em nenhum departamento.
78

LISTA N 2

1. Qual o nome da funo que retorna a data do sistema?

2. Selecione, da tabela de empregados, o nome, sobrenome e salario acrescido de 13,7% e expresso como um nmero inteiro.

3. Escreva uma query para recuperar o nome e sobrenome dos empregados seguidos do cargo que ocupam entre parentesis. Devem ser recuperados apenas os empregados que ocupam os seguintes cargos: PRESIDENTE e GERENTE. Essas informaes devem ser listadas conforme vem abaixo: Nome e Cargo ------------------------------------------------INGO HOFFMANN (PRESIDENTE) TERESA AGUIAR (GERENTE) CHICO SERRA (GERENTE) CELIO SILVA (GERENTE)

4. Escreva uma query para recuperar nome e salario e nmero de semanas desde a data de admisso (com arredondamento de 2 casas decimais) de todos os empregados contratados a mais de 350 semanas.

5. Escreva uma query para recuperar o nome e o nmero de meses de trabalho de todos os empregados da empresa a partir de suas datas de admisso.

6. Recuperar para cada empregado seu nome e data de admisso no formato DD/MM/YY HH:MI:SS.

7. Escreva uma query para recuperar o nome e salrio dos empregados no formato abaixo.

8. Escreva uma query para recuperar o nome e o percentual de comisso dos empregados acrescido de 3%. Aqueles que no possuirem % de comisso (% de comisso nulo) devem aparecer com 3%.

79

LISTA N 3

1. Escreva uma query para recuperar o nome dos empregados e o nmero e nome de seus departamentos.

2. Escreva uma query para recuperar o nome dos empregados e o nome dos projetos nos quais eles trabalham.

3. Escreva uma query para recuperar o nome, sobrenome e nome do departamento onde ARMANDO trabalha.

4. Escreva uma query para recuperar o nome dos produtos utilizados nos diversos projetos controlados pelos departamentos. Deseja-Se que o resultado seja apresentado conforme vem abaixo: DEPTO -------------COMPRAS COMPRAS COMPRAS MARKETING MARKETING VENDAS VENDAS VENDAS VENDAS PRODUTO -------------PROD1 PROD2 PROD4 PROD2 PROD3 PROD1 PROD2 PROD3 PROD4

80

LISTA N 4

1. Escreva uma query para recuperar o maior, o menor salrio e a diferena entre o maior e o menor salrio existente na tabela de empregados.

2. Escreva uma query para contar o nmero de gerentes existentes na tabela de empregados.

3. Escreva uma query para recuperar o nome dos empregados seguido do nmero de dependentes que possuem.

4. Escreva uma query para recuperar, para cada gerente, o seu numero e o menor salrio pago a um de seus subordinados. No devem ser considerados os grupos cujos salrios sejam inferior a 1000,00 reais. Ordene o resultado por salrio.

81

LISTA N 5

1. Recupere o nome dos empregados que trabalham nos projetos em que TERESA trabalha.

2. Recupere o nome e sobrenome de todos os empregados subordinados a TERESA.

3. Recupere o nmero, nome e sobrenome dos empregados que ganham mais do que a mdia salarial da empresa e esto subordinados a um gerente que possua a letra T no nome.

4. Recupere o nome e salrio de todos os empregados que ganham o salrio mximo pago aos empregados de cada departamento.

82

LISTA N 6

1. Adicione uma linha tabela de PRODUTOS. O nmero do produto 1216, seu nome PROD5 e sua cor, AMARELO. Antes de emitir o comando INSERT d um DESCRIBE em PRODUTOS para tomar conhecimento do tipo de cada coluna. 2. Emita o mesmo comando novamente. Qual foi a mensagem de erro apresentada? _________________________________________________________________________ 3. Adicione uma linha tabela de PRODUTOS_PROJETOS. O nmero do produto 1216, o nmero do projeto onde este produto foi utilizado 4, a data da utilizao 25 de julho de 1995 e a quantidade utilizada nesta data foi de 67 unidades do produto. D um DESCRIBE em PRODUTOS_PROJETOS para tomar conhecimento do tipo de cada coluna. A insero foi realizada com sucesso? ____________ 4. Adicione outra linha tabela de PRODUTOS_PROJETOS. O nmero do produto 1217, o nmero do projeto onde este produto foi utilizado 3, a data da utilizao 10 de outubro de 1994 e a quantidade utilizada nesta data foi de 22 unidades do produto. A insero foi realizada com sucesso? Porqu? _______________________________________________ _________________________________________________________________________ 5. Troque a cor do produto 1216 para AZUL. 6. Troque o nmero do DEPARTAMENTO 10 para 50. O que aconteceu? 7. Delete todos os dependentes do empregado nmero 7499. 8. Logue-se mais uma vez no SQL*PLUS e execute o comando abaixo: SELECT * FROM DEPENDENTES; Os 3 dependentes do empregado nmero 7499 foram deletados? Porqu? _____________ _________________________________________________________________________ 9. Ainda na segunda sesso do SQL*PLUS, troque o nome do dependente LUCIO para LUCIO ALVES. Voc conseguiu? Porqu? ____________________________________ _________________________________________________________________________ 10. Coloque as duas janelas do SQL*PLUS lado a lado e, em seguida, execute o comando COMMIT na primeira sesso do SQL*PLUS. Observe o que vai acontecer na outra sesso. Quantas linhas foram atualizadas? _____________ Ocorreu algum tipo de erro? Porqu? _________________________________________________________________________ Feche a segunda sesso aberta no SQL*PLUS.

83

LISTA N 7

1. Crie a tabela de Clientes conforme vem abaixo: CREATE TABLE CLIENTES (CODIGO NUMBER(5) CONSTRAINT CLIENTES_CODIGO_PK PRIMARY KEY, NOME CHAR(50) CONSTRAINT CLIENTES_NOME_NN NOT NULL, DT_NASC DATE, OBS VARCHAR2(255));

2. Crie uma tabela de Pedidos com as seguintes caractersticas: Colunas Caractersticas Tipo Tamanho Numero PK Number 4 Data_Pedido Numero_Cliente NN FK Date Number 5 Observacoes Varchar2 255

Observao: D nome a todas as constraints. Utilize o seguinte padro para nomes de constraints: Nome_da_tabela_Nome_da_coluna_Tipo_da_constraint

Para os 5 tipos de constraints existentes use as seguintes abreviaturas: PK FK U NN CK Primary Key Foreign Key Unique Not Null Check

Exemplo: Seguindo a conveno acima a constraint Primary Key da tabela de clientes teria o seguinte nome: CLIENTES_CODIGO_PK.

84

LISTA N 8

1. Crie uma view denominada EMPREGADOS_10_30 com as seguintes colunas da tabela de EMPREGADOS: NUMERO NOME SOBRENOME Devem constar da view apenas os empregados lotados nos departamentos 10 e 30. No deve ser possvel: mudar um empregado para um terceiro departamento. inserir um empregado lotando-o em um terceiro departamento.

2. possvel utilizar uma seqncia para incrementar a coluna NUM_ORDEM da tabela de DEPENDENTES? __________________________________________________________

3. Crie uma seqncia para ser utilizada na gerao de nmeros de chave primria da tabela de PROJETOS. A seqncia deve comear com o nmero 5, o incremento deve ser de 1 e o nome da seqncia deve ser PROJETOS_NUMERO_SEQ. Permita que a seqncia faa um cache de 3 nmeros (o default de 20). 4. Descreva em que situaes um ndice criado automaticamente: Quando se define uma Primary Key. ________________________________________ Quando se define uma Foreign Key. ________________________________________ Quando se define uma coluna do tipo UNIQUE. _______________________________

5. Crie um ndice no-nico para a chave estrangeira NUMERO_DEPT existente na tabela de EMPREGADOS.

85

LISTA N 9

1. Executar o comando CREATE USER suficiente para que o usurio criado tenha acesso a um banco de dados? Porqu? ________________________________________________ _________________________________________________________________________

2. Que privilgios voc daria a um usurio desenvolvedor?

3. Se voc um DBA e pretende criar muitos usurios com os mesmos privilgios de sistema. O que voc faria para tornar este trabalho mais fcil? ______________________________ _________________________________________________________________________

4. Crie um usurio denominado TESTE_X, onde X o nmero correspondente sua conta ALUNOX. Atribua a este usurio uma senha e os privilgios de CONNECT e RESOURCE.

86

BIBLIOGRAFIA Livros:

C. J. Date, An Introduction to Database Systems, Addison-Wesley Publishing Company, 1995. C. Batini, S. Ceri, S. Navathe, Conceptual Database Design, The Benjamin Cummings Publishing Company, Inc., 1992.

J. D. Ullman, J. Widom, A First Course in Database Systems, Prentice Hall, 1997.

Manuais Oracle:

Introduction to Oracle: SQL and PL/SQL using Procedure Builder. Oracle 7 Server SQL Reference. PL/SQL Users Guide Reference.

87

Você também pode gostar