Você está na página 1de 87

SQL

APOSTILA
DE SQL
Para Aulas de Laboratrio

Prof. Alan F Sousa

[R1] Comentrio: Este ndice


do tipo Formal. Selecionar
Inserir ndice e selecionar Formal.

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

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

= > >= <= <>


NOT BETWEEN
NOT IN
NOT LIKE
IS NOT NULL

3. Operadores lgicos:
- AND
- OR
- NOT

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.

[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.

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

[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.


[R6] Comentrio:

SELECT NOME, DT_ADMISSAO


FROM EMPREGADOS
WHERE DT_ADMISSAO = TO_DATE(February 20, 1991, Month dd, YYYY);

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;

[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.

Obs: Haver um ganho de desempenho e de clareza se voc sempre qualificar as colunas com o nome
das tabelas s quais elas pertencem.

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

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

15 rows selected.

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.

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

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;

[R11] Comentrio: Caso haja


um departamento sem empregado,
ficar em branco o nome do
empregado e ao lado o nome do
departamento.

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

Empregado
---------TERESA
CHICO
CELIO
JOSE
LUIZA
ARMANDO
WALTER
MARTA
TUTTI
JAMES
JOHN
SEBASTIAN
ABELARDO
SILVIO

14 rows selected.
O que precisaria ser feito para que o empregado Ingo (que o presidente) aparea na coluna de
empregados, porem sem Supervisor?

[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

[R19] Comentrio: Automatic


amente ser criado um ndice
nico para a(a) coluna(s)
especificada(s), se ele j no
existir.

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.

[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);

[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.

37

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.

[R30] Comentrio: SYSDAT


E  DATA e HORA.

INSERT INTO EMPREGADOS


VALUES (7788, USER, '55555555555', NULL, 7566, TO_CHAR (SYSDATE,
DD/MON/YY), 3000, 12.5, 20);

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 Comando DELETE
Exemplo 1: Apagar o empregado 7788 da tabela de empregados.
DELETE FROM EMPREGADOS
WHERE NUMERO = 7788;

O professor disse que havendo um


trigger para fazer a atualizao em
cascata est atualizao possvel.

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:

[R35] Comentrio: SELECT


CONSTRAINT_NAME,
CONSTRAINT_TYPE
FROM
USER_CONSTRAINTS
WHERE TABLE_NAME =
'TRABALHAM';
[R36] Comentrio: SELECT
UC.CONSTRAINT_NAME,
UC.CONSTRAINT_TYPE,

ALTER TABLE TRABALHAM


DROP CONSTRAINT NOME_DA_CONSTRAINT;

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;

54

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

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.

Exemplo 7: Como renomear uma tabela, uma viso, uma seqncia ou um sinnimo.

[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.

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.

[R43] Comentrio: O default


CACHE 20. Posso escrever
CACHE 100, por exemplo. Se no
quero o cache escrevo
NOCACHE.

INSERT INTO DEPARTAMENTOS (NUMERO, NOME, LOCAL)


VALUES (S_DEPARTAMENTOS_NUMERO.NEXTVAL, CONTABILIDADE,
NITEROI);

[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.
[R48] Comentrio: Acho que
isso para saber se a sequencia
ascendente ou descendente.

CREATE SEQUENCE ABC;

[R49] Comentrio: Quando se


cria uma sequence sem cache
(NOCACHE), cache size igual a
zero.

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

NOT NULL
NOT NULL

[R50] Comentrio: Indica o


prximo nmero a ser utilizado
quando os nmeros do cache
acabarem.

Type
-------------------VARCHAR2(30)

[R51] Comentrio:
SELECT
S_DEPARTAMENTOS_NOME.C
URRVAL
FROM SYS.DUAL;

NUMBER
NUMBER
VARCHAR2(1)
VARCHAR2(1)
NUMBER
NUMBER

[R52] Comentrio:
DELETE FROM EMPREGADOS
WHERE NUMERO_DEPT =
(SELECT NUMERO
FROM DEPARTAMENTOS

Regras a respeito da utilizao de NEXTVAL e CURRVAL

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.

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.

[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.

Exemplo 2: Criao de uma viso sobre a tabela de empregados.

[R56] Comentrio: Cria a


view mesmo que a tabela base no
exista.

CREATE VIEW V_EMPREGADOS


AS SELECT NUMERO, NOME, SOBRENOME
FROM EMPREGADOS
WHERE NUMERO_DEPT = 10;

[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.

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;

[R60] Comentrio: Fazem a


mesma coisa.

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;

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:






No se pode atualizar dados de uma viso se ela contm:






Qualquer das condies acima.


Colunas definidas por expresses.
A pseudocoluna ROWNUM.

[R61] Comentrio: Exemplo:


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

No se pode adicionar dados a uma viso se:





Funes de grupo.
A clusula Group by.
O comando Distinct.

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.

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:

BETO
GILBERTO

GILBERTO
NAIR

LAURA
NAIR

ROWID

NEL

1
2
3
4
5
6
7
8

BETO
GILBERTO
LAURA
NAIR
NELSON
SERGIO
UBALDO
VERA

...
NELSON
SERGIO

SERGIO
VERA

UBALDO
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

7839
7566
7698
7782

11111111111
22222222222
33333333333
44444444444

INGO
TERESA
CHICO
CELIO

(Bloco.Linha.Arquivo)

Tipos de ndices
64

B-Tree

nico

No nico
Clusterizado

Index Cluster

Hash Cluster
Bitmap

[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.

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.

[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.

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.

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.

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.

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.

Exemplo 1: Como criar um ndice nico.


CREATE UNIQUE INDEX EMPREGADOS_NOME_IDX
ON EMPREGADOS (NOME);

[R69] Comentrio: Note que a


constraint Foreign Key no cria
ndice.

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

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

DEPARTAMENTOS_NUMERO_PK
DEPARTAMENTOS
TABLE
UNIQUE
NUMERO
1
22

Como apagar um ndice:


Exemplo 1: Para apagar o ndice 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.

DROP INDEX DEPARTAMENTOS_NUMERO_PK;

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:

[R73] Comentrio: Privilgios


de objeto podem ser sobre:
Tabelas
Indices
Prcedures e Functions
Sequences
Views
Snapshots
Sinonimos

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;

[R74] Comentrio:

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;

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

Exemplo 4: Concedendo o privilgio de EXECUTE sobre a Procedure ALTERA_CARGO:


GRANT EXECUTE ON CARLOS.ALTERA_CARGO TO JULIO;

[R76] Comentrio: No
possvel atribuir privilgio de
select sobre determinadas colunas.
Para isto ser feito preciso definir
views.

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