Você está na página 1de 164

Captulo 1: Conceitos de Banco de Dados

1.1

Objetivos deste captulo


Introduzir os conceitos bsico de sistema gerenciador de banco de dados, banco de dados
relacional, lgebra relacional, e a arquitetura do Oracle.

1.2

Sistema de Gerenciamento de Banco de Dados


O Sistema de Gerenciamento de Banco de Dados (SGBD) um software que controla o
armazenamento, as modificaes, e os acessos s informaes do banco de dados.

O SGBD atua como interface entre os usurios e as informaes armazenadas. Todas as


solicitaes relativas aos dados do banco de dados so interceptadas, interpretadas, e
executadas pelo SGBD. Nenhum acesso aos dados pode ser feito de outra maneira.
Desta forma, o SGBD isola o usurio de todos os detalhes particulares do hardware ou do
sistema operacional sendo utilizado, tais como mtodo de acesso e blocagem de disco. A
forma de acesso do usurio ao banco de dados no deve mudar quando o hardware ou o
sistema operacional mudam.
Existem modelos alternativos para se implementar um SGBD, sendo que os mais comuns
so hierrquico, rede, listas invertidas e relacional.
1.3

Banco de dados relacional


O modelo predominante atualmente o relacional. Um banco de dados relacional pode ser
definido como um banco de dados que aparece ao usurio como uma coleo de tabelas
relacionadas, e nada alm de tabelas.
Os trs elementos de um banco de dados relacional so:
tabelas
colunas
linhas

Os operadores relacionais so:


Seleo/Restrio

Projeo

Unio
Interseo
Diferena
Produto

Juno

uma operao que recupera e mostra dados de uma


tabela. possvel recuperar todas as linhas, ou apenas
algumas que satisfaam uma determinada condio ou a
vrias condies. Esta operao chamada tambm de
subconjunto horizontal.
uma operao que recupera e mostra dados de apenas
algumas colunas, e portanto chamada de subconjunto
vertical.
mostra todas as linhas que aparecem em duas tabelas.
mostra todas as linhas que aparecem nas duas tabelas.
mostra todas as linhas que aparecem em apenas uma das
tabelas
o resultado obtido pela concatenao de duas tabelas.
Todas as linhas da primeira tabela so concatenadas com
todas as linhas da segunda tabela.
o resultado obtido pela concatenao de duas tabelas de
acordo com condies especficas. Apenas as linhas que
atendem as condies estabelecidas so concatenadas.
Seleo/Restrio

Projeo

Unio

Interseo

Diferena

Produto

Joo
Jos
Manoel

Pintor
Escritor

Joo
Joo
Jos
Jos
Manoel
Manoel

Pintor
Escritor
Pintor
Escritor
Pintor
Escritor

Juno

Joo
Jos
Maria
Ana

1.4

10
10
20
30

10
20
30
40

Vendas
Pesq.
Cont.
Secret.

Joo
Jos
Maria
Ana

10
10
20
30

10
10
20
30

Vendas
Vendas
Pesq.
Cont.

Arquitetura do Oracle
Background Processes

System Global Area


Banco de Dados
Servers

Redo Log Files

Users

Control Files
Data Files

O SGBD:
Estruturas de memria:
System Global Area (SGA) uma regio compartilhada de memria alocada pelo
SGBD Oracle, que contm dados e informaes de controle. Quanto maior for a SGA
melhor ser o desempenho do Oracle. Os dados da SGA so compartilhados por
4

todos os usurios que esto acessando o banco de dados. As informaes


armazenadas na SGA esto divididas por tipo de estrutura de memria, incluindo
database buffers, redo log buffers e shared poll.
Program Global Area (PGA) uma rea de memria que contm dados e
informaes de controle para um processo servidor. Uma PGA criada pelo Oracle
quando um processo servidor iniciado.
Processos:
Os processos so divididos em Processos Usurio e Processos do Oracle. Cada
usurio conectado possui um Processo Usurio, atravs do qual se comunica com o
Oracle. Entre os processos do Oracle esto os Processos Servidores, que executam as
solicitaes emitidas pelo Processos Usurios, e os Processos Background.
O Banco de dados:
Data Files

Contm todos os dados do banco de dados.

Redo Log Files

Contm todas as informaes relativas s


alteraes efetuadas no banco de dados
para permitir a recuperao.

Control Files

Registra a estrutura fsica do banco de dados.

Captulo 2: Introduo s Consultas


2.1

Objetivos deste captulo


Este captulo faz uma introduo linguagem de consulta utilizada para acessar o Banco de
Dados Oracle. Em particular, so discutidas as declaraes utilizadas para:

2.2

realizar clculos

manusear valores nulos corretamente

nomes alternativos para ttulos das colunas

concatenar colunas

ordenar linhas

fornecer critrios de pesquisa

O utilitrio SQL*PLUS
O SQL*PLUS uma interface atravs da qual os comandos SQL podem ser entrados e
executados. O SQL*PLUS possui outros comandos, que permitem formatar a sada dos
comandos SQL, alm de fornecer facilidades para editar e salvar comandos SQL.
Para ativar o SQL*PLUS digite SQLPLUS na linha de comando do MS-DOS, e pressione a
tecla Enter. Quando o SQLPLUS solicitar para entrar com o nome do usurio digite
ALUNO1, e quando for solicitada a senha fornea ALUNO1 novamente.
As linhas de comando do SQL*PLUS so prefixadas por: SQL>. As linhas de continuao
so numeradas. Todo o curso est baseado na utilizao desta ferramenta pelos participantes.
Os comandos podem ser escritos em uma ou mais linhas.

2.3

Construo bsica de uma consulta


O comando SELECT recupera informaes do banco de dados, implementando todos os
operadores da lgebra relacional.
Em sua forma mais simples deve incluir:
a. A clusula SELECT, que lista as colunas a serem envolvidas (essencialmente a Projeo,
conforme definido na lgebra relacional).
b. A clusula FROM, que especifica as tabelas envolvidas.
Para listar os nmeros de todos os departamentos, nomes dos empregados e nmeros dos
gerentes da tabela EMP, digita-se:
6

SQL> SELECT DEPTNO, ENAME, MGR


2 FROM EMP
DEPTNO
------20
30
30
20
30
30
10
20
10
30
20
30
20
10

ENAME
MGR
---------- ------SMITH
7902
ALLEN
7698
WARD
7698
JONES
7839
MARTIN
7698
BLAKE
7839
CLARK
7839
SCOTT
7566
KING
TURNER
7698
ADAMS
7788
JAMES
7698
FORD
7566
MILLER
7782

14 rows selected.

possvel selecionar todas as colunas da tabela colocando-se um "*" (asterisco) aps a


palavra SELECT, como visto abaixo:
SQL> SELECT *
2 FROM EMP
EMPNO
------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ------- --------- ------- ------- ------CLERK
7902 13-JUN-83
800
20
SALESMAN
7698 15-AUG-83
1600
300
30
SALESMAN
7698 26-MAR-84
1250
500
30
MANAGER
7839 31-OCT-83
2975
20
SALESMAN
7698 05-DEC-83
1250
1400
30
MANAGER
7839 11-JUN-84
2850
30
MANAGER
7839 14-MAY-84
2450
10
ANALYST
7566 05-MAR-84
3000
20
PRESIDENT
09-JUL-84
5000
10
SALESMAN
7698 04-JUN-84
1500
0
30
CLERK
7788 04-JUN-84
1100
20
CLERK
7698 23-JUL-84
950
30
ANALYST
7566 05-DEC-83
3000
20
CLERK
7782 21-NOV-83
1300
10

14 rows selected.

2.4

Expresses aritmticas
Uma expresso a combinao de um ou mais valores, operadores e funes, que resultam
em um valor calculado.
As expresses aritmticas podem conter nomes de colunas, constantes numricas, e
operadores aritmticos. Os operadores so + - * e / , para soma, subtrao, multiplicao e
diviso, respectivamente.
No exemplo abaixo calcula-se o salrio anual multiplicando-se o salrio mensal por doze.
SQL> SELECT ENAME, SAL*12, COMM
2 FROM EMP

ENAME
SAL*12
COMM
---------- ------- ------SMITH
9600
ALLEN
19200
300
WARD
15000
500
JONES
35700
MARTIN
15000
1400
BLAKE
34200
CLARK
29400
SCOTT
36000
KING
60000
TURNER
18000
0
ADAMS
13200
JAMES
11400
FORD
36000
MILLER
15600

Se a expresso aritmtica contiver mais de um operador, multiplicao e diviso so de


mesma precedncia, porm com precedncia superior a adio e subtrao, que tambm so
de mesma precedncia. No caso de operadores com a mesma precedncia, o da esquerda
processado primeiro.
No exemplo abaixo, a multiplicao (250*12) realizada primeiro, e depois somada ao
salrio.
SQL> SELECT ENAME, SAL+250*12
2 FROM EMP
ENAME
SAL+250*12
---------- ---------SMITH
3800
ALLEN
4600
WARD
4250
JONES
5975
MARTIN
4250
BLAKE
5850
CLARK
5450
SCOTT
6000
KING
8000
TURNER
4500
ADAMS
4100
JAMES
3950
FORD
6000
MILLER
4300

Parnteses podem ser utilizados para especificar a ordem na qual os operadores sero
executados. Se, por exemplo, for necessrio somar 250 ao salrio antes de multiplicar por
12, devemos escrever:
SQL> SELECT ENAME, (SAL+250)*12
2 FROM EMP
ENAME
(SAL+250)*12
---------- -----------SMITH
12600
ALLEN
22200
WARD
18000
JONES
38700
MARTIN
18000

BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

2.5

37200
32400
39000
63000
21000
16200
14400
39000
18600

Nomes alternativos para ttulos de colunas


Para mostrar o resultado de uma consulta, o SQL*PLUS normalmente utiliza o nome da
coluna como ttulo da coluna. Em muitos casos, isto torna o ttulo sem significado. Pode ser
alterado o ttulo da coluna usando-se um Alis.
O Alis especificado escrevendo-se um texto aps item a ser mostrado na clusula
SELECT. Por padro, o nome do Alis convertido para letras maisculas, e no pode
conter espaos em branco, a menos que seja colocado entre aspas.
Para mostrar como ttulo da coluna SALARIO ANUAL no lugar de SAL*12, podemos
escrever:
SQL> SELECT ENAME NOME, SAL*12 SALARIO ANUAL, COMM
2 FROM EMP
NOME
SALARIO ANUAL
COMM
---------- -------------- ------SMITH
9600
ALLEN
19200
300
WARD
15000
500
JONES
35700
MARTIN
15000
1400
BLAKE
34200
CLARK
29400
SCOTT
36000
KING
60000
TURNER
18000
0
ADAMS
13200
JAMES
11400
FORD
36000
MILLER
15600
14 rows selected.

Nota: somente na clusula SELECT o Alis pode ser usado, nas outras clusulas no.
2.6

O operador de concatenao
O operador de concatenao (||) permite juntar colunas, expresses aritmticas, ou valores
constantes, para criar uma expresso do tipo caracter. Colunas dos dois lados do operador
so combinadas para formar uma s coluna.
Para combinar o nmero do empregado com o nome do empregado em uma coluna apenas,
utilizando EMPREGADO como ttulo, devemos escrever:
SQL> SELECT EMPNO||ENAME EMPREGADO
2 FROM EMP

EMPREGADO
-------------------------------------------------7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
14 rows selected.

2.7

Literais
Um literal qualquer caracter, expresso, ou nmero, incluido na clusula SELECT, que no
um nome ou Alis da coluna.
O literal da clusula SELECT listado em todas as linhas mostradas pelo comando. Literais
dos tipos data e caracter devem ser envoltos por apstrofos ('). Literais numricos no
precisam de apstrofos.
O comando abaixo contm literal concatenado com colunas, e um Alis para a primeira
coluna.
SQL>
SQL>
2
3
4

COLUMN EMPREGADO FORMAT A20


SELECT EMPNO||'-'||ENAME EMPREGADO,
'TRABALHA NO DEPARTAMENTO',
DEPTNO
FROM EMP

EMPREGADO
-------------------7369-SMITH
7499-ALLEN
7521-WARD
7566-JONES
7654-MARTIN
7698-BLAKE
7782-CLARK
7788-SCOTT
7839-KING
7844-TURNER
7876-ADAMS
7900-JAMES
7902-FORD
7934-MILLER

'TRABALHANODEPARTAMENTO' DEPTNO
------------------------ ------TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
10
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
10
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
10

14 rows selected.

2.8

Manuseio de valores nulos


10

Se em uma linha no existir valor para uma determinada coluna, este valor dito como
sendo nulo.
Um valor nulo um valor que no est disponvel, desconhecido, ou no aplicvel. Um
valor nulo no o mesmo que zero. Zero um nmero.
Se o valor de qualquer coluna envolvida em uma expresso for nulo, o resultado da
expresso tambm ser nulo. No exemplo abaixo, somente aparecem os salrios anuais dos
vendedores, pois somente estes tem comisso no nula.
SQL> SELECT ENAME, SAL*12+COMM SALARIO_ANUAL
2 FROM EMP
ENAME
SALARIO_ANUAL
---------- ------------SMITH
ALLEN
19500
WARD
15500
JONES
MARTIN
16400
BLAKE
CLARK
SCOTT
KING
TURNER
18000
ADAMS
JAMES
FORD
MILLER
14 rows selected.

Para calcular o resultado corretamente, deve ser utilizada a expresso NVL, que converte um
valor nulo em um valor no nulo, conforme mostrado abaixo:
SQL> SELECT ENAME, SAL*12+NVL(COMM, 0) SALARIO_ANUAL
2 FROM EMP
ENAME
SALARIO_ANUAL
---------- ------------SMITH
9600
ALLEN
19500
WARD
15500
JONES
35700
MARTIN
16400
BLAKE
34200
CLARK
29400
SCOTT
36000
KING
60000
TURNER
18000
ADAMS
13200
JAMES
11400
FORD
36000
MILLER
15600
14 rows selected.

A funo NVL espera dois argumentos:


a)

uma expresso
11

b)

um valor no nulo

Podem ser convertidos valores nulos de data, nmeros, ou caracteres:


NVL(ColunaData, 01-jan-84')
NVL(ColunaNumero, 9)
NVL(ColunaCaracter, alfanumrico')
2.9

Eliminao de linhas duplicadas


A no ser que seja especificado o contrrio, as linhas duplicadas no so eliminadas dos
resultados das consultas.
SQL> SELECT DEPTNO
2 FROM EMP
DEPTNO
------20
30
30
20
30
30
10
20
10
30
20
30
20
10

Para eliminar as linhas duplicadas, deve ser includa a palavra DISTINCT aps o SELECT.
SQL> SELECT DISTINCT DEPTNO
2 FROM EMP
DEPTNO
------10
20
30

Mltiplas colunas podem ser especificadas aps a palavra DISTINCT.


SQL> SELECT DISTINCT DEPTNO, JOB
2 FROM EMP
DEPTNO
------10
10
10
20
20
20

JOB
--------CLERK
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER

12

30 CLERK
30 MANAGER
30 SALESMAN

Acima esto mostradas todas as combinaes diferentes de departamentos e cargos.


2.10

Ordenao das linhas


Normalmente, a ordem das linhas retornadas por uma consulta indefinida. A clusula
ORDER BY pode ser usada para ordenar linhas. Se for usada, ORDER BY deve ser sempre
a ltima clusula de um comando SELECT.
Para ordenar pelo nome do empregado, usamos:
SQL> SELECT ENAME, JOB, SAL*12, DEPTNO
2 FROM EMP
3 ORDER BY ENAME
ENAME
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

JOB
SAL*12 DEPTNO
--------- ------- ------CLERK
13200
20
SALESMAN
19200
30
MANAGER
34200
30
MANAGER
29400
10
ANALYST
36000
20
CLERK
11400
30
MANAGER
35700
20
PRESIDENT
60000
10
SALESMAN
15000
30
CLERK
15600
10
ANALYST
36000
20
CLERK
9600
20
SALESMAN
18000
30
SALESMAN
15000
30

14 rows selected.

Ordem padro de ordenao:


- Nmeros: menores primeiro
- Data:
mais cedo primeiro
- Caracteres: ordem alfabtica
Para reverter esta ordem, pode ser utilizada a palavra DESC aps o nome da coluna, na
clusula ORDER BY.
Para listarmos os funcionrios mais novos antes dos mais antigos fazemos:
SQL> SELECT ENAME, JOB, HIREDATE
2 FROM EMP
3 ORDER BY HIREDATE DESC
ENAME
---------JAMES
KING
BLAKE
TURNER
ADAMS
CLARK

JOB
--------CLERK
PRESIDENT
MANAGER
SALESMAN
CLERK
MANAGER

HIREDATE
--------23-JUL-84
09-JUL-84
11-JUN-84
04-JUN-84
04-JUN-84
14-MAY-84

13

WARD
SCOTT
MARTIN
FORD
MILLER
JONES
ALLEN
SMITH

SALESMAN
ANALYST
SALESMAN
ANALYST
CLERK
MANAGER
SALESMAN
CLERK

26-MAR-84
05-MAR-84
05-DEC-83
05-DEC-83
21-NOV-83
31-OCT-83
15-AUG-83
13-JUN-83

possvel efetuar a ordenao por mais de uma coluna, sendo algumas em ordem
ascendente e outras em ordem descendente.
SQL> SELECT DEPTNO, JOB, ENAME
2 FROM EMP
3 ORDER BY DEPTNO, SAL DESC
DEPTNO
------10
10
10
20
20
20
20
20
30
30
30
30
30
30

JOB
--------PRESIDENT
MANAGER
CLERK
ANALYST
ANALYST
MANAGER
CLERK
CLERK
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK

ENAME
---------KING
CLARK
MILLER
SCOTT
FORD
JONES
ADAMS
SMITH
BLAKE
ALLEN
TURNER
WARD
MARTIN
JAMES

Exerccio: verificar como ficam os valores nulos aps a ordenao.


2.11

Critrios de pesquisa
Os critrios de pesquisa so informados na clusula WHERE, que corresponde ao operador
Restrio da lgebra relacional. Nesta clusula esto estabelecidos os critrios necessrios
para uma linha poder ser selecionada.
A clusula WHERE pode comparar valores em colunas, valores literais, expresses
aritmticas, ou funes. Trs elementos so sempre necessrios:
- Um nome de coluna
- Um operador de comparao
- Um nome de coluna, constante, ou lista de valores
Existem dois tipos de operadores: lgicos e SQL.
Os operadores lgicos testam as seguintes condies:
=
>
>=
<
<=

igual
maior
maior ou igual
menor
menor ou igual
14

<>

diferente (^= ou !=)

Para listar os nomes, nmeros, cargos e departamentos de todos os funcionrios com cargo
CLERK, usamos:
SQL> SELECT ENAME, EMPNO, JOB, DEPTNO
2 FROM EMP
3 WHERE JOB = CLERK'
ENAME
EMPNO JOB
DEPTNO
---------- ------- --------- ------SMITH
7369 CLERK
20
ADAMS
7876 CLERK
20
JAMES
7900 CLERK
30
MILLER
7934 CLERK
10

Para listar o nome e o nmero dos departamentos com nmero maior que 20, usamos:
SQL> SELECT DNAME, DEPTNO
2 FROM DEPT
3 WHERE DEPTNO > 20
DNAME
DEPTNO
-------------- ------SALES
30
OPERATIONS
40

Para sabermos que funcionrios tem comisso superior ao salrio, usamos:


SQL> SELECT ENAME, SAL, COMM
2 FROM EMP
3 WHERE COMM > SAL
ENAME
SAL
COMM
---------- ------- ------MARTIN
1250
1400

Existem quatro operadores SQL, que operam sobre todos os tipos de dados.
BETWEEN...AND...
IN(lista)
LIKE
IS NULL

entre dois valores (inclusive)


idnticos a uma lista de valores
semelhante a um modelo de caracteres
valor nulo

O operador BETWEEN testa valores no intervalo ou idnticos aos limites.


SQL> SELECT ENAME, SAL
2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
ENAME
SAL
---------- ------ALLEN
1600
WARD
1250
MARTIN
1250
TURNER
1500
ADAMS
1100
MILLER
1300

15

O operador IN testa os valores especificados em uma lista.


SQL> SELECT EMPNO, ENAME, SAL, MGR
2 FROM EMP
3 WHERE MGR IN ( 7902, 7566, 7788 )
EMPNO
------7369
7788
7876
7902

ENAME
SAL
MGR
---------- ------- ------SMITH
800
7902
SCOTT
3000
7566
ADAMS
1100
7788
FORD
3000
7566

Se caracteres ou datas forem utilizados, devem ser envoltos por apstrofos.


Usando o operador LIKE possvel selecionar linhas de acordo com modelo fornecido. O
smbolo "%" representa qualquer seqncia de zero ou mais caracteres. O smbolo "_"
(sublinhado) representa qualquer um caracter, mas apenas um, no mnimo e no mximo.
Para listarmos todos os empregados cujos nomes comeam com a letra "S", usamos:
SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE 'S%'
ENAME
---------SMITH
SCOTT

Para listar os nomes de todos os empregados que contm exatamente 4 letras, usamos:
SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE '____'

(quatro caracteres de sublinhado)

ENAME
---------WARD
KING
FORD

O operador IS NULL serve especificamente para testar valores nulos.


Para listar os funcionrios que no possuem gerente, usamos:
SQL> SELECT ENAME, MGR
2 FROM EMP
3 WHERE MGR IS NULL
ENAME
MGR
---------- ------KING

16

Os operadores mostrados abaixo podem ser utilizados para testes de negao:


!=
^=
<>
NOT NomeDaColuna =
NOT NomeDaColuna >
NOT BETWEEN
NOT IN
NOT LIKE
IS NOT NULL

no igual
no igual a
no maior do que
fora da faixa especificada
fora da lista especificada
no semelhante ao modelo
no nulo

Para listar os empregados com salrios fora da faixa de 1000 a 2000, usamos:
SQL> SELECT ENAME, SAL
2 FROM EMP
3 WHERE SAL NOT BETWEEN 1000 AND 2000
ENAME
SAL
---------- ------SMITH
800
JONES
2975
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
JAMES
950
FORD
3000
8 rows selected.

Para listar os empregados cujos cargos no comeam com a letra M, usamos:


SQL> SELECT ENAME, JOB
2 FROM EMP
3 WHERE JOB NOT LIKE 'M%'
ENAME
---------SMITH
ALLEN
WARD
MARTIN
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
--------CLERK
SALESMAN
SALESMAN
SALESMAN
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

Para listar os empregados com gerentes, usamos:


SQL> SELECT ENAME, MGR
2 FROM EMP
3 WHERE MGR IS NOT NULL
ENAME
MGR
---------- ------SMITH
7902

17

ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
TURNER
ADAMS
JAMES
FORD
MILLER

7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782

x <> NULL e x = NULL


sempre falso. Nulo nunca igual a nada nem diferente de nada, nem a outro nulo.
2.12

Consultas com condies mltiplas


Os operadores AND e OR podem ser utilizados para criar expresses lgicas compostas.
O predicado AND espera que todas duas condies sejam verdadeiras.
O predicado OR espera que uma (ou as duas) condies sejam verdadeiras.
Nos exemplos abaixo as condies so as mesmas, porm os predicados so diferentes.
Para listar todos os CLERKs com salrio entre 1000 e 2000, usamos:
SQL>
2
3
4

SELECT EMPNO, ENAME, JOB, SAL


FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND JOB = 'CLERK'

EMPNO
------7876
7934

ENAME
---------ADAMS
MILLER

JOB
SAL
--------- ------CLERK
1100
CLERK
1300

Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000, usamos:
SQL>
2
3
4

SELECT EMPNO, ENAME, JOB, SAL


FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
OR JOB = CLERK'

EMPNO
------7369
7499
7521
7654
7844
7876
7900
7934

ENAME
---------SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER

JOB
SAL
--------- ------CLERK
800
SALESMAN
1600
SALESMAN
1250
SALESMAN
1250
SALESMAN
1500
CLERK
1100
CLERK
950
CLERK
1300

Quando aparecem tanto ANDs quanto ORs em uma expresso lgica, todos os ANDs so
processados antes que os ORs sejam processados.
18

Uma vez que AND tem precedncia sobre OR, a consulta abaixo retorna todos os gerentes
com salrio maior do que 1500, e todos os vendedores.
SQL>
2
3
4
5

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


FROM EMP
WHERE SAL > 1500
AND JOB = 'MANAGER'
OR JOB = 'SALESMAN'

EMPNO
------7499
7521
7566
7654
7698
7782
7844

ENAME
---------ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
TURNER

JOB
SAL DEPTNO
--------- ------- ------SALESMAN
1600
30
SALESMAN
1250
30
MANAGER
2975
20
SALESMAN
1250
30
MANAGER
2850
30
MANAGER
2450
10
SALESMAN
1500
30

Para selecionar todos os vendedores e gerentes com salrio superior a 1500, usamos:
SQL>
2
3
4

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


FROM EMP
WHERE SAL > 1500
AND ( JOB = 'MANAGER' OR JOB = SALESMAN' )

EMPNO
------7499
7566
7698
7782

ENAME
---------ALLEN
JONES
BLAKE
CLARK

JOB
SAL DEPTNO
--------- ------- ------SALESMAN
1600
30
MANAGER
2975
20
MANAGER
2850
30
MANAGER
2450
10

Os parnteses especificam a ordem em que os operadores devem ser calculados.


2.13

Precedncia dos operadores


a) os operadores de comparao e os operadores SQL tem precedncias iguais.
=, !=, <, >, <=, >=, BETWEEN...AND..., IN, LIKE, IS NULL
b) NOT (para reverter o resultado lgico da expresso, WHERE NOT(sal>2000))
c) AND
d) OR
Para listar todos os gerentes, de qualquer departamento, e os CLERK do departamento 10
apenas, usamos:
SQL> SELECT *
2 FROM EMP
3 WHERE JOB = MANAGER' OR (JOB = CLERK' AND DEPTNO = 10)
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- ------7566 JONES
MANAGER
7839 31-OCT-83
2975
20

19

7698 BLAKE
7782 CLARK
7934 MILLER

MANAGER
MANAGER
CLERK

7839 11-JUN-84
7839 14-MAY-84
7782 21-NOV-83

2850
2450
1300

30
10
10

Neste caso os parnteses so desnecessrios, uma vez que o AND processa primeiro.
2.14

Resumo do comando SELECT


SELECT
FROM
WHERE
ORDER BY

2.15

[DISTINCT] {* | coluna [alis],....}


tabela
condies
{coluna | expresso} [ASC|DESC]

Exerccios
a) Selecionar todas as informaes da tabela SALGRADE
GRADE
LOSAL
HISAL
------- ------- ------1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999

b) Selecionar todas a informaes da tabela EMP


EMPNO
------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ------- --------- ------- ------- ------CLERK
7902 13-JUN-83
800
20
SALESMAN
7698 15-AUG-83
1600
300
30
SALESMAN
7698 26-MAR-84
1250
500
30
MANAGER
7839 31-OCT-83
2975
20
SALESMAN
7698 05-DEC-83
1250
1400
30
MANAGER
7839 11-JUN-84
2850
30
MANAGER
7839 14-MAY-84
2450
10
ANALYST
7566 05-MAR-84
3000
20
PRESIDENT
09-JUL-84
5000
10
SALESMAN
7698 04-JUN-84
1500
0
30
CLERK
7788 04-JUN-84
1100
20
CLERK
7698 23-JUL-84
950
30
ANALYST
7566 05-DEC-83
3000
20
CLERK
7782 21-NOV-83
1300
10

14 rows selected.

c) Listar todos os funcionrios com salrio entre 1000 e 2000


ENAME
DEPTNO
SAL
---------- ------- ------ALLEN
30
1600
WARD
30
1250
MARTIN
30
1250
TURNER
30
1500
ADAMS
20
1100
MILLER
10
1300
6 rows selected.

d) Listar os nmeros e os nomes dos departamentos, ordenados pelo nome do departamento


20

DEPTNO
------10
40
20
30

DNAME
-------------ACCOUNTING
OPERATIONS
RESEARCH
SALES

e) Listar os diferentes tipos de cargo


JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

f) Listar os detalhes dos empregados dos departamentos 10 e 20 em ordem alfabtica de


nome.
EMPNO
------7876
7782
7902
7566
7839
7934
7788
7369

ENAME
---------ADAMS
CLARK
FORD
JONES
KING
MILLER
SCOTT
SMITH

JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ------- --------- ------- ------- ------CLERK
7788 04-JUN-84
1100
20
MANAGER
7839 14-MAY-84
2450
10
ANALYST
7566 05-DEC-83
3000
20
MANAGER
7839 31-OCT-83
2975
20
PRESIDENT
09-JUL-84
5000
10
CLERK
7782 21-NOV-83
1300
10
ANALYST
7566 05-MAR-84
3000
20
CLERK
7902 13-JUN-83
800
20

g) Listar os nomes e os cargos de todos os CLERK do departamento 20.


ENAME
---------SMITH
ADAMS

JOB
--------CLERK
CLERK

h) Listar os nomes de todos os empregados onde aparece TH ou LL no nome.


ENAME
---------SMITH
ALLEN
MILLER

i) Listar os seguintes detalhes dos funcionrios que tem gerente.


ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
TURNER
ADAMS
JAMES

JOB
SAL
--------- ------CLERK
800
SALESMAN
1600
SALESMAN
1250
MANAGER
2975
SALESMAN
1250
MANAGER
2850
MANAGER
2450
ANALYST
3000
SALESMAN
1500
CLERK
1100
CLERK
950

21

FORD
MILLER

ANALYST
CLERK

3000
1300

j) Mostrar o nome e a remunerao total de todos os empregados.


ENAME
REMUNERACAO
---------- ----------SMITH
9600
ALLEN
19500
WARD
15500
JONES
35700
MARTIN
16400
BLAKE
34200
CLARK
29400
SCOTT
36000
KING
60000
TURNER
18000
ADAMS
13200
JAMES
11400
FORD
36000
MILLER
15600

k) Mostrar todos os empregados que foram admitidos em 1983.


ENAME
DEPTNO HIREDATE
---------- ------- --------SMITH
20 13-JUN-83
ALLEN
30 15-AUG-83
JONES
20 31-OCT-83
MARTIN
30 05-DEC-83
FORD
20 05-DEC-83
MILLER
10 21-NOV-83

l) Mostrar o nome, o salrio anual e comisso, de todos os vendedores com salrio mensal
maior do que a comisso. O resultado deve ser ordenado com os maiores salrios na frente.
Se dois ou mais empregados tiverem o mesmo salrio, deve ser ordenado pelo nome do
funcionrio.
ENAME
SALARIO_ANUAL
COMM
---------- ------------- ------ALLEN
19200
300
TURNER
18000
0
WARD
15000
500

m) Selecione os dados para reproduzir a sada mostrada abaixo.


QUEM, O QUE, QUANDO
--------------------------------------------------------------------SMITH TEM A POSICAO DE CLERK NO DEPARTAMENTO 20 DESDE 13-JUN-83
ALLEN TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 15-AUG-83
WARD TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 26-MAR-84
JONES TEM A POSICAO DE MANAGER NO DEPARTAMENTO 20 DESDE 31-OCT-83
MARTIN TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 05-DEC-83
BLAKE TEM A POSICAO DE MANAGER NO DEPARTAMENTO 30 DESDE 11-JUN-84
CLARK TEM A POSICAO DE MANAGER NO DEPARTAMENTO 10 DESDE 14-MAY-84
SCOTT TEM A POSICAO DE ANALYST NO DEPARTAMENTO 20 DESDE 05-MAR-84
KING TEM A POSICAO DE PRESIDENT NO DEPARTAMENTO 10 DESDE 09-JUL-84
TURNER TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 04-JUN-84
ADAMS TEM A POSICAO DE CLERK NO DEPARTAMENTO 20 DESDE 04-JUN-84
JAMES TEM A POSICAO DE CLERK NO DEPARTAMENTO 30 DESDE 23-JUL-84
FORD TEM A POSICAO DE ANALYST NO DEPARTAMENTO 20 DESDE 05-DEC-83
MILLER TEM A POSICAO DE CLERK NO DEPARTAMENTO 10 DESDE 21-NOV-83

22

2.16

Respostas dos exerccios


a) SQL> SELECT *
2 FROM SALGRADE
b) SQL> SELECT *
2 FROM EMP
c) SQL> SELECT ENAME, DEPTNO, SAL
2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
d) SQL> SELECT DEPTNO, DNAME
2 FROM DEPT
3 ORDER BY DNAME
e) SQL> SELECT DISTINCT JOB
2 FROM EMP
f) SQL> SELECT *
2 FROM EMP
3 WHERE DEPTNO IN(10,20)
4 ORDER BY ENAME
g) SQL> SELECT ENAME, JOB
2 FROM EMP
3 WHERE JOB = CLERK'
4 AND DEPTNO = 20
h) SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE '%TH%'
4 OR ENAME LIKE '%LL%'
i) SQL> SELECT ENAME, JOB, SAL
2 FROM EMP
3 WHERE MGR IS NOT NULL
j) SQL> SELECT ENAME, SAL*12+NVL(COMM,0) REMUNERACAO
2 FROM EMP
k) SQL> SELECT ENAME, DEPTNO, HIREDATE
2 FROM EMP
3 WHERE HIREDATE LIKE '%83'
l) SQL> SELECT ENAME, SAL*12 SALARIO_ANUAL, COMM
2 FROM EMP
3 WHERE SAL > COMM
4 AND JOB = 'SALESMAN'
5 ORDER BY SAL DESC, ENAME
m) SQL> SELECT ENAME||' TEM A POSICAO DE '||JOB||
2 ' NO DEPARTAMENTO '||DEPTNO||
3 ' DESDE '||HIREDATE "QUEM, O QUE, QUANDO"
4 FROM EMP

23

Captulo 3: Variveis de Substituio


3.1

Objetivos deste captulo


Descrever as variveis de substituio e como estas so usadas nas declaraes SQL.

3.2

Variveis de substituio com um "&"


A varivel de substituio pode ser utilizada em uma declarao SELECT, representando um
valor a ser fornecido quando o comando for executado.
SQL> SELECT EMPNO, ENAME, SAL
2 FROM EMP
3 WHERE DEPTNO = &NUMERO_DO_DEPARTAMENTO
Enter value for numero_do_departamento: 10
old
new

3: WHERE DEPTNO = &NUMERO_DO_DEPARTAMENTO


3: WHERE DEPTNO = 10

EMPNO
------7782
7839
7934

3.3

ENAME
SAL
---------- ------CLARK
2450
KING
5000
MILLER
1300

Variveis de substituio com dois "&"


Quando so utilizados dois "&" na varivel, o SQL*PLUS solicita o valor da varivel apenas
uma vez, guardando este valor para uso subseqente.
Exemplo: &&NUMERO_DO_DEPARTAMENTO

24

Captulo 4: Funes Numricas e de Caracteres


4.1

Objetivos deste captulo


Este captulo mostra as funes do Oracle que manipulam nmeros e sequncias de
caracteres.

4.2

Funes que manipulam caracteres


4.2.1 LOWER(coluna | literal)
Transforma letras maisculas em minsculas.
SQL> SELECT LOWER(DNAME), LOWER('CURSO DE SQL')
2 FROM DEPT
LOWER(DNAME)
-------------accounting
research
sales
operations

LOWER('CURSODESQL')
-------------------curso de sql
curso de sql
curso de sql
curso de sql

4.2.2 UPPER(coluna | literal)


Transforma letras minsculas em maisculas.
SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME = UPPER('smith')
ENAME
---------SMITH

4.2.3 INITCAP(coluna | literal)


Transforma a primeira letra da palavra em maiscula e as demais minsculas.
SQL> SELECT INITCAP(DNAME), INITCAP(LOC)
2 FROM DEPT
INITCAP(DNAME)
-------------------Accounting
Research
Sales
Operations

INITCAP(LOC)
-------------------New York
Dallas
Chicago
Boston

4.2.4 LPAD(coluna | literal, tamanho, 'caracter')


Preenche a sequncia de caracteres, esquerda, com o caracter e o tamanho informados. Se
o caracter de preenchimento no for informado, ser utilizado o caracter de espao.

25

No exemplo abaixo, as trs colunas so preenchidas esquerda at um total de 20 caracteres.


A primeira coluna foi preenchida com asteriscos, a segunda com espaos, e a terceira com
pontos. Note que a terceira coluna numrica.
SQL> SELECT LPAD(DNAME, 20, *'), LPAD(DNAME, 20), LPAD(DEPTNO, 20,'.')
2 FROM DEPT
LPAD(DNAME,20,*')
LPAD(DNAME,20)
LPAD(DEPTNO,20,'.')
-------------------- -------------------- -------------------**********ACCOUNTING
ACCOUNTING ..................10
************RESEARCH
RESEARCH ..................20
***************SALES
SALES ..................30
**********OPERATIONS
OPERATIONS ..................40

4.2.5 RPAD(coluna | literal, tamanho, 'caracter')


Preenche a seqncia de caracteres, direta, com o caracter e o tamanho informados. Se o
caracter de preenchimento no for informado, ser utilizado o caracter de espao.
SQL> SELECT RPAD(DNAME, 20, *'), RPAD(DNAME, 20), RPAD(DEPTNO, 20,'.')
2 FROM DEPT
RPAD(DNAME,20,'*')
-------------------ACCOUNTING**********
RESEARCH************
SALES***************
OPERATIONS**********

RPAD(DNAME,20)
-------------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

RPAD(DEPTNO,20,'.')
-------------------10..................
20..................
30..................
40..................

4.2.6 SUBSTR(coluna | literal, posio, comprimento)


Retorna uma seqncia de caracteres, a partir da posio indicada, com o comprimento
especificado.
SQL> SELECT SUBSTR('ORACLE',2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5)
2 FROM DEPT
SUBSTR('ORACLE',2,4)
-------------------RACL
RACL
RACL
RACL

SUBSTR(DNAME,2)
--------------CCOUNTING
ESEARCH
ALES
PERATIONS

SUBSTR(DNAME,3,5)
-------------------COUNT
SEARC
LES
ERATI

4.2.7 INSTR(coluna | literal, seqncia de caracteres', posio, n)


Encontra a posio da primeira ocorrncia da seqncia de caracteres na coluna ou literal, se
os dois ltimos parmetros forem omitidos.
Encontra a posio da n-sima ocorrncia a partir da posio indicada, se os quatro
parmetros forem fornecidos.
SQL> SELECT DNAME,
2 INSTR(DNAME,'A'), INSTR(DNAME,'ES'), INSTR(DNAME,'C',1,2)
3 FROM DEPT

26

DNAME
INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2)
------------ ---------------- ----------------- -------------------ACCOUNTING
1
0
3
RESEARCH
5
2
0
SALES
2
4
0
OPERATIONS
5
0
0

4.2.8 LTRIM(coluna | literal, 'caracteres')


Remove os caracteres indicados esquerda da coluna ou do literal. Se nenhum caracter for
especificado, sero eliminados os espaos esquerda.
SQL> SELECT DNAME,
2 LTRIM(DNAME,'A'), LTRIM(DNAME,'AS'), LTRIM(DNAME,'ASOP')
3 FROM DEPT
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LTRIM(DNAME,'A')
---------------CCOUNTING
RESEARCH
SALES
OPERATIONS

LTRIM(DNAME,'AS')
----------------CCOUNTING
RESEARCH
LES
OPERATIONS

LTRIM(DNAME,'ASOP')
------------------CCOUNTING
RESEARCH
LES
ERATIONS

No exemplo acima, na segunda coluna foram removidas as letras "A" esquerda dos nomes
dos departamentos. Na terceira coluna foram removidas tanto a letra "A" quanto a letra "S".
Na quarta coluna foram removidas as letras "A", "S", "O" e "P" esquerda.
4.2.9 RTRIM(coluna | literal, 'caracteres')
Remove os caracteres indicados direita da coluna ou do literal. Se nenhum caracter for
especificado, sero eliminados os espaos direita.
SQL> SELECT DNAME,
2 RTRIM(DNAME,'G'), RTRIM(DNAME,'GHS'), RTRIM(DNAME,'N')
3 FROM DEPT
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

RTRIM(DNAME,'G')
---------------ACCOUNTIN
RESEARCH
SALES
OPERATIONS

RTRIM(DNAME,'GHS')
-----------------ACCOUNTIN
RESEARC
SALE
OPERATION

RTRIM(DNAME,'N')
---------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

4.2.10 SOUNDEX(coluna | literal)


Retorna uma seqncia de caracteres que representa o som das palavras contidas na coluna
ou no literal.
SQL> SELECT ENAME, SOUNDEX(ENAME)
2 FROM EMP
3 WHERE SOUNDEX(ENAME) = SOUNDEX('FRED')
ENAME
SOUNDEX(ENAME)
---------- -------------------FORD
F630

27

4.2.11 LENGTH(coluna | literal)


Retorna o nmero de caracteres (ou dgitos) na coluna ou literal especificados.
SQL> SELECT LENGTH('CURSO DE SQL'), LENGTH(DEPTNO), LENGTH(DNAME)
2 FROM DEPT
LENGTH('CURSODESQL')
LENGTH(DEPTNO)
LENGTH(DNAME)
--------------------- --------------------- --------------------12
2
10
12
2
8
12
2
5
12
2
10

4.2.12 TRANSLATE(coluna | literal, de, para)


Substitui os caracteres do argumento "de" pelos caracteres do argumento "para", na coluna
ou literal especificados. Todas as ocorrncias dos caracteres do parmetro "de" so
substitudas pelos caracteres no parmetro "para". Caracteres do parmetro "de" sem
correspondncia no parmetro "para" so removidos.
No exemplo abaixo foram trocados os caracteres "C" por "P" nos nomes dos funcionrios.
SQL> SELECT ENAME, TRANSLATE(ENAME,'C','P')
2 FROM EMP
3 WHERE DEPTNO = 10
ENAME
---------CLARK
KING
MILLER

TRANSLATE(ENAME,'C','P')
------------------------PLARK
KING
MILLER

No exemplo abaixo foram trocados "A" por "I", e "R" por "T", nos cargos.
SQL> SELECT JOB, TRANSLATE(JOB,'AR','IT')
2 FROM EMP
3 WHERE DEPTNO = 10
JOB
--------MANAGER
PRESIDENT
CLERK

TRANSLATE(JOB,'AR','IT')
-----------------------------MINIGET
PTESIDENT
CLETK

4.2.13 REPLACE(coluna | literal, de, para)


Substitui a seqncia de caracteres "de" pela seqncia de caracteres "para", na coluna ou
literal especificados.
No exemplo abaixo SALESMAN substitudo por VENDEDOR:
SQL> SELECT JOB, REPLACE(JOB,'SALESMAN','VENDEDOR')
2 FROM EMP

28

JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

REPLACE(JOB,'SALESMAN','VENDEDOR')
---------------------------------------CLERK
VENDEDOR
VENDEDOR
MANAGER
VENDEDOR
MANAGER
MANAGER
ANALYST
PRESIDENT
VENDEDOR
CLERK
CLERK
ANALYST
CLERK

14 rows selected.

No exemplo abaixo, "CO" foi substitudo por "PX":


SELECT ENAME, REPLACE(ENAME,'CO','PX')
FROM EMP
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

REPLACE(ENAME,'CO','PX')
-----------------------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SPXTT
<-------------KING
TURNER
ADAMS
JAMES
FORD
MILLER

14 rows selected.

4.2.14 Funes aninhadas


As funes que operam sobre uma nica linha podem ser aninhadas, sendo que neste caso as
funes internas so executadas antes das externas.
SQL> SELECT DNAME, LENGTH(DNAME),
2 LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))
3 FROM DEPT
DNAME
LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))
---------- -----------------------------------------------------------ACCOUNTING
10
0
RESEARCH
8
1
SALES
5
2
OPERATIONS
10
1

29

4.3

Funes numricas
4.3.1 ROUND(coluna | literal, n)
Arredonda o valor da coluna ou do literal na n-sima casa decimal. Se n for negativo
eqivale s dezenas. Se n for omitido eqivale a um nmero inteiro.
SQL> SELECT ROUND(45.923,1), ROUND(45.923), ROUND(42.323,-1),
ROUND(SAL/32,2)
2 FROM EMP
3 WHERE DEPTNO = 10
ROUND(45.923,1)
ROUND(45.923) ROUND(42.323,-1)
ROUND(SAL/32,2)
----------------- ----------------- ----------------- ----------------45.9
46
40
76.56
45.9
46
40
156.25
45.9
46
40
40.63

4.3.2 TRUNC(coluna | literal, n)


Trunca o valor da coluna ou do literal na n-sima posio.
SQL> SELECT TRUNC(45.923,1), TRUNC(45.923), TRUNC(42.323,-1),
TRUNC(SAL/32,2)
2 FROM EMP
3 WHERE DEPTNO = 10
TRUNC(45.923,1)
TRUNC(45.923) TRUNC(42.323,-1)
TRUNC(SAL/32,2)
----------------- ----------------- ----------------- ----------------45.9
45
40
76.56
45.9
45
40
156.25
45.9
45
40
40.62

4.3.3 CEIL(coluna | literal)


Retorna o menor inteiro maior ou igual ao valor da coluna ou do literal.
SQL> SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1)
2 FROM EMP
3 WHERE SAL BETWEEN 3000 AND 5000
CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1)
--------- ---------- ------------ ----------3000
100
102
-11
5000
100
102
-11
3000
100
102
-11

4.3.4 FLOOR(coluna | literal)


Retorna o maior inteiro menor ou igual ao valor da coluna ou literal.
SQL> SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1)
2 FROM EMP
3 WHERE FLOOR(SAL) BETWEEN 3000 AND 5000

30

FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1)


---------- ----------- ------------- -----------3000
99
101
-12
5000
99
101
-12
3000
99
101
-12

4.3.5 POWER(coluna | literal, n)


Eleva a coluna ou literal a n-sima potncia.
SQL> SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5)
2 FROM EMP
3 WHERE DEPTNO = 10
SAL
POWER(SAL,2)
POWER(SAL,3)
POWER(50,5)
----------------- ----------------- ----------------- ----------------2450
6002500
14706125000
312500000
5000
25000000
125000000000
312500000
1300
1690000
2197000000
312500000

4.3.6 EXP(coluna | literal)


Eleva e (2.71828183...) coluna ou literal.
SELECT EXP(4)
FROM
DUAL
EXP(4)
---------54.59815
1 row selected.

4.3.7 LOG(base, coluna | literal)


Calcula o logaritmo da coluna ou do literal na base especificada.
SELECT LOG(10,100)
FROM
DUAL
LOG(10,100)
----------2
1 row selected.

4.3.8 LN(coluna | literal)


Calcula o logaritmo neperiano da coluna ou do literal.
SELECT LN(95)
FROM
DUAL
LN(95)
---------4.55387689

4.3.9 SQRT(coluna | literal)


Retorna a raiz quadrada da coluna ou do literal.

31

SQL> SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM)


2 FROM EMP
3 WHERE COMM > 0
SAL
SQRT(SAL)
SQRT(40)
SQRT(COMM)
---- ----------------- ----------------- ----------------1600
40 6.324555320336759 17.32050807568877
1250 35.35533905932738 6.324555320336759 22.3606797749979
1250 35.35533905932738 6.324555320336759 37.41657386773941

4.3.10 SIGN(coluna | literal)


Retorna -1 se o valor da coluna ou do literal for negativo, retorna 0 se for igual a zero, ou
retorna 1 se for maior do que zero.
SQL> SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL)
2 FROM EMP
3 WHERE DEPTNO = 30
SAL-COMM
SIGN(SAL-COMM)
COMM-SAL
SIGN(COMM-SAL)
----------------- ----------------- ----------------- ----------------1300
1
-1300
-1
750
1
-750
-1
-150
-1
150
1
1500
1
-1500
-1

Salrios maiores do que a comisso podem ser listados conforme mostrado abaixo:
SQL> SELECT ENAME, SAL, COMM
2 FROM EMP
3 WHERE SIGN(SAL-COMM) = 1
ENAME
SAL
COMM
---------- ----------------- ----------------ALLEN
1600
300
WARD
1250
500
TURNER
1500
0

4.3.11 ABS(coluna | literal)


Retorna o valor absoluto da coluna ou do literal.
SQL> SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL)
2 FROM EMP
3 WHERE DEPTNO = 30
SAL
COMM
COMM-SAL
ABS(COMM-SAL)
----------------- ----------------- ----------------- ----------------1600
300
-1300
1300
1250
500
-750
750
1250
1400
150
150
2850
1500
0
-1500
1500
950

4.3.12 MOD(valor1, valor2)


Retorna o resto da diviso de valor1 por valor2.

32

SQL>
2
3
4

SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40)


FROM EMP
WHERE DEPTNO = 30
ORDER BY COMM

SAL
COMM
MOD(SAL,COMM)
MOD(100,40)
----------------- ----------------- ----------------- ----------------1500
0
1500
20
1600
300
100
20
1250
500
250
20
1250
1400
1250
20
2850
20
950
20

4.3.13 Funes trigonomtricas


Calculam o seno (SIN), coseno (COS), e tangente (TAN) da coluna ou literal.
SELECT SIN(30*3.141592654/180),
COS(60*3.141592654/180),
TAN(45*3.141592654/180)
FROM
DUAL
SIN(30*3.1
---------.5

COS(60*3.1
---------.5

TAN(45*3.1
---------1

4.3.14 Funes hiperblicas


Calculam o seno hiperblico (SINH), coseno hiperblico (COSH) e tangente hiperblica
(TANH) da coluna ou literal.
SELECT SINH(1), COSH(0), TANH(.5)
FROM
DUAL
SINH(1)
---------1.17520119

4.4

COSH(0)
------1

TANH(.5)
---------.462117157

Exerccios
a) Listar o nmero do departamento, o nome do funcionrio, e o salrio com aumento de
15% expresso em nmero inteiro.
DEPTNO
----------------20
30
30
20
30
30
10
20
10
30
20
30
20
10

ENAME
PCTSAL
---------- ----------------SMITH
920
ALLEN
1840
WARD
1438
JONES
3421
MARTIN
1438
BLAKE
3278
CLARK
2818
SCOTT
3450
KING
5750
TURNER
1725
ADAMS
1265
JAMES
1093
FORD
3450
MILLER
1495

33

b) Gerar a listagem mostrada a seguir:


EMPREGADO_E_CARGO
-------------------SMITH
CLERK
ALLEN
SALESMAN
WARD
SALESMAN
JONES
MANAGER
MARTIN
SALESMAN
BLAKE
MANAGER
CLARK
MANAGER
SCOTT
ANALYST
KING
PRESIDENT
TURNER
SALESMAN
ADAMS
CLERK
JAMES
CLERK
FORD
ANALYST
MILLER
CLERK
14 rows selected.

c) Listar uma lista contendo todos os empregados com um identificador composto pelas duas
primeiras letras de seus cargos, os dois dgitos do meio de seus nmeros de matrcula, e o
cdigo sonoro de seus nomes.
NOME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

CODIGO
-------CL36S530
SA49A450
SA52W630
MA56J520
SA65M635
MA69B420
MA78C462
AN78S300
PR83K520
SA84T656
CL87A352
CL90J520
AN90F630
CL93M460

d) Faa uma procura no sensitiva a letras maisculas ou minsculas por um cargo fornecido
pelo usurio.
EMPNO
----7369
7876
7900
7934

ENAME
---------SMITH
ADAMS
JAMES
MILLER

JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ----- --------- ----- ----- -----CLERK
7902 13-JUN-83
800
20
CLERK
7788 04-JUN-84 1100
20
CLERK
7698 23-JUL-84
950
30
CLERK
7782 21-NOV-83 1300
10

e) Imprima os nomes dos departamentos centrados em um campo com largura de 20


posies.
DEPARTAMENTO
-------------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

34

f) Encontrar a primeira ocorrncia da letra "L" nos nomes dos empregados e substituir pela
letra "X".
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

PRIMEIRA_OCORRENCIA_
-------------------SMITH
AXLEN
WARD
JONES
MARTIN
BXAKE
CXARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MIXLER

14 rows selected.

35

4.5

Respostas dos exerccios


a)
SQL> SELECT DEPTNO, ENAME, ROUND (SAL*1.15) PCTSAL
2 FROM EMP
b)
SQL> SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPREGADO_E_CARGO
2 FROM EMP
c)
SQL> SELECT ENAME NOME,
2 SUBSTR(JOB,1,2)||SUBSTR(EMPNO,2,2)||SOUNDEX(ENAME) CODIGO
3 FROM EMP
d)
SQL> SELECT *
2 FROM EMP
3 WHERE UPPER(JOB) = UPPER ('&JOB')
Enter value for job: clerk
old
3: WHERE UPPER(JOB) = UPPER ('&JOB')
new
3: WHERE UPPER(JOB) = UPPER ('clerk')
e)
SQL> SELECT LPAD(' ',(20-LENGTH(DNAME))/2)||DNAME DEPARTAMENTO
2 FROM DEPT
f)
SQL>
2
3
4

SELECT ENAME,
TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')||
SUBSTR(ENAME,INSTR(ENAME,'L')+1) PRIMEIRA_OCORRENCIA_DE_L
FROM EMP

36

Captulo 5: Funes de Data e de Converso


5.1

Objetivos deste captulo


Este captulo mostra as funes do Oracle que manipulam datas e fazem a converso de tipo
de dados.

5.2

Funes que manipulam datas


5.2.1 SYSDATE
SYSDATE uma pseudo-coluna que retorna a data e a hora corrente. A tabela SYS.DUAL
pblica, contm apenas uma coluna chamada DUMMY, e uma linha com o valor 'X'. Esta
tabela til para retornar um nico valor de uma constante, de uma pseudo-coluna, ou de
uma expresso. Abaixo a tabela SYS.DUAL foi utilizada para retornar a data corrente.
SQL> SELECT SYSDATE
2 FROM SYS.DUAL
SYSDATE
--------25-OCT-94

5.2.2 Aritmtica de datas


Datas podem ser somadas ou subtradas de outras datas, ou de valores numricos.
data+nmero
data-nmero
data-data
data+nmero/24

Soma o nmero de dias data, produzindo outra data


Subtrai o nmero de dias data, produzindo outra data
Subtrai uma data da outra, produzindo nmero de dias
Soma nmero de horas data, produzindo outra data

SQL> SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE-HIREDATE


2 FROM EMP
3 WHERE HIREDATE LIKE '%JUN%'
HIREDATE
--------13-JUN-83
11-JUN-84
04-JUN-84
04-JUN-84

HIREDATE+7
---------20-JUN-83
18-JUN-84
11-JUN-84
11-JUN-84

HIREDATE-7
---------06-JUN-83
04-JUN-84
28-MAY-84
28-MAY-84

SYSDATE-HIREDATE
----------------4152.351851851852
3788.351851851852
3795.351851851852
3795.351851851852

A operao SYSDATE-HIREDATE retorna o nmero de dias entre a admisso do


empregado e a data atual.
5.2.3 MONTHS_BETWEEN(data1,data2)
Retorna o nmero de meses decorridos entre data1 e data2.
SQL>
2
3
4

SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE),
MONTHS_BETWEEN('01-JAN-84','05-NOV-88')
FROM EMP
WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE) > 59

37

MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-JAN-84','05-NOV-88'
-------------------------------- -------------------------------------136.3985293458781
-58.1290322580645
134.3340132168459
-58.1290322580645
126.9791745071685
-58.1290322580645
131.8178841845878
-58.1290322580645
130.6565938620072
-58.1290322580645
124.4630454749104
-58.1290322580645
125.366271281362
-58.1290322580645
127.6565938620072
-58.1290322580645
123.5275616039427
-58.1290322580645
124.6888519265233
-58.1290322580645
124.6888519265233
-58.1290322580645
123.0759487007168
-58.1290322580645
130.6565938620072
-58.1290322580645
131.1404648297491
-58.1290322580645
14 rows selected.

5.2.4 ADD_MONTHS(data, meses)


Adiciona o nmero de meses especificados data.
SQL> SELECT HIREDATE, ADD_MONTHS(HIREDATE,3), ADD_MONTHS(HIREDATE,-3)
2 FROM EMP
3 WHERE DEPTNO=20
HIREDATE
--------13-JUN-83
31-OCT-83
05-MAR-84
04-JUN-84
05-DEC-83

ADD_MONTHS(HIREDATE,3)
---------------------13-SEP-83
31-JAN-84
05-JUN-84
04-SEP-84
05-MAR-84

ADD_MONTHS(HIREDATE,-3)
----------------------13-MAR-83
31-JUL-83
05-DEC-83
04-MAR-84
05-SEP-83

5.2.5 NEXT_DAY(data, dia_da_semana)


Data do prximo dia da semana aps data.
SQL> SELECT HIREDATE, NEXT_DAY(HIREDATE,'FRIDAY'), NEXT_DAY(HIREDATE,6)
2 FROM EMP
3 WHERE DEPTNO = 10
HIREDATE
--------14-MAY-84
09-JUL-84
21-NOV-83

NEXT_DAY(HIREDATE,'FRIDAY')
--------------------------18-MAY-84
13-JUL-84
25-NOV-83

NEXT_DAY(HIREDATE,6)
-------------------18-MAY-84
13-JUL-84
25-NOV-83

5.2.6 LAST_DAY(data)
Retorna a data do ltimo dia do ms da data especificada.
SQL>
2
3
4

SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE,


LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88')
FROM EMP
WHERE DEPTNO = 20

38

SYSDATE
--------25-OCT-94
25-OCT-94
25-OCT-94
25-OCT-94
25-OCT-94

LAST_DAY
(SYSDATE)
---------31-OCT-94
31-OCT-94
31-OCT-94
31-OCT-94
31-OCT-94

HIREDATE
--------13-JUN-83
31-OCT-83
05-MAR-84
04-JUN-84
05-DEC-83

LAST_DAY
(HIREDATE)
---------30-JUN-83
31-OCT-83
31-MAR-84
30-JUN-84
31-DEC-83

LAST_DAY
('15-FEB-88')
------------29-FEB-88
29-FEB-88
29-FEB-88
29-FEB-88
29-FEB-88

5.2.7 ROUND(data)
ROUND(data, 'MONTH')
ROUND(data, 'YEAR')
ROUND(data) retorna a data com a indicao da hora como sendo zero horas (meia noite).
At o meio dia retorna a mesma data, aps o meio dia retorna o dia seguinte. Esta funo
til quando so comparadas datas com horas diferentes.
ROUND(data, 'MONTH') retorna o primeiro dia do ms da data, se a data estiver na
primeira quinzena, ou retorna o primeiro dia do ms seguinte, se a data estiver na segunda
quinzena.
ROUND(data, 'YEAR') retorna o primeiro dia do ano da data, se a data estiver no primeiro
semestre, ou retorna o primeiro dia do ano seguinte, se a data estiver no segundo semestre.
SQL> SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR')
2 FROM SYS.DUAL
SYSDATE
ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR')
--------- ---------------------- --------------------25-OCT-94 01-NOV-94
01-JAN-95

5.2.7 TRUNC(data)
TRUNC(data, 'MONTH')
TRUNC(data, 'YEAR')
TRUNC(data) retorna a data com o tempo indicando zero horas.
TRUNC(data,'MONTH') retorna o primeiro dia do ms da data.
TRUNC(data,'YEAR') retorna o primeiro dia do ano da data.
SQL> SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR')
2 FROM SYS.DUAL
SYSDATE
TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR')
--------- ---------------------- --------------------25-OCT-94 01-OCT-94
01-JAN-94

5.3

Funes de converso
5.3.1 Formatos de Data
Formato
CC ou SCC
YYYY ou SYYYY
YYY, YY, Y

Significado
Sculo; S prefixa datas Antes de Cristo com "-"
Ano; S prefixa datas Antes de Cristo com "-"
ltimos 3,2,1 dgitos do ano
39

Y,YYY
YEAR ou SYEAR
BC ou AD
B.C. ou A.D.
Q
MM
Month
MON
WW ou W
DDD, DD, D
DAY
DY
J
AM ou PM
A.M. ou P.M.
HH ou HH12
HH24
MI
SS
SSSS
/., etc...
"..."

Ano com vrgula separando os milhares


Ano por extenso. S prefixa datas Antes de Cristo com ""
Indicador de Antes ou Depois de Cristo
Idntico a BC/AD com pontos
Quarto do ano (trimestre)
Ms
Ms por extenso, com 9 caracteres, espaos direita
Nome do ms, com 3 caracteres
Semana do ano ou do ms
Dia do ano, do ms, ou da semana
Dia por extenso, com 9 caracteres, espaos direita
Nome do dia, abreviado com 3 caracteres
Dia Juliano (dias desde 31/12/4713 AC)
Indicador de meridiano
Indicador de meridiano com pontos
Hora do dia no intervalo 1 a 12
Hora do dia no intervalo 0 a 23
Minuto
Segundo
Segundos aps meia noite (0-86399)
Pontuao reproduzida no resultado
Caracteres entre aspas reproduzido no resultado

Notas:
1 - O prefixo 'fm' (fill mode) antes de MONTH ou DAY suprime os espaos direita
2 - O sufixo 'TH' produz nmeros ordinais ("DDTH" para "4TH")
3 - O sufixo 'SP' produz nmeros por extenso ("DDSP" para "FOUR")
4 - O sufixo 'SPTH' para nmeros ordinais por extenso ("DDSPTH" para "FOURTH")
5 - Os cdigos so sensitivos a caracteres maisculos e minsculos
5.3.2 TO_CHAR(nmero|data,['formato'])
Converte nmero ou data em caracter no formato especificado.
SQL> SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')
2 FROM SYS.DUAL
TO_CHAR(SYSDATE,'DAYDDTHMONTHYYYY')
----------------------------------TUESDAY
,25TH OCTOBER
1994

Adicionando-se o prefixo fm (fill mode) para remover os espaos, e utilizando-se letras


maisculas e minsculas temos:
40

SQL> SELECT TO_CHAR(SYSDATE, 'fmDay, ddth Month YYYY')


2 FROM SYS.DUAL
TO_CHAR(SYSDATE,'FMDAY,DDTHMONTHYYYY')
-------------------------------------Tuesday, 25th October 1994

A funo TO_CHAR pode ser usada para extrair a hora do dia apenas.
SQL> SELECT TO_CHAR(SYSDATE, 'HH:MI:SS')
2 FROM SYS.DUAL
TO_CHAR(SYSDATE,'HH:MI:SS')
--------------------------08:39:51

A funo TO_CHAR pode ser usada para converter nmeros em caracteres aplicando a
formatao desejada.
SQL> SELECT TO_CHAR(SAL,'$9,999')
2 FROM EMP
TO_CHAR(SAL,'$9,999')
--------------------$800
$1,600
$1,250
$2,975
$1,250
$2,850
$2,450
$3,000
$5,000
$1,500
$1,100
$950
$3,000
$1,300
14 rows selected.

5.3.3 Formatos Numricos


Formato
9
0
$
.
,
MI
PR
EEEE
V
B

Significado
posio numrica (um 9 para cada nmero)
zeros esquerda
cifro esquerda
ponto decimal na posio especificada
vrgula na posio especificada
sinal de menos direita
nmeros negativos entre parnteses
notao cientfica
multiplicar por 10 elevado a n, sendo n o
nmero de 9 direita de V
mostrar resultados zero como espaos, no
como 0.
41

Exemplo
999999
099999
$99999
999999.99
999,999
099999MI
999999PR
99.999EEEE
9999V99
B9999.99

1234
001234
$1234
1234.00
1,234
1234(1234)
1.234E+03
123400
1234.00

5.3.4 TO_NUMBER(cadeia_de_caracteres)
Converte a cadeia de caracteres, que deve conter um nmero, em um valor numrico.
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 WHERE SAL > TO_NUMBER('1500')
EMPNO
----7499
7566
7698
7782
7788
7839
7902

ENAME
---------ALLEN
JONES
BLAKE
CLARK
SCOTT
KING
FORD

JOB
SAL
--------- ------SALESMAN
1600
MANAGER
2975
MANAGER
2850
MANAGER
2450
ANALYST
3000
PRESIDENT
5000
ANALYST
3000

7 rows selected.

5.3.5 TO_DATE('cadeia_de_caracteres','formato')
Retorna a data contida na cadeia de caracteres conforme o formato especificado. Se o
formato for omitido ser assumido DD-MON-YY.
SQL> SELECT EMPNO, ENAME, HIREDATE
2 FROM EMP
3 WHERE HIREDATE = TO_DATE('June 4,1984','Month dd,yyyy')
EMPNO
----7844
7876

5.4

ENAME
---------TURNER
ADAMS

HIREDATE
--------04-JUN-84
04-JUN-84

Funes que aceitam qualquer tipo de dado


5.4.1 DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default)
Funciona como uma estrutura CASO, substituindo as pesquisas pelos resultados. A coluna
ou expresso comparada com os argumentos de pesquisa, e se houver igualdade o
resultado correspondente retornado. Se no houver igualdade, o valor default retornado.
Argumentos:
coluna|expresso
pes1
res1
pes2
res2
default

a coluna ou expresso a ser avaliada


o primeiro valor a ser testado
o valor a ser retornado se coluna ou expresso igual a pes1
o segundo valor a ser testado
o valor a ser retornado se coluna ou expresso igual a pes2
o valor a ser retornado se a coluna ou expresso for diferente
de pes1, pes2,...,pesN.

Notas:
42

-coluna ou expresso podem ser de qualquer tipo de dados.


-pes(quisa) deve ter o mesmo tipo de dados da coluna ou expresso
-O valor retornado sempre do mesmo tipo do terceiro argumento (resultado1)
No exemplo abaixo o cargo CLERK transformado em WORKER, o cargo MANAGER
transformado em BOSS, e os demais cargos so transformados em UNDEFINED.
SQL>
2
3
4

SELECT ENAME, JOB,


DECODE(JOB, 'CLERK','WORKER','MANAGER','BOSS','UNDEFINED')
DECODED_JOB
FROM EMP

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

DECODED_JOB
----------WORKER
UNDEFINED
UNDEFINED
BOSS
UNDEFINED
BOSS
BOSS
UNDEFINED
UNDEFINED
UNDEFINED
WORKER
WORKER
UNDEFINED
WORKER

Para mostrar as percentagens de bnus relativas s faixas salariais:


SQL> SELECT GRADE,
2 DECODE(GRADE,'1','15%','2','10%','3','8%','5%') BONUS
3 FROM SALGRADE
GRADE
----1
2
3
4
5

BONUS
----15%
10%
8%
5%
5%

O exemplo abaixo causa um erro porque ename (caracter) tem tipo diferente do terceiro
argumento sal (numrico).
SQL> SELECT * FROM EMP
2 ORDER BY DECODE(2,1,SAL,2,ENAME,SAL)
*
ERROR: ORA-01722: invalid number
no rows selected

Para fazer um aumento salarial diferenciado por cargo:


SQL>
2
3
4

SELECT JOB, SAL,


DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15,
'MANAGER',SAL*0.95, SAL) SALARIO_DECODIFICADO
FROM EMP

43

JOB
SAL SALARIO_DECODIFICADO
--------- ------- -------------------CLERK
800
920
SALESMAN
1600
1600
SALESMAN
1250
1250
MANAGER
2975
2826.25
SALESMAN
1250
1250
MANAGER
2850
2707.5
MANAGER
2450
2327.5
ANALYST
3000
3300
PRESIDENT
5000
5000
SALESMAN
1500
1500
CLERK
1100
1265
CLERK
950
1092.5
ANALYST
3000
3300
CLERK
1300
1495
14 rows selected.

5.4.2 NVL(coluna|valor, valor)


Converte valores nulos do primeiro argumento no valor especificado no segundo argumento.
SQL> SELECT SAL*12+NVL(COMM,0), NVL(COMM,1000), SAL*12+NVL(COMM,1000)
2 FROM EMP
3 WHERE DEPTNO = 10
SAL*12+NVL(COMM,0)
NVL(COMM,1000) SAL*12+NVL(COMM,1000)
------------------ ----------------- --------------------29400
1000
30400
60000
1000
61000
15600
1000
16600

5.4.3 GREATEST(coluna|valor, coluna|valor,...)


Retorna o maior dos valores de uma lista de valores.
SQL> SELECT GREATEST(1000,2000), GREATEST(SAL,COMM)
2 FROM EMP
3 WHERE DEPTNO = 30
GREATEST(1000,2000) GREATEST(SAL,COMM)
------------------- -----------------2000
1600
2000
1250
2000
1400
2000
2000
1500
2000
6 rows selected.

5.4.4 LEAST(coluna|valor, coluna|valor,...)


Retorna o menor dos valores de uma lista de valores.
SQL> SELECT LEAST(1000,2000), LEAST(SAL,COMM)
2 FROM EMP
3 WHERE DEPTNO = 30
LEAST(1000,2000)
LEAST(SAL,COMM)
----------------- -----------------

44

1000
1000
1000
1000
1000
1000

300
500
1250
0

5.4.5 VSIZE(coluna|valor)
Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o valor.
SQL>
2
3
4

SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE),


VSIZE(SAL), VSIZE(ENAME)
FROM EMP
WHERE DEPTNO = 10

DEPTNO
VSIZE(DEPTNO) VSIZE(HIREDATE)
VSIZE(SAL)
VSIZE(ENAME)
------- --------------- --------------- --------------- --------------10
2
7
3
5
10
2
7
2
4
10
2
7
2
6

5.4.5 Funes aninhadas revisitadas


SQL> SELECT ENAME, NVL(TO_CHAR(MGR),'NAO GERENCIAVEL')
2 FROM EMP
3 WHERE MGR IS NULL
ENAME
NVL(TO_CHAR(MGR),'NAOGERENCIAVEL')
---------- ---------------------------------KING
NAO GERENCIAVEL
SQL>
2
3
4

SELECT SYSDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),
'Day dd Month YYYY')
FROM SYS.DUAL

SYSDATE
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY')
--------- -------------------------------------------------------25-OCT-94 Friday
30 December 1994

5.5

Exerccios
a) Mostrar o nome e a data de admisso dos empregados do departamento 20. Utilize o alis
DATA_DE_ADMISSAO para o nome da coluna.
ENAME
---------SMITH
JONES
SCOTT
ADAMS
FORD

DATA_DE_ADMISSAO
--------------------------June, Thirteenth 1983
October, Thirty-First 1983
March, Fifth 1984
June, Fourth 1984
December, Fifth 1983

b) Exibir o nome de cada empregado, juntamente com a data de admisso e a data de reviso
do salrio. Assuma a data de reviso um ano aps a data de admisso. Classificar a sada em
ordem ascendente da data de reviso do salrio.
ENAME

HIREDATE

REVISAO

45

---------SMITH
ALLEN
JONES
MILLER
MARTIN
FORD
SCOTT
WARD
CLARK
TURNER
ADAMS
BLAKE
KING
JAMES

--------13-JUN-83
15-AUG-83
31-OCT-83
21-NOV-83
05-DEC-83
05-DEC-83
05-MAR-84
26-MAR-84
14-MAY-84
04-JUN-84
04-JUN-84
11-JUN-84
09-JUL-84
23-JUL-84

--------13-JUN-84
15-AUG-84
31-OCT-84
21-NOV-84
05-DEC-84
05-DEC-84
05-MAR-85
26-MAR-85
14-MAY-85
04-JUN-85
04-JUN-85
11-JUN-85
09-JUL-85
23-JUL-85

c) Imprimir uma lista de empregados mostrando o salrio, se este for superior a 1500. Se o
salrio for inferior a 1500 deve ser exibido ABAIXO DE 1500, e se for igual a 1500 deve ser
exibido NO LIMITE.
ENAME
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

SALARIO
-------------ABAIXO DE 1500
1600
2850
2450
3000
ABAIXO DE 1500
2975
5000
ABAIXO DE 1500
ABAIXO DE 1500
3000
ABAIXO DE 1500
NO LIMITE
ABAIXO DE 1500

d) Escreva uma consulta que retorne o dia da semana para qualquer data entrada no formato
DD.MM.YY.
DIA
-------SATURDAY

e) Escreva uma consulta que retorne o tempo que o empregado est trabalhando para a
empresa.
ENAME
TEMPO DE SERVICO
---------- ---------------KING
10 ANOS 3 MESES

f) Dada uma cadeia de caracteres no formato 'nn/nn', verifique se os dois primeiros e os dois
ltimos caracteres so numricos, e se o caracter do meio uma '/'. Imprima a expresso
'SIM' se for vlido, e 'NAO' se no for vlido. Experimente as expresses '12/34','01/1a','e
'99\88'.
VALOR VALIDO?
----- ------12/34 SIM

46

g) Empregados admitidos at o dia 15, inclusive, so pagos na ltima sexta-feira do ms.


Empregados admitidos aps o dia 15 so pagos na ltima sexta-feira do ms seguinte.
Imprima uma relao contendo os nome dos empregados, as datas de admisso, e a primeira
data de pagamento.
ENAME
---------SMITH
ALLEN
JONES
MILLER
MARTIN
FORD
SCOTT
WARD
CLARK
TURNER
ADAMS
BLAKE
KING
JAMES

HIREDATE
--------13-JUN-83
15-AUG-83
31-OCT-83
21-NOV-83
05-DEC-83
05-DEC-83
05-MAR-84
26-MAR-84
14-MAY-84
04-JUN-84
04-JUN-84
11-JUN-84
09-JUL-84
23-JUL-84

DIA_DO_PAGAMENTO
---------------24-JUN-83
26-AUG-83
25-NOV-83
30-DEC-83
30-DEC-83
30-DEC-83
30-MAR-84
27-APR-84
25-MAY-84
29-JUN-84
29-JUN-84
29-JUN-84
27-JUL-84
31-AUG-84

14 rows selected.

47

5.6

Respostas dos exerccios


a)SQL> SELECT ENAME,
2 TO_CHAR(HIREDATE,'fmMonth, Ddspth YYYY') DATA_DE_ADMISSAO
3 FROM EMP
4 WHERE DEPTNO = 20
b)SQL> SELECT ENAME, HIREDATE, ADD_MONTHS(HIREDATE,12) REVISAO
2 FROM EMP
3 ORDER BY ADD_MONTHS(HIREDATE,12)
c)SQL> SELECT ENAME,
2 DECODE(SIGN(1500-SAL),1,'ABAIXO DE 1500',0,'NO LIMITE',SAL)
3 SALARIO
4 FROM EMP
5 ORDER BY ENAME
d)SQL> SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DIA
2 FROM SYS.DUAL
Enter value for anydate: 12.11.88
old
1: SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DIA
new
1: SELECT TO_CHAR(TO_DATE('12.11.88','DD.MM.YY'),'DAY') DIA
e)SQL> DEFINE TIME = MONTHS_BETWEEN(SYSDATE,HIREDATE)
SQL> SELECT ENAME, FLOOR(&TIME/12)||' ANOS '||
2 FLOOR(MOD(&TIME,12))||' MESES ' "TEMPO DE SERVICO"
3 FROM EMP
4 WHERE ENAME = UPPER('&NOME_DO_EMPREGADO')
old
1: SELECT ENAME, FLOOR(&TIME/12)||' ANOS '||
new
1: SELECT ENAME, FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)||'
ANOS '||
old
2: FLOOR(MOD(&TIME,12))||' MESES ' "TEMPO DE SERVICO"
new
2: FLOOR(MOD(MONTHS_BETWEEN(SYSDATE,HIREDATE),12))||' MESES '
"TEMPO DE SERVICO"
Enter value for nome_do_empregado: king
old
4: WHERE ENAME = UPPER('&NOME_DO_EMPREGADO')
new
4: WHERE ENAME = UPPER('king')
f)SQL> SELECT '12/34' VALOR,
2 DECODE(TRANSLATE('12/34','1234567890','9999999999'),
3 '99/99','SIM','NAO') "VALIDO?"
4 FROM SYS.DUAL
g)SQL> SELECT ENAME, HIREDATE,
2 DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-15),
3 1,NEXT_DAY(LAST_DAY(ADD_MONTHS(HIREDATE,1)),'FRIDAY')-7,
4 NEXT_DAY(LAST_DAY(HIREDATE),'FRIDAY')-7) DIA_DO_PAGAMENTO
5 FROM EMP
6 ORDER BY HIREDATE
ou
SQL>
2
3
4
5

SELECT ENAME, HIREDATE,


NEXT_DAY(LAST_DAY(ROUND(HIREDATE,'MONTH'))-7,'FRIDAY')
DIA_DO_PAGAMENTO
FROM EMP
ORDER BY HIREDATE

48

Capitulo 6: Funes de Grupo


6.1

Objetivos deste captulo


Este captulo explica como informaes sumarizadas (mdia, mximo, mnimo,...) podem
ser obtidas para grupo de linhas.
As funes vistas anteriormente operavam sobre cada linha, enquanto que as funes
mostradas neste captulo operam sobre um grupo de linhas.

6.2

Funes disponveis
Funo
AVG
([DISTINCT|ALL]n)
COUNT
([DISTINCT|ALL]exp*)
MAX
([DISTINCT|ALL]exp)
MIN
([DISTINCT|ALL]exp)
STDDEV
([DISTINCT|ALL]n)
SUM
([DISTINCT|ALL]n)
VARIANCE
([DISTINCT|ALL]n)

Valor retornado
Valor mdio de 'n', ignorando os valores nulos.
Nmero de ocorrncias no nulas da expresso. O '*'
obriga a contagem total, incluindo valores duplicados e
nulos.
Valor mximo da expresso.
Valor mnimo da expresso.
Desvio padro de 'n', ignorando os valores nulos.
Soma dos valores de 'n', ignorando os valores nulos.
Varincia de 'n', ignorando os valores nulos.

Quando DISTINCT especificado, somente os valores no duplicados so considerados pela


funo, caso contrrio ALL assumido, considerando todos os valores, inclusive os
duplicados.
Todas as funes de grupo, exceto COUNT(*), ignoram os valores nulos.
Podem ser fornecidas expresses dos tipos caracter, nmero ou data quando 'exp' estiver
indicado. Quando 'n' estiver indicado, somente valores numricos so aceitos.
6.3

Usando funes de grupo


Para calcular o salrio mdio de todos os empregados:
SQL> SELECT AVG(SAL)
2 FROM EMP
AVG(SAL)
----------------2073.214285714286

Note que toda a tabela EMP foi tratada como um nico grupo.
49

Uma funo de grupo pode ser aplicada sobre um subconjunto das linhas usando a clusula
WHERE.
Para encontrar o salrio mnimo recebido por um CLERK:
SQL> SELECT MIN(SAL)
2 FROM EMP
3 WHERE JOB='CLERK'
MIN(SAL)
----------------800

Para contar o nmero de empregados que trabalham no departamento 20:


SQL> SELECT COUNT(*)
2 FROM EMP
3 WHERE DEPTNO = 20
COUNT(*)
----------------5

6.4

A clusula GROUP BY
A clusula GROUP BY utilizada para dividir as linhas das tabelas em grupos. Funes de
grupo podem ser utilizadas para retornar informaes sumarizadas para cada grupo.
Para calcular o salrio mdio de cada cargo:
SQL> SELECT JOB, AVG(SAL)
2 FROM EMP
3 GROUP BY JOB
JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
MANAGER
2758.333333333333
PRESIDENT
5000
SALESMAN
1400

6.5

Excluindo linhas dos grupos


A clusula WHERE pode ser utilizada para excluir linhas, antes que estas sejam grupadas.
Para mostrar o salrio mdio de cada cargo, excluindo os gerentes:
SQL>
2
3
4

SELECT JOB, AVG(SAL)


FROM EMP
WHERE JOB != 'MANAGER'
GROUP BY JOB

JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5

50

PRESIDENT
SALESMAN

6.6

5000
1400

Grupos dentro de grupos


Os grupos podem conter subgrupos, fornecendo resultados para grupos dentro de grupos.
Para listar o salrio mdio de cada cargo em cada departamento:
SQL> SELECT DEPTNO, JOB, AVG(SAL)
2 FROM EMP
3 GROUP BY DEPTNO, JOB
DEPTNO
----------------10
10
10
20
20
20
30
30
30

JOB
AVG(SAL)
--------- ----------------CLERK
1300
MANAGER
2450
PRESIDENT
5000
ANALYST
3000
CLERK
950
MANAGER
2975
CLERK
950
MANAGER
2850
SALESMAN
1400

9 rows selected.

6.7

Funes de grupo e resultados individuais


A declarao abaixo mostra o salrio mximo para cada tipo de cargo. O resultado no
muito significativo pois no mostra o cargo, mas mostra que no h obrigao de listar as
colunas pelas quais o grupamento realizado.
SQL> SELECT MAX(SAL)
2 FROM EMP
3 GROUP BY JOB
MAX(SAL)
----------------3000
1300
2975
5000
1600

Tambm no h necessidade de colocar as colunas a serem grupadas antes das outras:


SQL> SELECT MAX(SAL), JOB
2 FROM EMP
3 GROUP BY JOB
MAX(SAL)
----------------3000
1300
2975
5000
1600

JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

Lembre-se que quando funes de grupo so includas na clusula SELECT, todas as


colunas que no contm funo de grupo devem aparecer na clusula GROUP BY.
51

O exemplo abaixo mostra o erro causado pela utilizao da funo de grupo MIN(SAL), sem
haver a clusula GROUP BY em DEPTNO:
SQL> SELECT DEPTNO, MIN(SAL)
2 FROM EMP
SELECT DEPTNO, MIN(SAL)
*
ERROR at line 1:
ORA-00937: not a single-group group function

Grupando-se por DEPTNO o comando processa corretamente.


SQL> SELECT DEPTNO, MIN(SAL)
2 FROM EMP
3 GROUP BY DEPTNO
DEPTNO
MIN(SAL)
----------------- ----------------10
1300
20
800
30
950

Toda coluna ou expresso da clusula SELECT que no uma


funo de agregao deve aparecer na clusula GROUP BY.
6.8

A clusula HAVING
Somente os grupos que atendem as condies especificadas na clusula HAVING so
selecionados. A clusula HAVING opera sobre a clusula GROUP BY de maneira
semelhante a que a clusula WHERE opera sobre a clusula SELECT.
Para mostrar o salrio mdio dos departamento que possuem mais de trs funcionrios:
SQL>
2
3
4

SELECT DEPTNO, AVG(SAL)


FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*) > 3
DEPTNO
AVG(SAL)
----------------- ----------------20
2175
30 1566.666666666667

Para mostrar os cargos com salrio mximo acima de 3000:


SQL>
2
3
4

SELECT JOB, MAX(SAL)


FROM EMP
HAVING MAX(SAL) >= 3000
GROUP BY JOB

JOB
MAX(SAL)
--------- ----------------ANALYST
3000
PRESIDENT
5000

52

Embora a clusula HAVING possa ser escrita antes da clusula GROUP BY, a leitura tornase mais fcil quando a clusula HAVING aparece aps a clusula GROUP BY. Os grupos
so formados e as funes de grupo so calculadas antes da clusula HAVING ser aplicada.
A clusula WHERE no pode ser usada para restringir os grupos a serem retornados. A
clusula WHERE na declarao abaixa ilegal:
SQL>
2
3
4

SELECT DEPTNO, AVG(SAL)


FROM EMP
WHERE AVG(SAL) > 2000
GROUP BY DEPTNO

WHERE AVG(SAL) > 2000


*
ERROR at line 3:
ORA-00934: group function is not allowed here

A clusula HAVING deve ser usada neste caso.


SQL>
2
3
4

SELECT DEPTNO, AVG(SAL)


FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) > 2000

DEPTNO
AVG(SAL)
----------------- ----------------10 2916.666666666667
20
2175

A clusula WHERE utilizada para aplicar restries sobre linhas


individualmente, enquanto a clusula HAVING utilizada para
aplicar restries sobre grupos de linhas.
As clusulas WHERE e HAVING podem ser utilizadas em conjunto.
Para calcular o salrio mdio de todos os cargos, exceto o cargo de gerente:
SQL>
2
3
4
5

SELECT JOB, AVG(SAL)


FROM EMP
WHERE JOB <> 'MANAGER'
GROUP BY JOB
HAVING AVG(SAL) > 2000

JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
PRESIDENT
5000

6.9

Ordem das clusulas


SELECT
FROM
WHERE
GROUP BY

lista_de_colunas
lista_de_tabelas
condies_de_linha
lista_de_colunas
53

HAVING
condies_de_grupo
ORDER BY lista_de_colunas

So avaliados:
WHERE
para ficar somente as linhas que atendem a clusula
GROUP BY para montagem dos grupos
HAVING
para ficar somente os grupos que atendem a clusula
6.10

Exerccios
a) Encontrar o menor salrio entre todos os empregados.
MENOR
----------------800

b) Encontrar o salrio maior, menor, e mdio, entre todos os empregados.


MAX(SAL)
MIN(SAL)
AVG(SAL)
----------------- ----------------- ----------------5000
800 2073.214285714286

c) Listar o maior e o menor salrio por cada tipo de cargo.


CARGO
MAIOR
MENOR
--------- ----------------- ----------------ANALYST
3000
3000
CLERK
1300
800
MANAGER
2975
2450
PRESIDENT
5000
5000
SALESMAN
1600
1250

d) Calcular o nmero de gerentes sem listar seus nomes.


GERENTES
----------------3

e) Encontrar o salrio mdio e a remunerao total mdia de cada tipo de cargo, lembrandose que os vendedores recebem comisso.
JOB
SALARIO_MEDIO REMUNERACAO_MEDIA
--------- ----------------- ----------------ANALYST
3000
36000
CLERK
1037.5
12450
MANAGER
2758.333333333333
33100
PRESIDENT
5000
60000
SALESMAN
1400
17237

f) Encontrar a diferena entre o maior e o menor salrios.


DIFERENCA
----------------4200

g) Listar todos os departamentos que possuem mais de trs empregados.


54

DEPTNO
COUNT(*)
----------------- ----------------20
5
30
6

h) Verificar se no h duplicidade no nmero dos empregados


no rows selected

i) Listar os empregados que recebem o menor salrio em cada departamento, relacionando os


seus gerentes. Excluir os grupos onde o menor salrio inferior a 1000. Ordenar os
resultados pelo salrio
MGR
MIN(SAL)
----------------- ----------------7788
1100
7782
1300
7839
2450
7566
3000
5000

55

6.11

Respostas dos exerccios


a)
SQL> SELECT MIN(SAL) MENOR
2 FROM EMP
b)
SQL> SELECT MAX(SAL), MIN(SAL), AVG(SAL)
2 FROM EMP
c)
SQL> SELECT JOB CARGO, MAX(SAL) MAIOR, MIN(SAL) MENOR
2 FROM EMP
3 GROUP BY JOB
d)
SQL> SELECT COUNT(*) GERENTES
2 FROM EMP
3 WHERE JOB = 'MANAGER'
e)
SQL>
2
3
4

SELECT JOB, AVG(SAL) SALARIO_MEDIO,


AVG(SAL*12+NVL(COMM,0)) REMUNERACAO_MEDIA
FROM EMP
GROUP BY JOB

f)
SQL> SELECT MAX(SAL)-MIN(SAL) DIFERENCA
2 FROM EMP
g)
SQL>
2
3
4

SELECT DEPTNO, COUNT(*)


FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*) > 3

h)
SQL>
2
3
4

SELECT EMPNO
FROM EMP
GROUP BY EMPNO
HAVING COUNT(*) > 1

i)
SQL>
2
3
4
5

SELECT MGR, MIN(SAL)


FROM EMP
GROUP BY MGR
HAVING MIN(SAL) >= 1000
ORDER BY MIN(SAL)

56

Captulo 7: Extraindo dados de mais de uma tabela


7.1

Objetivos deste captulo


Mostrar como obter informaes de mais de uma tabela atravs das junes.
Linhas de uma tabela podem ser juntadas com linhas de outra tabela, de acordo com valores
comuns existentes em colunas correspondentes. Os dois principais tipos de juno so:
1-Junes equivalentes
(equi-join)
2-Junes no equivalentes (non-equi-join)

7.2

Junes equivalentes
Para levantar, manualmente, o nome do departamento em que um funcionrio trabalha,
primeiro seria levantado na tabela EMP o nmero do departamento do empregado, e, em
seguida, seria levantado na tabela DEPT o nome correspondente ao nmero do
departamento. Este relacionamento entre as duas tabelas chamado de juno equivalente
(equi-join), uma vez o nmero do departamento nas duas tabelas o mesmo.
A condio de juno especificada na clusula WHERE usando o operador '='.
SQL> SELECT ENAME, JOB, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
ENAME
---------CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
WARD

JOB
--------MANAGER
PRESIDENT
CLERK
CLERK
CLERK
ANALYST
ANALYST
MANAGER
SALESMAN
MANAGER
SALESMAN
CLERK
SALESMAN
SALESMAN

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES

As linhas da tabela EMP foram combinadas com as linhas da tabela DEPT para obteno
dos nmeros dos departamentos.
O nome da tabela colocado antes do nome da coluna, para diferenciar colunas com mesmo
nome em tabelas diferentes.
Todas as colunas podem ser prefixadas com o nome da tabela, porm este procedimento s
obrigatrio quando existe ambigidade.
SQL> SELECT DEPT.DEPTNO, ENAME, JOB, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO

57

4 ORDER BY DEPT.DEPTNO
DEPTNO ENAME
JOB
------- ---------- --------10 CLARK
MANAGER
10 KING
PRESIDENT
10 MILLER
CLERK
20 SMITH
CLERK
20 ADAMS
CLERK
20 FORD
ANALYST
20 SCOTT
ANALYST
20 JONES
MANAGER
30 ALLEN
SALESMAN
30 BLAKE
MANAGER
30 MARTIN
SALESMAN
30 JAMES
CLERK
30 TURNER
SALESMAN
30 WARD
SALESMAN

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES

14 rows selected.

Alis para nomes de tabelas podem ser usado de forma semelhante que foi usada para alis
de nomes de colunas. O nome do alis escrito aps o nome da tabela. No exemplo abaixo
foi utilizado o alis 'E' para a tabela EMP, e o alis 'D' para a tabela DEPT.
SQL>
2
3
4

SELECT E.ENAME, D.DEPTNO, D.DNAME


FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DEPTNO

ENAME
DEPTNO DNAME
---------- ------- -------------CLARK
10 ACCOUNTING
KING
10 ACCOUNTING
MILLER
10 ACCOUNTING
SMITH
20 RESEARCH
ADAMS
20 RESEARCH
FORD
20 RESEARCH
SCOTT
20 RESEARCH
JONES
20 RESEARCH
ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
14 rows selected.

7.3

Produto
Quando a condio de juno invlida ou omitida completamente, o resultado um
Produto Cartesiano, e todas as combinaes de linha sero retornadas.
O Produto tende a gerar um grande nmero de linhas, e o resultado raramente til.

7.4

Junes no equivalentes
O relacionamento entre as tabelas EMP e SALGRADE formam uma juno no equivalente,
uma vez que no existe nenhuma coluna comum s duas tabelas. No exemplo, a funo
BETWEEN ... AND ... faz o relacionamento entre as duas tabelas.
58

SQL> SELECT E.ENAME, E.SAL, S.GRADE


2 FROM EMP E, SALGRADE S
3 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
ENAME
SAL
GRADE
---------- ------- ------SMITH
800
1
ADAMS
1100
1
JAMES
950
1
WARD
1250
2
MARTIN
1250
2
MILLER
1300
2
ALLEN
1600
3
TURNER
1500
3
JONES
2975
4
BLAKE
2850
4
CLARK
2450
4
SCOTT
3000
4
FORD
3000
4
KING
5000
5

7.5

Regra para juno de tabelas


O nmero mnimo de condies de juno igual ao nmero de
tabelas menos um.

7.6

Sumrio da Sintaxe

SELECT
FROM
WHERE
AND
OR
GROUP BY
HAVING
ORDER BY
7.7

[DISTINCT] {[tabela].*|expresso [alis],...}


tabela [alias],...
[condio de juno]...
[condio de linha]...
[outra condio de linha]
{expresso|coluna}
{condio de grupo}
{expresso|coluna} [ASC|DESC]

Exerccios
a) Mostrar o nome dos empregados e dos departamentos onde trabalham, ordenados pelo
nome do departamento.
ENAME
---------CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER

DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES

59

WARD

SALES

14 rows selected.

b) Mostrar os nomes dos empregados, juntamente com os nmeros e nomes dos


departamentos onde trabalham
ENAME
DEPTNO DNAME
---------- ------- -------------CLARK
10 ACCOUNTING
KING
10 ACCOUNTING
MILLER
10 ACCOUNTING
SMITH
20 RESEARCH
ADAMS
20 RESEARCH
FORD
20 RESEARCH
SCOTT
20 RESEARCH
JONES
20 RESEARCH
ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
14 rows selected.

c) Listar o nome, o local de trabalho e o departamento dos empregados com salrio superior
a 1500.
ENAME
---------CLARK
KING
JONES
SCOTT
FORD
ALLEN
BLAKE

LOCAL
------------NEW YORK
NEW YORK
DALLAS
DALLAS
DALLAS
CHICAGO
CHICAGO

DNAME
-------------ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
SALES
SALES

7 rows selected.

d) Listar as faixas salariais dos empregados.


ENAME
---------SMITH
ADAMS
JAMES
WARD
MARTIN
MILLER
ALLEN
TURNER
JONES
BLAKE
CLARK
SCOTT
FORD
KING

JOB
SAL
GRADE
--------- ------- ------CLERK
800
1
CLERK
1100
1
CLERK
950
1
SALESMAN
1250
2
SALESMAN
1250
2
CLERK
1300
2
SALESMAN
1600
3
SALESMAN
1500
3
MANAGER
2975
4
MANAGER
2850
4
MANAGER
2450
4
ANALYST
3000
4
ANALYST
3000
4
PRESIDENT
5000
5

14 rows selected.

60

e) Mostrar somente os empregados na faixa 3.


ENAME
---------ALLEN
TURNER

JOB
SAL
GRADE
--------- ------- ------SALESMAN
1600
3
SALESMAN
1500
3

f) Listar todos os empregados em Dallas.


ENAME
SAL LOCAL
---------- ------- ------------SMITH
800 DALLAS
ADAMS
1100 DALLAS
FORD
3000 DALLAS
SCOTT
3000 DALLAS
JONES
2975 DALLAS

g) Listar os nomes dos empregados, o cargo, o salrio, a faixa salarial, e o nome do


departamento para todos na companhia, exceto os Clerks. Ordenar pelo salrio, com os
maiores primeiro.
ENAME
---------KING
FORD
SCOTT
JONES
BLAKE
CLARK
ALLEN
TURNER
MARTIN
WARD

JOB
SAL
GRADE DNAME
--------- ------- ------- -------------PRESIDENT
5000
5 ACCOUNTING
ANALYST
3000
4 RESEARCH
ANALYST
3000
4 RESEARCH
MANAGER
2975
4 RESEARCH
MANAGER
2850
4 SALES
MANAGER
2450
4 ACCOUNTING
SALESMAN
1600
3 SALES
SALESMAN
1500
3 SALES
SALESMAN
1250
2 SALES
SALESMAN
1250
2 SALES

10 rows selected.

h) Listar os seguintes detalhes para os empregados que ganham 36.000 por ano ou que so
Clerks.
ENAME
---------MILLER
SMITH
ADAMS
JAMES

JOB
SALARIO_ANUAL DEPTNO DNAME
GRADE
--------- ------------- ------- -------------- ------CLERK
15600
10 ACCOUNTING
2
CLERK
9600
20 RESEARCH
1
CLERK
13200
20 RESEARCH
1
CLERK
11400
30 SALES
1

61

7.8

Soluo dos exerccios


a)
SQL> SELECT ENAME, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
b)
SQL> SELECT ENAME, E.DEPTNO, DNAME
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO = D.DEPTNO
c)
SQL>
2
3
4

SELECT ENAME, LOC LOCAL, DNAME


FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND SAL > 1500

d)
SQL> SELECT ENAME, JOB, SAL, GRADE
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL
e)
SQL> SELECT ENAME, JOB, SAL, GRADE
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 3
f)
SQL>
2
3
4

SELECT ENAME, SAL, LOC LOCAL


FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND LOC='DALLAS'

g)
SQL>
2
3
4
5
6

SELECT ENAME, JOB, SAL, GRADE, DNAME


FROM EMP, SALGRADE, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND SAL BETWEEN LOSAL AND HISAL
AND JOB != 'CLERK'
ORDER BY SAL DESC

h)
SQL>
2
3
4
5
6
7

SELECT ENAME, JOB, SAL*12+NVL(COMM,0) SALARIO_ANUAL,


D.DEPTNO, DNAME, GRADE
FROM EMP E, SALGRADE, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL
AND (SAL*12+NVL(COMM,0)=3600
OR JOB = 'CLERK')
ORDER BY E.JOB

62

Captulo 8: Outros mtodos de juno


8.1

Objetivos deste captulo


Mostrar mtodos alternativos para construo de junes.

8.2

Junes externas
Se uma linha no satisfaz a condio de juno, ento a linha no mostrada no resultado da
consulta. De fato, quando fazemos a juno equivalente (equi-join) das tabelas EMP e
DEPT, o departamento 40 no aparece, uma vez que no h nenhum empregado lotado neste
departamento.
As linhas excludas podem ser retornadas se um operador de juno externa (outer join) for
utilizado na condio de juno. O operador um sinal de '+' colocado entre parnteses, que
deve ser ficar ao lado da tabela onde as informaes que no seriam includas devem
aparecer.
No exemplo o operador est colocado ao lado da tabela DEPT, forando listar os dados dos
departamentos mesmo que no haja correspondncia em EMP.
SQL>
2
3
4

SELECT E.ENAME, D.DEPTNO, D.DNAME


FROM EMP E, DEPT D
WHERE E.DEPTNO (+) = D.DEPTNO
AND D.DEPTNO IN (30,40)

ENAME
DEPTNO DNAME
---------- ------- -------------ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
40 OPERATIONS
7 rows selected.

O operador de juno externa (outer join) s pode aparecer em um dos lados da expresso,
causando uma juno externa esquerda (left outer join), ou uma juno externa direita (right
outer join). A juno externa completa (outer join) no implementada diretamente pelo
Oracle.
8.3

Juno de uma tabela com ela mesmo


possvel utilizar rtulos nas tabelas (aliases) para fazer a juno de uma tabela com ela
mesmo, como se fossem duas tabelas distintas.
No exemplo abaixo so mostrados todos os funcionrios que recebem menos que seus
gerentes.
SQL> SELECT E.ENAME EMP_NOME, E.SAL EMP_SAL,
2 G.ENAME GER_NOME, G.SAL GER_SAL
3 FROM EMP E, EMP G

63

4 WHERE E.MGR =
EMP_NOME
EMP_SAL
---------- ------ALLEN
1600
WARD
1250
JAMES
950
TURNER
1500
MARTIN
1250
MILLER
1300
ADAMS
1100
JONES
2975
CLARK
2450
BLAKE
2850
SMITH
800

G.EMPNO AND E.SAL < G.SAL


GER_NOME
GER_SAL
---------- ------BLAKE
2850
BLAKE
2850
BLAKE
2850
BLAKE
2850
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
KING
5000
KING
5000
FORD
3000

11 rows selected.

Note que EMP aparece na clusula FROM duas vezes, uma com o alis 'E', para os
empregados, e outra com o alis 'G', para os gerentes.
8.4

Junes verticais
Os operadores UNION, INTERSECT e MINUS so teis para construir consultas que se
referem a tabelas diferentes. Estes operadores combinam os resultados de dois ou mais
SELECTs em um nico resultado.
8.4.1 Unio
O operador UNION retorna todas as linhas distintas das consultas unidas por este operador.
No exemplo so listados todos os cargos dos departamentos 10 e 30 sem repetio.
SQL>
2
3
4
5
6
7

SELECT JOB
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT JOB
FROM EMP
WHERE DEPTNO = 30

JOB
--------CLERK
MANAGER
PRESIDENT
SALESMAN

8.4.2 Interseo
O operador INTERSECT retorna apenas as linhas comuns s duas consultas. Para listar os
cargos existentes tanto no departamento 10 quanto no departamento 30:
SQL>
2
3
4
5
6
7

SELECT JOB
FROM EMP
WHERE DEPTNO = 10
INTERSECT
SELECT JOB
FROM EMP
WHERE DEPTNO = 30

64

JOB
--------CLERK
MANAGER

8.4.3 Subtrao
O operador MINUS retorna as linhas presentes na primeira consulta mas no presentes na
segunda consulta. Para listar os cargos existentes no departamento 10 mas no existentes no
departamento 30:
SQL>
2
3
4
5
6
7

SELECT JOB
FROM EMP
WHERE DEPTNO = 10
MINUS
SELECT JOB
FROM EMP
WHERE DEPTNO = 30

JOB
--------PRESIDENT

8.4.4 Combinao de operadores


possvel a construo de consultas com operadores UNION, INTERSECT e MINUS
combinados. Quando isto feito a execuo efetuada de cima para baixo, porm podem
ser utilizados parnteses para alterar esta ordem.
8.4.5 A clusula ORDER BY
Como as colunas das tabelas podem ter nomes diferentes quando usamos UNION,
INTERSECT e MINUS, o nome da coluna no pode ser usado na clusula ORDER BY
quando estes operadores so utilizados. Ao invs do nome deve ser usado o nmero da
coluna, como mostrado abaixo:
SQL>
2
3
4
5
6

SELECT EMPNO, ENAME, SAL


FROM EMP
UNION
SELECT ID, NAME, SALARY
FROM EMP HISTORY
ORDER BY 2

A clusula ORDER BY deve ser sempre a ltima.


8.4.6 Regras para utilizar junes verticais

As declaraes SELECT devem ter todas o mesmo nmero de colunas.

Os tipos de dados das colunas correspondentes devem ser idnticos.

Linhas duplicadas so automaticamente eliminadas (DISTINCT no pode ser usado).

Os nomes das colunas da primeira consulta so os que aparecem no resultado.


65

8.5

A clusula ORDER BY deve ser sempre a ltima.


A clusula ORDER BY s pode conter os nmeros das colunas, no os nomes.

Junes verticais podem ser usadas em sub-consultas.

Declaraes SELECT so executadas de cima para baixo.

Mltiplas junes verticais podem ser utilizadas, com parnteses, se necessrio, para
alterar a ordem de execuo.

Exerccios
a) Listar os departamentos que no possuem empregados.
DEPTNO DNAME
------- -------------40 OPERATIONS

b) Listar os nmeros e os nomes dos empregados juntamente com os nmeros e os nomes de


seus gerentes.
EMPNO
------7788
7902
7499
7521
7900
7844
7654
7934
7876
7566
7782
7698
7369

ENAME
GER_NUM GER_NOME
---------- ------- ---------SCOTT
7566 JONES
FORD
7566 JONES
ALLEN
7698 BLAKE
WARD
7698 BLAKE
JAMES
7698 BLAKE
TURNER
7698 BLAKE
MARTIN
7698 BLAKE
MILLER
7782 CLARK
ADAMS
7788 SCOTT
JONES
7839 KING
CLARK
7839 KING
BLAKE
7839 KING
SMITH
7902 FORD

13 rows selected.

c) Alterar a soluo do exerccio b para mostrar KING que no possui gerente.


EMPNO
------7788
7902
7499
7521
7900
7844
7654
7934
7876
7566
7782
7698
7369
7839

ENAME
GER_NUM GER_NOME
---------- ------- ---------SCOTT
7566 JONES
FORD
7566 JONES
ALLEN
7698 BLAKE
WARD
7698 BLAKE
JAMES
7698 BLAKE
TURNER
7698 BLAKE
MARTIN
7698 BLAKE
MILLER
7782 CLARK
ADAMS
7788 SCOTT
JONES
7839 KING
CLARK
7839 KING
BLAKE
7839 KING
SMITH
7902 FORD
KING

66

14 rows selected.

d) Mostrar os cargos que foram preenchidos no primeiro semestre de 1983 e no mesmo


perodo em 1984.
JOB
--------CLERK

e) Listar todos os empregados admitidos antes de seus gerentes.


EMPREGADO
---------ALLEN
WARD
TURNER
MARTIN
MILLER
JONES
CLARK
BLAKE
SMITH

HIREDATE
--------15-AUG-83
26-MAR-84
04-JUN-84
05-DEC-83
21-NOV-83
31-OCT-83
14-MAY-84
11-JUN-84
13-JUN-83

GERENTE
---------BLAKE
BLAKE
BLAKE
BLAKE
CLARK
KING
KING
KING
FORD

HIREDATE
--------11-JUN-84
11-JUN-84
11-JUN-84
11-JUN-84
14-MAY-84
09-JUL-84
09-JUL-84
09-JUL-84
05-DEC-83

9 rows selected.

f) Encontrar outra maneira de resolver o exerccio a.


DEPTNO DNAME
------- -------------40 OPERATIONS

67

8.6

Respostas dos exerccios


a)
SQL>
2
3
4

SELECT D.DEPTNO, DNAME


FROM EMP E, DEPT D
WHERE E.DEPTNO (+) = D.DEPTNO
AND E.EMPNO IS NULL

b)
SQL>
2
3
4

SELECT EMPS.EMPNO, EMPS.ENAME,


GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME
FROM EMP EMPS, EMP GERS
WHERE EMPS.MGR = GERS.EMPNO

c)
SQL>
2
3
4

SELECT EMPS.EMPNO, EMPS.ENAME,


GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME
FROM EMP EMPS, EMP GERS
WHERE EMPS.MGR = GERS.EMPNO (+)

d)
SQL>
2
3
4
5
6
7

SELECT JOB
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83'
INTERSECT
SELECT JOB
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84'

e)
SQL>
2
3
4

SELECT E.ENAME EMPREGADO, E.HIREDATE,


M.ENAME GERENTE, M.HIREDATE
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO AND E.HIREDATE < M.HIREDATE

f)
SQL>
2
3
4
5
6

SELECT DEPTNO, DNAME


FROM DEPT
MINUS
SELECT EMP.DEPTNO, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO

68

Captulo 9: Consultas aninhadas


9.1

Objetivos deste captulo


Mostrar consultas declaradas nas clusulas Where e Having.

9.2

Definio de consultas aninhadas


Uma consulta aninhada, ou subconsulta, aquela que est contida dentro de uma outra
consulta, e que retorna valores intermedirios.
Por exemplo:
SELECT
FROM
WHERE

coluna1, coluna2
tabela
coluna1 = (SELECT coluna FROM tabela WHERE condio)

Consultas aninhadas so muito teis quando necessrio selecionar linhas de uma tabela sob
uma condio que depende dos dados da prpria tabela.
9.3

Consultas internas que retornam apenas um valor


Para encontrar o empregado com o menor salrio da empresa so necessrias duas etapas:
a) achar qual o menor salrio
SQL> SELECT MIN(SAL)
2 FROM EMP
MIN(SAL)
-------800

b) localizar o empregado que recebe o menor salrio


SELECT ENAME, JOB, SAL
FROM EMP
WHERE SAL = salrio encontrado na etapa anterior

Os dois comandos podem ser combinados em uma consulta aninhada:


SQL> SELECT ENAME, JOB, SAL
2 FROM EMP
3 WHERE SAL = (SELECT MIN(SAL) FROM EMP)
ENAME
JOB
SAL
---------- --------- ------SMITH
CLERK
800

Antes da consulta interna que retorna apenas um valor, podem ser usados os operadores =, <,
>, <=, >=, <>.

69

9.4

Como as consultas aninhadas so executadas


Uma declarao SELECT pode ser considerada como um bloco de consulta. No exemplo
anterior, haviam dois blocos de consulta: um principal e outro interno. O bloco interno
executado primeiro, produzindo o resultado: 800. Em seguida o bloco principal executado,
utilizando o valor retornado pelo bloco interno.
Para listar todos os empregados com o mesmo cargo do BLAKE:
SQL> SELECT ENAME, JOB
2 FROM EMP
3 WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'BLAKE')
ENAME
---------JONES
BLAKE
CLARK

JOB
--------MANAGER
MANAGER
MANAGER

O cargo de BLAKE obtido pela consulta interna e utilizado pela consulta principal.
9.5

Consultas internas que retornam mais de um valor


A consulta abaixo tenta localizar os empregados com o menor salrio em cada
departamento.
SQL> SELECT ENAME, SAL, DEPTNO
2 FROM EMP
3 WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO)
ENAME
SAL DEPTNO
---------- ------- ------SMITH
800
20
JAMES
950
30
MILLER
1300
10

Note que a consulta interna tem uma clusula GROUP BY, e portanto retorna mais de um
valor. Neste caso o operador IN deve ser usado para tratar a lista de valores.
O resultado da consulta interna no indica o departamento, no havendo assim qualquer
correspondncia entre o salrio retornado e o departamento do funcionrio.
Para haver correspondncia entre o salrio e o departamento a consulta foi escrita
novamente:
SQL>
2
3
4

SELECT ENAME, SAL, DEPTNO


FROM EMP
WHERE (SAL,DEPTNO) IN
(SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO)

ENAME
SAL DEPTNO
---------- ------- ------SMITH
800
20
JAMES
950
30
MILLER
1300
10

70

Nesta nova consulta, retornado um par de colunas que comparado com um par de colunas
da consulta principal.
Note que as colunas esquerda da condio de procura esto entre parnteses e so
separadas por vrgulas.
As colunas listadas na consulta interna devem estar na mesma ordem das colunas esquerda
da condio de procura.
As colunas retornadas pela consulta interna devem ser em mesmo nmero e do mesmo tipo
de dados das colunas esquerda da condio de procura.
Se uma consulta interna retornar mais de uma linha e a condio de procura utilizar um
operador de uma linha apenas gera o erro mostrado abaixo:
SQL> SELECT ENAME, SAL, DEPTNO
2 FROM EMP
3 WHERE SAL =
4 (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO)
ERROR:
ORA-01427: single-row subquery returns more than one row
no rows selected

Se a consulta interna no retornar nenhuma linha:


SQL> SELECT ENAME, JOB
2 FROM EMP
3 WHERE JOB =
4 (SELECT JOB FROM EMP WHERE ENAME = 'SMYTHE')
ERROR:
ORA-01426: sigle-row subquery returns no row
no rows selected

9.6

Operadores ANY e ALL


Os operadores ANY e ALL podem ser utilizados quando as consultas internas retornam mais
de uma valor. Estes operadores so usados nas clusulas WHERE e HAVING em conjuno
com os operadores lgicos (=, <, >, >=, <=, <>).
ANY compara o valor com cada valor retornado pela consulta interna.
Para mostrar os empregados que recebem mais do que o menor salrio do departamento 30:
SQL>
2
3
4
5

SELECT ENAME, SAL, JOB, DEPTNO


FROM EMP
WHERE SAL > ANY
(SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL DESC

ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20
BLAKE
2850 MANAGER
30

71

CLARK
ALLEN
TURNER
MILLER
WARD
MARTIN
ADAMS

2450
1600
1500
1300
1250
1250
1100

MANAGER
SALESMAN
SALESMAN
CLERK
SALESMAN
SALESMAN
CLERK

10
30
30
10
30
30
20

12 rows selected.

Quando usamos ANY geralmente usamos DISTINCT para reduzir a lista de valores a serem
comparados.
ALL compara o valor com todos os valores retornados pela consulta interna.
A consulta abaixo encontra os empregados que ganham mais do que todos os empregados do
departamento 30.
SQL>
2
3
4
5

SELECT ENAME, SAL, JOB, DEPTNO


FROM EMP
WHERE SAL > ALL
(SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL DESC

ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20

O operador NOT pode ser usado com IN, ANY ou ALL


9.7

Clusula HAVING com consultas aninhadas


Para mostrar os departamentos com salrio mdio superior ao salrio mdio do
departamento 30, escrevemos:
SQL>
2
3
4
5

SELECT DEPTNO, AVG(SAL)


FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) >
(SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30)

DEPTNO AVG(SAL)
------- -------10 2916.67
20
2175

Para descobrir qual o cargo com maior salrio mdio:


SQL>
2
3
4
5

SELECT JOB, AVG(SAL)


FROM EMP
GROUP BY JOB
HAVING AVG(SAL) =
(SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB)

JOB
AVG(SAL)
--------- -------PRESIDENT
5000

72

9.8

9.9

Ordenao em consultas aninhadas

No pode existir a clusula ORDER BY na consulta interna.

A clusula ORDER BY sempre a ltima no comando SELECT.

Limite para o aninhamento

9.10

No h limite para o aninhamento de SELECT dentro de SELECT.

Consulta interna correlacionada


Uma consulta interna correlacionada aquela que:

executada para cada uma das linhas consideradas candidatas na consulta principal.

a execuo usa o valor da coluna da consulta principal.

Estas propriedades causam a consulta interna ser processada de maneira diferente de uma
consulta aninhada comum.
Uma consulta interna correlacionada identificada pela presena de uma coluna da consulta
principal na consulta interna.
Passos para executar uma consulta interna correlacionada:

Pegar a linha candidata fornecida pela consulta principal.

Executar a consulta interna usando os valores da consulta principal.

Usar os resultados da consulta interna para qualificar os desqualificar a linha candidata.

Repetir enquanto houver linha candidata

Para encontrar os empregados que recebem mais do que o salrio mdio de seus
departamentos:
SQL>
2
3
4
5

SELECT EMPNO, ENAME, SAL, DEPTNO


FROM EMP E
WHERE SAL >
(SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
ORDER BY DEPTNO

EMPNO
------7839
7566
7788
7902
7499

ENAME
SAL DEPTNO
---------- ------- ------KING
5000
10
JONES
2975
20
SCOTT
3000
20
FORD
3000
20
ALLEN
1600
30

73

7698 BLAKE

2850

30

Anlise da execuo da consulta:

9.11

Consulta principal

Seleciona a primeira linha candidata - Smith, departamento 20, salrio 800.

A linha selecionada possui a coluna DEPTNO, e a clusula WHERE da


consulta interna tambm possui a mesma coluna da mesma tabela EMP,
portanto a consulta interna ser realizada.

A clusula WHERE compara o salrio de Smith, 800, com o valor retornado


da consulta interna.

Consulta Interna

O nmero do departamento passado da consulta externa para a interna.

O salrio mdio do departamento do empregado calculado.

O salrio mdio do departamento do Smith 2172.

O operador EXISTS
O operador EXISTS freqentemente usado com consultas aninhadas correlacionadas,
testando se o valor existe. Se o valor existir, retorna verdadeiro, caso contrrio retorna falso.
Para listar todas as empregados com ao menos um funcionrio subordinado:
SQL>
2
3
4
5

SELECT EMPNO, ENAME, JOB, DEPTNO


FROM EMP E
WHERE EXISTS
(SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO)
ORDER BY EMPNO

EMPNO
------7566
7698
7782
7788
7839
7902

ENAME
---------JONES
BLAKE
CLARK
SCOTT
KING
FORD

JOB
DEPTNO
--------- ------MANAGER
20
MANAGER
30
MANAGER
10
ANALYST
20
PRESIDENT
10
ANALYST
20

6 rows selected.

Para listar os empregados cujos departamentos no esto na tabela de departamentos:


SQL>
2
3
4

SELECT EMPNO, ENAME, DEPTNO


FROM EMP
WHERE NOT EXISTS
(SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO)

74

no rows selected

Uma outra forma para encontrar os departamentos sem funcionrios :


SQL>
2
3
4

SELECT DEPTNO, DNAME


FROM DEPT D
WHERE NOT EXISTS
(SELECT 1 FROM EMP E WHERE E.DEPTNO = D.DEPTNO)

DEPTNO DNAME
------- -------------40 OPERATIONS

Note que neste exemplo a consulta interna no precisa retornar nada, porm a clusula
SELECT precisa de uma coluna, mesmo que seja um literal.
9.12

Exerccios
a) Listar os empregados com o maior salrio por cargo, em ordem descendente de salrio.
ENAME
---------KING
SCOTT
FORD
JONES
ALLEN
MILLER

JOB
SAL
--------- ------PRESIDENT
5000
ANALYST
3000
ANALYST
3000
MANAGER
2975
SALESMAN
1600
CLERK
1300

b) Listar os empregados com os menores salrio por cargo, em ordem ascendente de salrio.
ENAME
---------SMITH
WARD
MARTIN
CLARK
SCOTT
FORD
KING

JOB
SAL
--------- ------CLERK
800
SALESMAN
1250
SALESMAN
1250
MANAGER
2450
ANALYST
3000
ANALYST
3000
PRESIDENT
5000

7 rows selected.

c) Listar os ltimos empregados contratados em cada departamento.


DEPTNO
------20
10
30

ENAME
---------ADAMS
KING
JAMES

HIREDATE
--------04-JUN-84
09-JUL-84
23-JUL-84

d) Listar o nome, o salrio e o nmero do departamento dos funcionrios que recebem acima
da mdia de seus departamentos. Ordenar pelo nmero do departamento.
ENAME
SALARIO DEPTNO
---------- ------- ------KING
5000
10
JONES
2975
20

75

SCOTT
FORD
ALLEN
BLAKE

3000
3000
1600
2850

20
20
30
30

e) Listar os departamentos sem funcionrios.


DEPTNO DNAME
------- -------------40 OPERATIONS

f) Mostrar o departamento que tem mais despesas com seus funcionrios.


DEPTNO MAIOR_DESPESA
------- ------------20
130500

g) Quais os trs empregados que ganham mais ?


ENAME
SAL
---------- ------SCOTT
3000
KING
5000
FORD
3000

h) Em que ano a empresa contratou mais ?


ANO NUMERO DE EMPREGADOS
---- -------------------1984
8

i) Modificar o exerccio d para mostrar o salrio mdio do departamento junto com as outras
informaes.
NOME
SALARIO DEPARTAMENTO MEDIA_DEPT
---------- ----------- ------------ ----------ALLEN
1,600.00
30
1,566.67
BLAKE
2,850.00
30
JONES
2,975.00
20
2,175.00
FORD
3,000.00
20
SCOTT
3,000.00
20
KING
5,000.00
10
2,916.67
6 rows selected.

j) Escreva uma consulta que mostre um '*' junto do funcionrio contratado mais
recentemente
ENAME
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT

HIREDATE MAIOR_DATA
--------- ---------04-JUN-84
15-AUG-83
11-JUN-84
14-MAY-84
05-DEC-83
23-JUL-84 *
31-OCT-83
09-JUL-84
05-DEC-83
21-NOV-83
05-MAR-84

76

SMITH
TURNER
WARD

13-JUN-83
04-JUN-84
26-MAR-84

14 rows selected.

77

9.13

Resposta dos exerccios


a)
SQL>
2
3
4
5

SELECT ENAME, JOB, SAL


FROM EMP
WHERE (SAL,JOB) IN
(SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB)
ORDER BY SAL DESC

b)
SQL>
2
3
4
5

SELECT ENAME, JOB, SAL


FROM EMP
WHERE (SAL,JOB) IN
(SELECT MIN(SAL), JOB FROM EMP GROUP BY JOB)
ORDER BY SAL

c)
SQL>
2
3
4
5

SELECT DEPTNO, ENAME, HIREDATE


FROM EMP
WHERE (HIREDATE,DEPTNO) IN
(SELECT MAX(HIREDATE), DEPTNO FROM EMP GROUP BY DEPTNO)
ORDER BY HIREDATE

d)
SQL>
2
3
4
5

SELECT ENAME, SAL SALARIO, DEPTNO


FROM EMP E
WHERE SAL >
(SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
ORDER BY DEPTNO

e)
SQL>
2
3
4

SELECT DEPTNO, DNAME


FROM DEPT D
WHERE NOT EXISTS
(SELECT 'qualquer coisa' FROM EMP WHERE DEPTNO = D.DEPTNO)

f)
SQL>
SQL>
2
3
4
5
old
new
old
new
old
new

DEFINE REM = SAL*12+NVL(COMM,0)


SELECT DEPTNO, SUM(&REM) MAIOR_DESPESA
FROM EMP
GROUP BY DEPTNO
HAVING SUM(&REM) =
(SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO)
1: SELECT DEPTNO, SUM(&REM) MAIOR_DESPESA
1: SELECT DEPTNO, SUM(SAL*12+NVL(COMM,0)) MAIOR_DESPESA
4: HAVING SUM(&REM) =
4: HAVING SUM(SAL*12+NVL(COMM,0)) =
5: (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO)
5: (SELECT MAX(SUM(SAL*12+NVL(COMM,0))) FROM EMP GROUP BY DEPTNO)

g)
SQL> SELECT ENAME, SAL
2 FROM EMP E
3 WHERE 3 > (SELECT COUNT(*) FROM EMP WHERE E.SAL < SAL)
h)
SQL>
SQL>
SQL>
2
3
4
5
6
7

COLUMN ANO FORMAT A4


COLUMN NUMBER_OF_EMPS FORMAT 9 HEADING 'NUMERO DE EMPREGADOS'
SELECT TO_CHAR(HIREDATE,'YYYY') ANO,
COUNT(EMPNO) NUMBER_OF_EMPS
FROM EMP
GROUP BY TO_CHAR(HIREDATE,'YYYY')
HAVING COUNT(EMPNO) =
(SELECT MAX(COUNT(EMPNO))
FROM EMP

78

GROUP BY TO_CHAR(HIREDATE,'YYYY'))

i)
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8

COLUMN SALARIO FORMAT 999,999.99


COLUMN MEDIA_DEPT LIKE SALARIO
BREAK ON DEPTNO ON MEDIA_DEPT
SELECT E.ENAME NOME, E.SAL SALARIO,
E.DEPTNO DEPARTAMENTO, AVG(A.SAL) MEDIA_DEPT
FROM EMP A, EMP E
WHERE E.DEPTNO = A.DEPTNO
AND E.SAL >
(SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
GROUP BY E.ENAME, E.SAL, E.DEPTNO
ORDER BY AVG(A.SAL)

j)
SQL>
2
3
4
5
6
7

SELECT ENAME, HIREDATE, '*' MAIOR_DATA


FROM EMP
WHERE HIREDATE = (SELECT MAX(HIREDATE) FROM EMP)
UNION
SELECT ENAME, HIREDATE, ' '
FROM EMP
WHERE HIREDATE < (SELECT MAX(HIREDATE) FROM EMP)

79

Captulo 10: Gerao de relatrios


10.1

Objetivos deste captulo


Aprender os comandos SET que controlam o ambiente, e aprender a formatar os resultados
das consultas no SQL*PLUS.

10.2

Conjunto de comandos SET do SQL*PLUS


ECHO{OFF on}
FEED[BACK]
{6 n off on}
HEA[DING]
{off ON}
LIN[ESIZE]
{80 n}
NEWP[AGE]
{1 n}
NUMF[ORMAT]
formato
NUM[WIDTH]
{10 n}
PAGES[IZE]
{24 n}
PAU[SE]
{OFF on texto}
VERIFY
{off ON}
TIMING
{OFF on}
SPACE
{1 n}
TERM[OUT]
{off ON}
SQLCASE
{MIXED lower
upper}

ON mostra os comando executados a partir de um arquivo de


comandos. OFF no mostra.
'n' faz com que seja mostrado o nmero de linhas selecionadas na
tela, quando 'n' ou mais linhas so selecionadas.
ON causa a impresso do cabealho da coluna no relatrio. OFF
suprime a impresso do cabealho.
Nmero de caracteres a serem exibidos antes da marca de nova
linha, e controle para centrar e ajustar texto direita.
Nmero de linhas em branco entre o ttulo inferior de uma pgina
e o ttulo superior da pgina seguinte. 0 = form feed.
Formato padro para resultados numricos.
Largura padro para colunas numricas.
Nmero de linhas por pgina.
ON aguarda pressionar ENTER antes de mostrar a nova tela.
OFF suprime a espera. Texto especifica o texto a ser mostrado
ON faz com que o texto de uma linha de comando seja mostrado
antes e depois de aplicada a varivel de substituio.
ON mostra as estatsticas de tempo de cada comando SQL
processado.
Nmero de espaos entre colunas. Mximo igual a 10.
OFF suprime a exibio dos resultados produzidos pelos
comandos executados a partir de um arquivo, mantendo o Spool.
LOWER e UPPER convertem os caracteres antes da execuo.
MIXED no altera os caracteres do texto.

O comando SHOW ALL exibe todas as variveis do comando SET.


10.3

COLUMN
Atravs do comando COLUMN podem ser alteradas propriedades das colunas.
Notas:

O nome da coluna deve ser o nome do alis, se algum for usado.


80

As opes podem vir em qualquer ordem.


Uma vez emitido, o comando permanece vlido at o fim da sesso, se no for
eliminado.

Para descobrir as opes atribudas para a coluna digite COL nome_da_coluna.

10.3.1 Formato de exibio para as colunas


COL xxx FORMAT yyy ...
FORMATO
An
9
0
$
.
,
MI
PR
EEEE
V
B

SIGNIFICADO
alfanumrico, largura n.
posio numrica, como 999999.
coloca zeros esquerda, como 099999.
cifro flutuante, como $999999.
ponto decimal, como 999999.99.
vrgula, como 999,999.
sinal de menos direita, como 999999MI.
nmero negativo entre parnteses, como 999999PR.
notao cientfica, como 99.9999EEEE.
multiplicar por 10**n, como 9999V99.
valores zero em branco, como B9999.99.

10.3.2 Outras opes de exibio das colunas.


WRAP
TRUNC
WORD_WRAPPED
CLEAR
HEADING
JUSTIFY
LEFT
RIGHT
CENTER
LIKE
nome_da_coluna
NEWLINE
NULL texto
PRINT
NOPRINT
TEMP

10.4

Especifica o que fazer quando o contedo da coluna excede a


sua largura. O padro WRAP.
Move a palavra toda.
Remove a formatao prvia da coluna.
Especifica um cabealho para a coluna.
Alinhamento do cabealho da coluna. O padro JUSTIFY
LEFT para caracteres e datas, e JUSTIFY RIGHT para
nmeros.
Copia a especificao de uma outra coluna.
Comea uma nova linha antes da coluna especificada ser
exibida.
Coloca o texto especificado quando o valor da coluna for
nulo.
Faz com que a coluna aparea ou no no relatrio.
Especifica que a formatao vlida para uma consulta
apenas.

Exemplo de formatao de colunas


81

SQL>
SQL>
SQL>
SQL>
SQL>
SQL>

COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN

DEPTNO FORMAT 099 HEADING 'Dept.'


JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT
EMPNO FORMAT 9999 HEADING 'Num.|Emp.'
SAL FORMAT 99,999.99 HEADING 'Salario|Mensal'
COMM FORMAT 99,990.99 HEADING 'Comissao' NULL 'Sem com.'
REM FORMAT 999,999.99 HEADING 'Remuneracao|Total'

SQL> SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM


2 FROM EMP
Dept.
----020
030
030
020
030
030
010
020
010
030
020
030
020
010

10.5

Num.
Salario
Remuneracao
Cargo Emp.
Mensal
Comissao
Total
--------- ----- ---------- ---------- ----------CLERK
7369
800.00 Sem com.
9,600.00
SALESMAN
7499
1,600.00
300.00
19,500.00
SALESMAN
7521
1,250.00
500.00
15,500.00
MANAGER
7566
2,975.00 Sem com.
35,700.00
SALESMAN
7654
1,250.00
1,400.00
16,400.00
MANAGER
7698
2,850.00 Sem com.
34,200.00
MANAGER
7782
2,450.00 Sem com.
29,400.00
ANALYST
7788
3,000.00 Sem com.
36,000.00
PRESIDENT 7839
5,000.00 Sem com.
60,000.00
SALESMAN
7844
1,500.00
0.00
18,000.00
CLERK
7876
1,100.00 Sem com.
13,200.00
CLERK
7900
950.00 Sem com.
11,400.00
ANALYST
7902
3,000.00 Sem com.
36,000.00
CLERK
7934
1,300.00 Sem com.
15,600.00

Exemplo de formatao de ttulo


TTITLE 'ttulo'

BTITLE 'ttulo'
TTITLE OFF
BTITLE OFF

Imprime a data no topo da folha, no canto esquerdo


superior, o nmero da folha no canto direito superior, e o
ttulo centrado na linha seguinte.
Imprime um texto centrado ao fim de cada pgina. O
caracter '|' serve para quebrar linhas.
Limpa o ttulo superior.
Limpa o ttulo inferior.

SQL> TTITLE 'RELATORIO DA EMPRESA|Produzido pelo DP'


SQL> BTITLE '*** CONFIDENCIAL ***'
SQL> /
Thu Oct 27

page
RELATORIO DA EMPRESA
Produzido pelo DP

Dept.
----020
030
030
020
030
030
010
020
010
030
020
030
020

Num.
Salario
Remuneracao
Cargo Emp.
Mensal
Comissao
Total
--------- ----- ---------- ---------- ----------CLERK
7369
800.00 Sem com.
9,600.00
SALESMAN
7499
1,600.00
300.00
19,500.00
SALESMAN
7521
1,250.00
500.00
15,500.00
MANAGER
7566
2,975.00 Sem com.
35,700.00
SALESMAN
7654
1,250.00
1,400.00
16,400.00
MANAGER
7698
2,850.00 Sem com.
34,200.00
MANAGER
7782
2,450.00 Sem com.
29,400.00
ANALYST
7788
3,000.00 Sem com.
36,000.00
PRESIDENT 7839
5,000.00 Sem com.
60,000.00
SALESMAN
7844
1,500.00
0.00
18,000.00
CLERK
7876
1,100.00 Sem com.
13,200.00
CLERK
7900
950.00 Sem com.
11,400.00
ANALYST
7902
3,000.00 Sem com.
36,000.00

82

010 CLERK

7934

1,300.00 Sem com.

15,600.00

*** CONFIDENCIAL ***

10.6

Exemplo de remoo da formatao


SQL> CLEAR COLUMNS
columns cleared
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> /
DEPTNO
------20
30
30
20
30
30
10
20
10
30
20
30
20
10

JOB
EMPNO
SAL
COMM
REM
--------- ------- ------- ------- ------CLERK
7369
800
9600
SALESMAN
7499
1600
300
19500
SALESMAN
7521
1250
500
15500
MANAGER
7566
2975
35700
SALESMAN
7654
1250
1400
16400
MANAGER
7698
2850
34200
MANAGER
7782
2450
29400
ANALYST
7788
3000
36000
PRESIDENT
7839
5000
60000
SALESMAN
7844
1500
0
18000
CLERK
7876
1100
13200
CLERK
7900
950
11400
ANALYST
7902
3000
36000
CLERK
7934
1300
15600

14 rows selected.

83

Captulo 11: Gerao de Relatrios - Parte 2


11.1

Objetivos deste captulo


Mostrar propriedades dos cabealhos e rodaps, mostrar a varivel NEW_VALUE, e os
comandos BREAK e COMPUTE.

11.2

Propriedades dos cabealhos e dos rodaps


Os comandos TTITLE e BTITLE podem incluir diversas clusulas, como mostrado abaixo:
Clusula
COL n
SKIP n
LEFT
CENTER
RIGHT

TAB n
FORMAT

Descrio
Posicionar a impresso na coluna 'n' na linha corrente. Volta atrs
se a coluna tiver sido passada.
Saltar 'n' linhas. Se 'n' for omitido salta 1 linha. Se n=0 volta para
o comeo da linha corrente.
Alinha esquerda, no centro, ou direita da linha corrente. Os
itens de dados que seguem esta clusula, at o fim do comando
ou at a prxima ocorrncia de uma destas clusulas, so
alinhados como um grupo. As clusulas LEFT e CENTER se
baseiam no comando SET LINESIZE para calcular a posio dos
itens de dados.
Avana ou recua a posio de impresso 'n' caracteres. O valor de
'n' deve ser negativo para haver o recuo.
Define o formato dos itens de dados que seguem a clusula, at o
fim do comando ou at a prxima ocorrncia desta clusula. A
especificao do formato para os ttulos semelhante a
especificao do formato para as colunas. Somente uma
especificao de formato est ativa a cada instante. Se o tipo de
dado for conflitante com o formato, o formato no tem efeito
para este item. Se no houver nenhuma clusula FORMAT ativa,
os valores numricos so impressos de acordo com o comando
SET NUMFORMAT, ou na ausncia deste com o formato
padro. Valores de data so impressos no formato padro.

Podem ser includas, tambm, variveis de sistema.


Varivel
SQL.PNO
SQL.LNO
SQL.USER
SQL.SQLCODE

Descrio
Nmero da pagina corrente.
Nmero da linha corrente.
Nome do usurio.
Cdigo do erro mais recente.

O exemplo a seguir mostra algumas das opes disponveis para TTITLE e BTITLE:
SQL> TTITLE LEFT FORMAT 0999 'Pagina: 'SQL.PNO > RIGHT 'Produzido por: Contabilidade' SKIP 2 > CENTER 'Relatorio Confidencial de Vendas' SKIP > CENTER '--------------------------------' SKIP 2

84

SQL> BTITLE CENTER 'FIM DO RELATORIO' SKIP >


CENTER '----------------'
SQL> SELECT ENAME, JOB, SAL, COMM
2 FROM EMP
3 WHERE COMM IS NOT NULL
Pagina:

0001

Produzido por: Contabilidade


Relatorio Confidencial de Vendas
--------------------------------

ENAME
---------ALLEN
WARD
MARTIN
TURNER

JOB
SAL
COMM
--------- ------- ------SALESMAN
1600
300
SALESMAN
1250
500
SALESMAN
1250
1400
SALESMAN
1500
0
FIM DO RELATORIO
----------------

SQL> TTITLE OFF


SQL> BTITLE OFF

11.3

A clusula NEW_VALUE
Esta clusula permite armazenar os valores das colunas em variveis do SQL*PLUS. As
variveis podem ser usadas para modificar um comando SQL dinamicamente, exibir valores
nos cabealhos e passar um valor de um comando SQL para outro.
SQL> COLUMN SYSDATE NEW_VALUE HOJE NOPRINT
SQL> SELECT SYSDATE
2 FROM SYS.DUAL
SQL> TTITLE LEFT 'Data:' HOJE RIGHT FORMAT 999 'Pagina:' SQL.PNO SKIP > LEFT 'Usuario: ' SQL.USER SKIP > CENTER 'Um relatorio com a data reformatada no titulo' SKIP 2
SQL> SELECT SYSDATE
2 FROM SYS.DUAL
Data: 31-OCT-94
Usuario: ALUNO1

Pagina:

Um relatorio com a data reformatada no titulo


SQL> TTITLE OFF

A clusula COLUMN SYSDATE NEW_VALUE HOJE NOPRINT faz com que sempre que
a coluna com nome SYSDATE seja selecionada, seu valor passe para a varivel HOJE. A
clusula NOPRINT impede a impresso da varivel SYSDATE como um relatrio separado.
O comando SELECT SYSDATE FROM SYS.DUAL faz com que SYSDATE seja
selecionada a partir da tabela SYS.DUAL, que uma tabela que contm apenas uma linha, e
vai retornar, portanto, apenas um valor.

85

O comando TTITLE LEFT 'Data: ' HOJE faz referncia a varivel HOJE, definida e com
valor atribudo pela clusula NEW_VALUE. Desta forma, SYSDATE impressa no
cabealho atravs da varivel HOJE.
No exemplo abaixo, a varivel MAIOR_SALARIO_MEDIO utilizada para passar um
valor de uma consulta para a outra.
SQL> COL MAIOR_SALARIO_MEDIO NEW_VALUE MAIOR_SALARIO_MEDIO
SQL> SELECT MAX(AVG(SAL)) MAIOR_SALARIO_MEDIO
2 FROM EMP
3 GROUP BY JOB
MAIOR_SALARIO_MEDIO
------------------5000
SQL>
2
3
4
old
new

SELECT JOB
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO
4: HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO
4: HAVING AVG(SAL) =
5000

JOB
--------PRESIDENT

11.4

Quebras nos relatrios


O comando BREAK pode ser utilizado para quebrar os relatrios em sesses. Quando se faz
uma quebra por uma coluna, os valores duplicados da coluna so omitidos. Como a quebra
ocorre toda vez que o valor da coluna muda, o resultado deve ser ordenado pelas colunas
com quebra especificada. Somente existe um comando BREAK ativo de cada vez, portanto
todas as quebras devem ser especificadas no mesmo comando.
O comando BREAK permite as seguintes opes
PAGE

salta folha quando o valor da coluna muda.

SKIP n

salta 'n' linhas quando o valor da coluna muda.

DUP[LICATE]

mostra os valores duplicados.

Exemplos:
SQL> BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2
SQL> BREAK ON REPORT ON DEPTNO PAGE ON JOB DUP
SQL> CLEAR BREAKS
breaks cleared
SQL> BREAK
no break(s) defined

O exemplo abaixo ilustra o uso do comando BREAK:


SQL> COLUMN DEPTNO FORMAT 099 HEADING 'Dept.'
SQL> COLUMN JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT
SQL> COLUMN EMPNO FORMAT 9999 HEADING 'Emp.|Num.'

86

SQL> COLUMN SAL FORMAT 999,999.99 HEADING 'Salario|Mensal'


SQL> COLUMN COMM FORMAT 999,990.99 > HEADING 'Comissao|Y-T-D' NULL 'Sem Com.'
SQL> COLUMN REM FORMAT 9,999,999.99 HEADING 'Remuneracao|Total'
SQL> TTITLE 'RELATORIO DA COMPANHIA|Produzido pelo Departamento
Pessoal'
SQL> BTITLE '*** CONFIDENCIAL ***'
SQL> BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT
SQL> SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM
2 FROM EMP
3 ORDER BY DEPTNO, JOB
Mon Oct 31

page

RELATORIO DA COMPANHIA
Produzido pelo Departamento Pessoal
Emp.
Salario
Comissao
Remuneracao
Dept.
Cargo Num.
Mensal
Y-T-D
Total
----- --------- ----- ----------- ----------- ------------010 CLERK
7934
1,300.00 Sem Com.
15,600.00
MANAGER
7782
2,450.00 Sem Com.
29,400.00
PRESIDENT 7839
5,000.00 Sem Com.
60,000.00
020 ANALYST
CLERK
MANAGER
030 CLERK
MANAGER
SALESMAN

7788
7902
7369
7876
7566

3,000.00
3,000.00
800.00
1,100.00
2,975.00

Sem
Sem
Sem
Sem
Sem

Com.
Com.
Com.
Com.
Com.

7900
7698
7499
7654
7844
7521

950.00 Sem Com.


2,850.00 Sem Com.
1,600.00
300.00
1,250.00
1,400.00
1,500.00
0.00
1,250.00
500.00
*** CONFIDENCIAL ***

36,000.00
36,000.00
9,600.00
13,200.00
35,700.00
11,400.00
34,200.00
19,500.00
16,400.00
18,000.00
15,500.00

SQL> CLEAR COLUMNS


columns cleared
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> CLEAR BREAKS
breaks cleared

11.5

Clculo de sumrios
O comando COMPUTE realiza clculos baseados nas quebras estabelecidas pelo comando
BREAK.
COMPUTE clusulas OF colunas ON quebras
Clusulas
AVG
COU[NT]
MAX[IMUM]
MIN[IMUM]
NUM[BER]

Descrio
calcula a mdia
conta os valores no nulos
valor mximo
valor mnimo
nmero de linhas
87

Tipo da coluna
nmero
qualquer
nmero ou caracter
nmero ou caracter
qualquer

STD
SUM
VAR[IANCE]

desvio padro
soma os valores no nulos
calcula a varincia

nmero
nmero
nmero

Pode haver vrios comandos COMPUTE ativos ao mesmo tempo, mas geralmente mais
fcil especificar tudo em um nico comando, como, por exemplo:
SQL> COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT

Para mostrar o valor corrente:


SQL> COMPUTE
COMPUTE sum avg
COMPUTE sum avg
COMPUTE sum avg
COMPUTE sum avg

OF
OF
OF
OF

SAL ON DEPTNO
SAL ON REPORT
COMM ON DEPTNO
COMM ON REPORT

Para apagar todos os valores:


SQL> CLEAR COMPUTES
computes cleared
SQL> COMPUTE
no computes currently defined

Exemplo utilizando COMPUTE:


SQL> COLUMN DEPTNO FORMAT 09999 HEADING 'Dept.'
SQL> COLUMN JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT
SQL> COLUMN EMPNO FORMAT 9999 HEADING 'Emp.|Num.'
SQL> COLUMN SAL FORMAT 999,999.99 HEADING 'Salario|Mensal'
SQL> COLUMN COMM FORMAT 999,990.99 HEADING 'COMISSAO|Y-T-D' NULL 'Sem
Com.'
SQL> COLUMN REM FORMAT 9,999,999.99 HEADING 'Remuneracao|Total'
SQL> TTITLE 'Relatorio da Companhia|Produzido pelo Departamento
Pessoal'
SQL> BTITLE '*** CONFIDENCIAL ***'
SQL> BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT
SQL> COMPUTE AVG SUM OF SAL COMM ON DEPTNO REPORT
SQL> SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM
2 FROM EMP
3 ORDER BY DEPTNO, JOB
Mon Oct 31

page
Relatorio da Companhia
Produzido pelo Departamento Pessoal

Emp.
Salario
Dept.
Cargo Num.
Mensal
------ --------- ----- ----------00010 CLERK
7934
1,300.00
MANAGER
7782
2,450.00
PRESIDENT 7839
5,000.00
****** *********
----------avg
2,916.67
sum
8,750.00
00020 ANALYST
CLERK
MANAGER

7788
7902
7369
7876
7566

3,000.00
3,000.00
800.00
1,100.00
2,975.00

COMISSAO
Remuneracao
Y-T-D
Total
----------- ------------Sem Com.
15,600.00
Sem Com.
29,400.00
Sem Com.
60,000.00
----------0.00
Sem
Sem
Sem
Sem
Sem

88

Com.
Com.
Com.
Com.
Com.

36,000.00
36,000.00
9,600.00
13,200.00
35,700.00

****** *********
avg
sum
00030 CLERK
MANAGER
SALESMAN

----------- ----------2,175.00
10,875.00
0.00
7900
7698
7499
7654
7844
7521

****** *********
avg
sum

950.00 Sem Com.


2,850.00 Sem Com.
1,600.00
300.00
1,250.00
1,400.00
1,500.00
0.00
1,250.00
500.00
----------- ----------1,566.67
550.00
9,400.00
2,200.00

avg
sum

----------- ----------2,073.21
550.00
29,025.00
2,200.00

11,400.00
34,200.00
19,500.00
16,400.00
18,000.00
15,500.00

*** CONFIDENCIAL ***


14 rows selected.
SQL> CLEAR COLUMN
columns cleared
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTE
computes cleared
SQL> TTITLE OFF
SQL> BTITLE OFF

11.6

Relatrio matricial
Suponha que se deseje produzir um relatrio sumarizando os salrios por cargo e por
departamento, como mostrado abaixo:
Mon Oct 31

page

Relatorio da Companhia
JOB
Departamento 10 Departamento 20 Departamento 30 Total por Cargo
--------- --------------- --------------- --------------- --------------ANALYST
.00
6,000.00
.00
6,000.00
CLERK
1,300.00
1,900.00
950.00
4,150.00
MANAGER
2,450.00
2,975.00
2,850.00
8,275.00
PRESIDENT
5,000.00
.00
.00
5,000.00
SALESMAN
.00
.00
5,600.00
5,600.00
--------------- --------------- --------------- --------------sum
8,750.00
10,875.00
9,400.00
29,025.00
Confidencial

A tabela EMP tem todas as informaes necessrias para produzir o relatrio. Abaixo esto
descritas as etapas a serem seguidas para a obteno do relatrio:
a) Listar as informaes necessrias contidas na tabela EMP, ou seja, JOB, SAL e DEPTNO.
SQL> SELECT JOB, SAL, DEPTNO
2 FROM EMP

89

JOB
SAL DEPTNO
--------- ------- ------CLERK
800
20
SALESMAN
1600
30
SALESMAN
1250
30
MANAGER
2975
20
SALESMAN
1250
30
MANAGER
2850
30
MANAGER
2450
10
ANALYST
3000
20
PRESIDENT
5000
10
SALESMAN
1500
30
CLERK
1100
20
CLERK
950
30
ANALYST
3000
20
CLERK
1300
10
14 rows selected.

b) Separar a coluna SAL em 3 departamentos separados, usando a funo DECODE.


SQL>
2
3
4
5

SELECT JOB,
DECODE(DEPTNO, 10, SAL, 0) D10,
DECODE(DEPTNO, 20, SAL, 0) D20,
DECODE(DEPTNO, 30, SAL, 0) D30
FROM EMP

JOB
D10
D20
D30
--------- ------- ------- ------CLERK
0
800
0
SALESMAN
0
0
1600
SALESMAN
0
0
1250
MANAGER
0
2975
0
SALESMAN
0
0
1250
MANAGER
0
0
2850
MANAGER
2450
0
0
ANALYST
0
3000
0
PRESIDENT
5000
0
0
SALESMAN
0
0
1500
CLERK
0
1100
0
CLERK
0
0
950
ANALYST
0
3000
0
CLERK
1300
0
0
14 rows selected.

c) Sumarizar os campos de acordo com o grupo do cargo e o departamento.


SQL>
2
3
4
5
6

SELECT JOB,
SUM(DECODE(DEPTNO, 10, SAL, 0)) D10,
SUM(DECODE(DEPTNO, 20, SAL, 0)) D20,
SUM(DECODE(DEPTNO, 30, SAL, 0)) D30
FROM EMP
GROUP BY JOB

JOB
D10
D20
D30
--------- ------- ------- ------ANALYST
0
6000
0
CLERK
1300
1900
950
MANAGER
2450
2975
2850
PRESIDENT
5000
0
0
SALESMAN
0
0
5600

d) Calcular os totais para cada grupo de cargo.


90

SQL>
2
3
4
5
6
7

SELECT JOB,
SUM(DECODE(DEPTNO, 10, SAL, 0)) D10,
SUM(DECODE(DEPTNO, 20, SAL, 0)) D20,
SUM(DECODE(DEPTNO, 30, SAL, 0)) D30,
SUM(SAL) TBJ
FROM EMP
GROUP BY JOB

JOB
D10
D20
D30
TBJ
--------- ------- ------- ------- ------ANALYST
0
6000
0
6000
CLERK
1300
1900
950
4150
MANAGER
2450
2975
2850
8275
PRESIDENT
5000
0
0
5000
SALESMAN
0
0
5600
5600

e) Finalmente formatar o relatrio com os comandos do SQL*PLUS.


SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>

SET PAGES 16
COLUMN D10 HEADING 'Departamento 10' FORMAT
COLUMN D20 HEADING 'Departamento 20' FORMAT
COLUMN D30 HEADING 'Departamento 30' FORMAT
COLUMN TBJ HEADING 'Total por Cargo' FORMAT
BREAK ON REPORT
COMPUTE SUM OF D10 D20 D30 TBJ ON REPORT
TTITLE 'Relatorio da Companhia'
BTITLE 'Confidencial'
/

Mon Oct 31

99,999.99
99,999.99
99,999.99
999,999.99

page

Relatorio da Companhia
JOB
Departamento 10 Departamento 20 Departamento 30 Total por Cargo
--------- --------------- --------------- --------------- --------------ANALYST
.00
6,000.00
.00
6,000.00
CLERK
1,300.00
1,900.00
950.00
4,150.00
MANAGER
2,450.00
2,975.00
2,850.00
8,275.00
PRESIDENT
5,000.00
.00
.00
5,000.00
SALESMAN
.00
.00
5,600.00
5,600.00
--------------- --------------- --------------- --------------sum
8,750.00
10,875.00
9,400.00
29,025.00
Confidencial
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> CLEAR COLUMN
columns cleared
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTE
computes cleared

11.7

Arquivo de comandos para o SQL*PLUS


Para criar um arquivo de comandos para o SQL*PLUS:

a) Prepare o comando SELECT


91

b) Salve o comando SELECT (SAVE nome-do-arquivo)


c) Abrir o arquivo salvo para edio (HOST EDIT nome-do-arquivo.SQL)
d) Adicionar os comandos
SET
COLUMN
TTILE
BTITLE
BREAK
COMPUTE
...
SELECT ...
/
TTITLE OFF
BTITLE OFF
CLEAR BREAKS
CLEAR COMPUTES
CLEAR COLUMNS
...
e) Salvar o arquivos
f) Executar o arquivo (@nome-do-arquivo)

92

11.8

Exerccios
a) Produza o relatrio mostrado abaixo
Mon Oct 31

page
R E L A T O R I O

D O S

E M P R E G A D O S

EMP.
DEPARTAMENTO CARGO
NUM. NOME
------------ --------- ----- -------ACCOUNTING
CLERK
7934 MILLER
MANAGER
7782 CLARK
PRESIDENT 7839 KING
************ *********
sum

DATA
SALARIO
COM.
ADM.
MENSAL
ANUAL
TOTAL
----- --------- -------- ----------11/83 1,300.00
0.00
15,600.00
05/84 2,450.00
0.00
29,400.00
07/84 5,000.00
0.00
60,000.00
--------- -------- ----------8,750.00
0.00 105,000.00

RESEARCH

ANALYST

7902
7788
7369
7876
7566

FORD
SCOTT
SMITH
ADAMS
JONES

12/83
03/84
06/83
06/84
10/83

3,000.00
0.00
36,000.00
3,000.00
0.00
36,000.00
800.00
0.00
9,600.00
1,100.00
0.00
13,200.00
2,975.00
0.00
35,700.00
--------- -------- ----------10,875.00
0.00 130,500.00

7900
7698
7499
7654
7844
7521

JAMES
BLAKE
ALLEN
MARTIN
TURNER
WARD

07/84
06/84
08/83
12/83
06/84
03/84

************ *********
sum

950.00
0.00
11,400.00
2,850.00
0.00
34,200.00
1,600.00
300.00
19,500.00
1,250.00 1,400.00
16,400.00
1,500.00
0.00
18,000.00
1,250.00
500.00
15,500.00
--------- -------- ----------9,400.00 2,200.00 115,000.00

sum

--------- -------- ----------29,025.00 2,200.00 350,500.00

CLERK
MANAGER
************ *********
sum
SALES

CLERK
MANAGER
SALESMAN

CONFIDENCIAL
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> SET FEEDBACK ON
SQL> SET PAGESIZE 24
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTES
computes cleared

93

b) Produza o relatrio abaixo. O nmero do departamento deve ser solicitado em tempo de


execuo.
Mon Oct 31

page
R E L A T O R I O

D O S

EMP.
DEPARTAMENTO CARGO
NUM. NOME
------------ --------- ----- -------SALES
CLERK
7900 JAMES
MANAGER
7698 BLAKE
SALESMAN
7499 ALLEN
7521 WARD
7844 TURNER
7654 MARTIN
************ *********
sum

DATA
ADM.
----07/84
06/84
08/83
03/84
06/84
12/83

E M P R E G A D O S
SALARIO COMISSAO
MENSAL
ANUAL
TOTAL
-------- --------- ----------950.00
0.00
11,400.00
2,850.00
0.00
34,200.00
1,600.00
300.00
19,500.00
1,250.00
500.00
15,500.00
1,500.00
0.00
18,000.00
1,250.00 1,400.00
16,400.00
-------- --------- ----------9,400.00 2,200.00 115,000.00
-------- --------- ----------9,400.00 2,200.00 115,000.00

sum

CONFIDENCIAL
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> SET FEEDBACK ON
SQL> SET PAGESIZE 24
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTES
computes cleared

94

11.9

Respostas dos exerccios


a)
SQL> SET ECHO OFF
SQL> SET PAGESIZE 37
SQL> SET FEEDBACK OFF
SQL> SET LINESIZE 78
SQL> TTITLE 'R E L A T O R I O
D O S
E M P R E G A D O S'
SQL> BTITLE 'CONFIDENCIAL'
SQL> DEFINE COMM = 'NVL(COMM,0)'
SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP
SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP
SQL> COL C FORMAT 9999 HEADING 'EMP.|NUM.' TEMP
SQL> COL D FORMAT A8 HEADING 'NOME' TEMP
SQL> COL E FORMAT A5 HEADING 'DATA|ADM.' TEMP
SQL> COL F FORMAT B99,999.99 HEADING 'SALARIO|MENSAL' TEMP
SQL> COL G FORMAT 9,990.99 HEADING 'COM.|ANUAL' TEMP
SQL> COL H FORMAT 999,999.99 HEADING 'TOTAL' TEMP
SQL> BREAK ON REPORT ON A SKIP 2 ON B
SQL> COMPUTE SUM OF F G H ON REPORT A
SQL> SELECT DNAME A, JOB B, EMPNO C, ENAME D,
2 TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
3 FROM EMP E, DEPT D
4 WHERE E.DEPTNO = D.DEPTNO
5 ORDER BY DNAME, JOB
old
2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
new
2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, NVL(COMM,0) G,
SAL*12+NVL(COMM,0) H
b)
SQL> SET ECHO OFF
SQL> SET PAGESIZE 37
SQL> SET FEEDBACK OFF
SQL> SET LINESIZE 78
SQL> TTITLE'R E L A T O R I O
D O S
E M P R E G A D O S'
SQL> BTITLE 'CONFIDENCIAL'
SQL> DEFINE COMM = 'NVL(COMM,0)'
SQL> ACCEPT DEPTNO NUMBER PROMPT 'NUMERO DO DEPARTAMENTO:'
NUMERO DO DEPARTAMENTO:30
SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP
SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP
SQL> COL C FORMAT 9999 HEADING 'EMP.|NUM.' TEMP
SQL> COL D FORMAT A8 HEADING 'NOME' TEMP
SQL> COL E FORMAT A5 HEADING 'DATA|ADM.' TEMP
SQL> COL F FORMAT B99,999.99 HEADING 'SALARIO|MENSAL' TEMP
SQL> COL G FORMAT 9,990.99 HEADING 'COMISSAO|ANUAL' TEMP
SQL> COL H FORMAT 999,999.99 HEADING 'TOTAL' TEMP
SQL> BREAK ON REPORT ON A SKIP 2 ON B
SQL> COMPUTE SUM OF F G H ON REPORT A
SQL> SELECT DNAME A, JOB B, EMPNO C, ENAME D,
2 TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
3 FROM EMP E, DEPT D
4 WHERE E.DEPTNO = D.DEPTNO
5 AND E.DEPTNO = &DEPTNO
6 ORDER BY DNAME, JOB
old
2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
new
2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, NVL(COMM,0) G,
SAL*12+NVL(COMM,0) H
old
5: AND E.DEPTNO = &DEPTNO
new
5: AND E.DEPTNO =
30

95

Captulo 12: Hierarquias - Caminhando na rvore


12.1

Objetivos deste captulo


Utilizar os relacionamentos hierrquicos para recuperar dados em uma tabela.

12.2

Quando possvel caminhar na rvore


A tabela EMP tem uma estrutura em forma de rvore, indicando os gerentes de cada
funcionrio.

KING (EMPNO=7839)
|
------------------------------------- (MGR=7839)
|
|
|
CLARK
JONES
BLAKE
|
|
|
|
-------------------------------------|
|
|
|
|
|
|
|
MILLER
SCOTT FORD ALLEN
WARD
MARTIN
TURNER
JAMES
|
|
ADAMS SMITH

Um banco de dados relacional no armazena os registros em forma hierrquica. Entretanto,


quando existe um relacionamento hierrquico entre linhas de uma nica tabela, existe um
processo de navegao na rvore que permite a hierarquia ser construda. A hierarquia pode
ser vista analisando-se os valores idnticos nas colunas EMPNO e MGR da tabela EMP
(Este relacionamento j foi visto quando foi feita a juno desta tabela com ela mesmo). A
coluna MGR indica o nmero do empregado ao qual o empregado est subordinado.
Quando uma navegao na rvore executada, no espere ver o resultado na forma da figura
acima, o resultado uma tabela.
O nvel (LEVEL) indica a distncia do n raiz da rvore. Para caminhar na rvore da tabela
EMP:
SQL> BREAK ON DEPTNO SKIP 1
SQL>
2
3
4

SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL


FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL

96

LEVEL DEPTNO
EMPNO ENAME
JOB
SAL
------- ------- ------- ---------- --------- ------1
10
7839 KING
PRESIDENT
5000
2
3
4
3
4

20

7566
7788
7876
7902
7369

JONES
SCOTT
ADAMS
FORD
SMITH

MANAGER
ANALYST
CLERK
ANALYST
CLERK

2975
3000
1100
3000
800

2
3
3
3
3
3

30

7698
7499
7521
7654
7844
7900

BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES

MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK

2850
1600
1250
1250
1500
950

2
3

10

7782 CLARK
7934 MILLER

MANAGER
CLERK

2450
1300

Comando

Descrio

SELECT

A clusula SELECT padro, incluindo a pseudo coluna


LEVEL que mostra a distncia do n raiz.
S pode conter uma tabela.
Restringe as linhas pesquisadas durante a navegao.
Especifica as colunas onde existe o relacionamento entre as
linhas. Esta clusula obrigatrio para caminhar na rvore.
Estabelece a direo para caminhar na rvore.
1) PRIOR expresso operador_de_comparao expresso
2) expresso operador_de_comparao PRIOR expresso
Se PRIOR aparece antes de MGR, ento os valores de
MGR so pesquisados primeiro, e depois os valores
equivalentes de EMP, ou seja, pesquisa da raiz para o topo.
Se PRIOR aparece antes de EMP a rvore percorrido do
topo para a raiz.
Especifica onde comea a pesquisa. No pode ser usado na
forma 'START at a LEVEL'. Esta clusula opcional.
a ltima clusula, como sempre.

FROM
WHERE
CONNECT BY
PRIOR

START WITH
ORDER BY

No exemplo acima, a estrutura hierrquica da empresa refletida na navegao pela rvore.


A estrutura chefe/subordinado fica claramente identificada.
A clusula ORDER BY pode ser usada para ordenar as linhas retornadas. O comando abaixo
totalmente legtimo:
SQL>
2
3
4
5

SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL


FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL
ORDER BY DEPTNO

97

LEVEL DEPTNO
EMPNO ENAME
------- ------- ------- ---------1
10
7839 KING
2
7782 CLARK
3
7934 MILLER

JOB
SAL
--------- ------PRESIDENT
5000
MANAGER
2450
CLERK
1300

2
3
4
3
4

20

7566
7788
7876
7902
7369

JONES
SCOTT
ADAMS
FORD
SMITH

MANAGER
ANALYST
CLERK
ANALYST
CLERK

2975
3000
1100
3000
800

2
3
3
3
3
3

30

7698
7499
7521
7654
7844
7900

BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES

MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK

2850
1600
1250
1250
1500
950

No recomendada a utilizao da clusula ORDER BY,


porque a ordenao implcita pode ser destruda.

12.3

Excluindo um n da rvore
As clusulas WHERE e CONNECT BY podem ser usadas para podar a rvore, isto ,
controlar os ns que so mostrados.

WHERE ENAME <> 'SCOTT'

Quando a clusula WHERE utilizada para eliminar o n, somente o n eliminado.

JONES
|
---------------|
|
SCOTT
FORD
|
|
ADAMS
SMITH

Neste exemplo, SCOTT eliminado, mas ADAMS permanece.


SQL>
2
3
4
5

SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL


FROM EMP
WHERE ENAME <> 'SCOTT'
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL

98

LEVEL DEPTNO
EMPNO ENAME
JOB
SAL
------- ------- ------- ---------- --------- ------1
10
7839 KING
PRESIDENT
5000
2
4
3
4

20

7566
7876
7902
7369

JONES
ADAMS
FORD
SMITH

MANAGER
CLERK
ANALYST
CLERK

2975
1100
3000
800

2
3
3
3
3
3

30

7698
7499
7521
7654
7844
7900

BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES

MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK

2850
1600
1250
1250
1500
950

2
3

10

7782 CLARK
7934 MILLER

MANAGER
CLERK

2450
1300

13 rows selected.

CONNECT BY PRIOR EMPNO=MGR AND ENAME <> 'SCOTT'

Quando a clusula CONNECT BY utilizada para eliminar o n, toda a sua ramificao


eliminada.
JONES
|
---------------|
|
SCOTT
FORD
|
|
ADAMS
SMITH

Neste exemplo, SCOTT e ADAMS so eliminados.


SQL>
2
3
4

SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL


FROM EMP
CONNECT BY PRIOR EMPNO = MGR AND ENAME <> 'SCOTT'
START WITH MGR IS NULL

99

LEVEL DEPTNO
EMPNO ENAME
JOB
SAL
------- ------- ------- ---------- --------- ------1
10
7839 KING
PRESIDENT
5000
2
3
4

20

7566 JONES
7902 FORD
7369 SMITH

MANAGER
ANALYST
CLERK

2975
3000
800

2
3
3
3
3
3

30

7698
7499
7521
7654
7844
7900

MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK

2850
1600
1250
1250
1500
950

2
3

10

7782 CLARK
7934 MILLER

MANAGER
CLERK

2450
1300

Ingls

Portugus

Descrio

NODE

ROOT

Raiz

PARENT

Pai

CHILD
TERMINAL NODE
LEAF
BRANCH

Filho
Folha

O mesmo que uma linha da


tabela.
O n que no pertence a nenhum
outro n.
Um n que possui outros ns de
nvel inferior.
Um n que tem um pai.
Um n que no possui filhos.

Ramo ou Galho

Um n que tem filhos e netos.

BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES

12 rows selected.

12.4

12.5

Terminologia

Exerccios
a) Mostrar a organizao do departamento 20.

100

Captulo 13: Dicionrio de Dados


13.1

Objetivos deste captulo


Apresentar o dicionrio de dados do Oracle.

13.2

O que o dicionrio de dados


O dicionrio de dados um conjunto de tabelas e vises que prov um guia de referncia
sobre o banco de dados.
No dicionrio de dados so permitidas apenas consultas por parte dos usurios. O conjunto
de tabelas e vises fixo, e o contedo atualizado automaticamente pelo Oracle, quando
um comando da linguagem de definio de dados (DDL), ou outros comandos, so
executados.
O dicionrio de dados criado quando o banco de dados criado, sendo uma pea crtica no
funcionamento do gerenciador do banco de dados, que utiliza as informaes contidas no
dicionrio de dados para gerenciar o prprio banco de dados.

13.3

Informaes contidas no dicionrio de dados


As seguintes informaes podem ser obtidas a partir do dicionrio de dados:

13.4

Os nomes dos usurios do banco de dados.

Os direitos e privilgios concedidos aos usurios.

Nomes dos objetos do banco de dados (tabelas, vises, ndices, sinnimos, seqncias.)

Restries aplicadas sobre as tabelas.

Informaes de auditoria, tais como que acessou ou atualizou um determinado objeto do


banco de dados.

Tabelas do dicionrio de dados


As tabelas do dicionrio de dados so criadas automaticamente quando o comando CREATE
DATABASE executado.
Todas as tabelas do dicionrio de dados pertencem ao usurio SYS, e no so acessadas
diretamente porque as informaes armazenadas nestas tabelas so de difcil compreenso.

13.5

Vises do dicionrio de dados


As vises do dicionrio de dados contm informaes em uma maneira fcil de serem
compreendidas. Acesso pblico ao dicionrio de dados concedido atravs das vises, e no
do acesso direto s tabelas.
101

As vises do dicionrio de dados tambm pertencem aos usurios SYS.


Os nomes das vises refletem o tipo de uso para o qual elas foram criadas. As vises so
classificadas em trs grupos distinguidos pelos prefixos USER, ALL e DBA.
Classe
USER_xxx
ALL_xxx

DBA_xxx

Descrio
Vises que qualquer usurio pode acessar, contendo
informaes relativas aos objetos do prprio usurio.
Vises que qualquer usurio pode acessar, contendo
informaes relativas tanto aos objetos do prprio usurio,
quanto informaes sobre os objetos aos quais foram
concedidos privilgios ao usurio.
Vises que s podem ser acessadas pelos usurios com
privilgio de administrador do banco de dados

Existem ainda algumas vises que no possuem nenhum destes trs prefixos. Abaixo
mostrada a relao das vises do dicionrio de dados, juntamente com suas descries:
Viso
DICTIONARY
DICT_COLUMNS
TABLE_PRIVILEGES

Viso
ALL_CATALOG
ALL_COL_COMMENTS
ALL_COL_PRIVS

ALL_COL_PRIVS_MADE
ALL_COL_PRIVS_RECD
ALL_CONSTRAINTS
ALL_CONS_COLUMNS
ALL_DB_LINKS
ALL_DEF_AUDIT_OPTS
ALL_DEPENDENCIES
ALL_ERRORS

Descrio
Description of data dictionary tables and
views
Description of columns in data dictionary
tables and views
Grants on objects for which the user is the
grantor, grantee, or owner, or PUBLIC is the
grantee
Descrio
All tables, views, synonyms, sequences
accessible to the user
Comments on columns of accessible tables
and views
Grants on columns for which the user is the
grantor, grantee, owner, or an enabled role or
PUBLIC is the grantee
Grants on columns for which the user is
owner or grantor
Grants on columns for which the user,
PUBLIC or enabled role is the grantee
Constraint definitions on accessible tables
Information about accessible columns in
constraint definitions
Database links accessible to the user
Auditing options for newly created objects
Dependencies to and from objects accessible
to the user
Current errors on stored objects that user is
allowed to create
102

ALL_INDEXES
ALL_IND_COLUMNS
ALL_OBJECTS
ALL_SEQUENCES
ALL_SNAPSHOTS
ALL_SOURCE
ALL_SYNONYMS
ALL_TABLES
ALL_TAB_COLUMNS
ALL_TAB_COMMENTS
ALL_TAB_PRIVS

ALL_TAB_PRIVS_MADE
ALL_TAB_PRIVS_RECD
ALL_TRIGGERS
ALL_TRIGGER_COLS
ALL_USERS
ALL_VIEWS

Viso
DBA_2PC_NEIGHBORS
DBA_2PC_PENDING
DBA_AUDIT_EXISTS
DBA_AUDIT_OBJECT

DBA_AUDIT_STATEMENT
DBA_AUDIT_TRAIL
DBA_CATALOG
DBA_CLUSTERS
DBA_CLU_COLUMNS
DBA_COL_COMMENTS

Descriptions of indexes on tables accessible


to the user
COLUMNs comprising INDEXes on
accessible TABLES
Objects accessible to the user
Description of SEQUENCEs accessible to
the user
Snapshots the user can look at
Current source on stored objects that user is
allowed to create
All synonyms accessible to the user
Description of tables accessible to the user
Columns of all tables, views and clusters
Comments on tables and views accessible to
the user
Grants on objects for which the user is the
grantor, grantee, owner, or an enabled role or
PUBLIC is the grantee
User's grants and grants on user's objects
Grants on objects for which the user,
PUBLIC or enabled role is the grantee
Triggers accessible to the current user
Column usage in user's triggers or in triggers
on user's tables
Information about all users of the database
Text of views accessible to the user

Descrio
information about incoming and outgoing
connections for pending transactions
info about distributed transactions awaiting
recovery
Lists audit trail entries produced by AUDIT
NOT EXISTS and AUDIT EXISTS
Audit trail records for statements concerning
objects, specifically: table, cluster, view,
index, sequence, [public] database link,
[public] synonym, procedure, trigger,
rollback segment, tablespace, role, user
Audit trail records concerning grant, revoke,
audit, noaudit and alter system
All audit trail entries
All database Tables, Views, Synonyms,
Sequences
Description of all clusters in the database
Mapping of table columns to cluster columns
Comments on columns of all tables and
103

DBA_COL_PRIVS
DBA_CONSTRAINTS
DBA_CONS_COLUMNS
DBA_DATA_FILES
DBA_DB_LINKS
DBA_DEPENDENCIES
DBA_ERRORS
DBA_EXP_FILES
DBA_EXP_OBJECTS
DBA_EXP_VERSION
DBA_EXTENTS
DBA_FREE_SPACE
DBA_INDEXES
DBA_IND_COLUMNS
DBA_OBJECTS
DBA_OBJECT_SIZE
DBA_OBJ_AUDIT_OPTS
DBA_PRIV_AUDIT_OPTS
DBA_PROFILES
DBA_ROLES
DBA_ROLE_PRIVS
DBA_ROLLBACK_SEGS
DBA_SEGMENTS
DBA_SEQUENCES
DBA_SNAPSHOTS
DBA_SNAPSHOT_LOGS
DBA_SOURCE
DBA_STMT_AUDIT_OPTS
DBA_SYNONYMS
DBA_SYS_PRIVS
DBA_TABLES
DBA_TABLESPACES
DBA_TAB_COLUMNS
DBA_TAB_COMMENTS
DBA_TAB_PRIVS
DBA_TRIGGERS
DBA_TRIGGER_COLS

views
All grants on columns in the database
Constraint definitions on all tables
Information about accessible columns in
constraint definitions
Information about database files
All database links in the database
Dependencies to and from objects
Current errors on all stored objects in the
database
Description of export files
Objects that have been incrementally
exported
Version number of the last export session
Extents comprising all segments in the
database
Free extents in all tablespaces
Description for all indexes in the database
COLUMNs comprising INDEXes on all
TABLEs and CLUSTERs
All objects in the database
Sizes, in bytes, of various pl/sql objects
Auditing options for all tables and views
Describes current system privileges being
audited across the system and by user
Display all profiles and their limits
All Roles which exist in the database
Roles granted to users and roles
Description of rollback segments
Storage allocated for all database segments
Description of all SEQUENCEs in the
database
All snapshots in the database
All snapshot logs in the database
Source of all stored objects in the database
Describes current system auditing options
across the system and by user
All synonyms in the database
System privileges granted to users and roles
Description of all tables in the database
Description of all tablespaces
Columns of all tables, views and clusters
Comments on all tables and views in the
database
All grants on objects in the database
All triggers in the database
Column usage in all triggers
104

DBA_TS_QUOTAS
DBA_USERS
DBA_VIEWS

Tablespace quotas for all users


Information about all users of the database
Text of all views in the database

Viso
USER_AUDIT_OBJECT

Descrio
Audit trail records for statements concerning
objects, specifically: table, cluster, view,
index, sequence, [public] database link,
[public] synonym, procedure, trigger,
rollback segment, tablespace, role, user
Audit trail records concerning grant, revoke,
audit, noaudit and alter system
Audit trail entries relevant to the user
Tables, Views, Synonyms and Sequences
owned by the user
Descriptions of user's own clusters
Mapping of table columns to cluster columns
Comments on columns of user's tables and
views
Grants on columns for which the user is the
owner, grantor or grantee
All grants on columns of objects owned by
the user
Grants on columns for which the user is the
grantee
Constraint definitions on user's own tables
Information about accessible columns in
constraint definitions
Database links owned by the user
Dependencies to and from a users objects
Current errors on stored objects owned by the
user
Extents comprising segments owned by the
user
Free extents in tablespaces accessible to the
user
Description of the user's own indexes
COLUMNs comprising user's INDEXes or
on user's TABLES
Objects owned by the user
Sizes, in bytes, of various pl/sql objects
Auditing options for user's own tables and
views

USER_AUDIT_STATEMENT
USER_AUDIT_TRAIL
USER_CATALOG
USER_CLUSTERS
USER_CLU_COLUMNS
USER_COL_COMMENTS
USER_COL_PRIVS
USER_COL_PRIVS_MADE
USER_COL_PRIVS_RECD
USER_CONSTRAINTS
USER_CONS_COLUMNS
USER_DB_LINKS
USER_DEPENDENCIES
USER_ERRORS
USER_EXTENTS
USER_FREE_SPACE
USER_INDEXES
USER_IND_COLUMNS
USER_OBJECTS
USER_OBJECT_SIZE
USER_OBJ_AUDIT_OPTS

105

USER_RESOURCE_LIMITS
USER_ROLE_PRIVS
USER_SEGMENTS
USER_SEQUENCES
USER_SNAPSHOTS
USER_SNAPSHOT_LOGS
USER_SOURCE
USER_SYNONYMS
USER_SYS_PRIVS
USER_TABLES
USER_TABLESPACES
USER_TAB_COLUMNS
USER_TAB_COMMENTS
USER_TAB_PRIVS
USER_TAB_PRIVS_MADE
USER_TAB_PRIVS_RECD
USER_TRIGGERS
USER_TRIGGER_COLS
USER_TS_QUOTAS
USER_USERS
USER_VIEWS

Display resource limit of the user


Roles granted to current user
Storage allocated for all database segments
Description of the user's own SEQUENCEs
Snapshots the user can look at
All snapshot logs owned by the user
Source of stored objects accessible to the
user
The user's private synonyms
System privileges granted to current user
Description of the user's own tables
Description of accessible tablespaces
Columns of user's tables, views and clusters
Comments on the tables and views owned by
the user
Grants on objects for which the user is the
owner, grantor or grantee
All grants on objects owned by the user
Grants on objects for which the user is the
grantee
Triggers owned by the user
Column usage in user's triggers
Tablespace quotas for the user
Information about the current user
Text of views owned by the user

Para compatibilidade com os SQL/DS e o DB2 da IBM existem aindas as vises:


SYSCATALOG, SYSCOLAUTH, SYSCOLUMNS, SYSDBLINKS, SYSEXTENTS,
SYSFILES, SYSINDEXES, SYSROLLBACKSEG, SYSSEGOBJ, SYSSTORAGE,
SYSTABALLOC, SYSTABAUTH, SYSTABSPACES, SYSTEM_AUDIT,
SYSTSQUOTAS, SYSUSERAUTH, SYSUSERLIST, SYSVIEWS, SYS_OBJECTS.
13.6

Exemplos de utilizao do dicionrio de dados


Listar todas as tabelas acessveis ao usurio.
SQL> DESCRIBE ACCESSIBLE_TABLES
Name
------------------------------OWNER
TABLE_NAME
TABLE_TYPE

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

Type
---CHAR(30)
CHAR(30)
CHAR(11)

SQL> SELECT *
2 FROM ACCESSIBLE_TABLES
3 ORDER BY 1,2
OWNER
-------------------ALUNO1
ALUNO1

TABLE_NAME
-------------------ASSIGNMENTS
BONUS

106

TABLE_TYPE
----------TABLE
TABLE

ALUNO1
CUSTOMER
TABLE
ALUNO1
DEPT
TABLE
ALUNO1
DUMMY
TABLE
ALUNO1
EMP
TABLE
ALUNO1
ITEM
TABLE
ALUNO1
ORD
TABLE
ALUNO1
PRICE
TABLE
ALUNO1
PRODUCT
TABLE
ALUNO1
PROJECTS
TABLE
ALUNO1
SALES
VIEW
ALUNO1
SALGRADE
TABLE
SYS
ACCESSIBLE_COLUMNS
VIEW
SYS
ACCESSIBLE_TABLES
VIEW
SYS
ALL_CATALOG
VIEW
SYS
ALL_COL_COMMENTS
VIEW
SYS
ALL_COL_GRANTS_MADE VIEW
..............................................
SYS
ALL_TAB_GRANTS_RECD VIEW
SYS
ALL_USERS
VIEW
SYS
ALL_VIEWS
VIEW
SYS
AUDIT_ACCESS
VIEW
SYS
AUDIT_ACTIONS
TABLE
SYS
AUDIT_CONNECT
VIEW
SYS
AUDIT_TRAIL
VIEW
SYS
CATALOG
VIEW
SYS
CLUSTERCOLUMNS
VIEW
SYS
CLUSTERS
VIEW
..............................................
SYS
USER_AUDIT_CONNECT
VIEW
SYS
USER_AUDIT_RESOURCE VIEW
SYS
USER_AUDIT_TRAIL
VIEW
..............................................
SYS
USER_TS_QUOTAS
VIEW
SYS
USER_USERS
VIEW
SYS
USER_VIEWS
VIEW
SYS
V4EXPCLUS
VIEW
SYS
V4EXPCOL
VIEW
SYS
V4EXPEXTENTS
VIEW
SYS
V4EXPINDEX
VIEW
SYS
V4EXPSPACE
VIEW
SYS
V4EXPSYN
VIEW
SYS
V4EXPTAB
VIEW
SYS
V4EXPTABAUTH
VIEW
SYS
V4EXPUSER
VIEW
SYS
V4EXPVIEW
VIEW
SYSTEM
HELP
TABLE
136 rows selected.

Listar todos os usurios do banco de dados.


SQL> DESCRIBE ALL_USERS
Name
------------------------------USERNAME
USER_ID
CREATED

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

Type
---CHAR(30)
NUMBER
DATE

SQL> SELECT * FROM ALL_USERS


USERNAME
USER_ID CREATED
------------------------------ ------- --------SYS
0 30-DEC-91
PUBLIC
1 30-DEC-91
SYSTEM
2 30-DEC-91
SCOTT
3 30-DEC-91

107

ALUNO1
_NEXT_USER

4 19-OCT-94
5 30-DEC-91

6 rows selected.

Listar todos os ndices criados nas tabelas do usurio.


SQL> DESCRIBE USER_INDEXES
Name
------------------------------INDEX_NAME
TABLE_OWNER
TABLE_NAME
TABLE_TYPE
UNIQUENESS
TABLESPACE_NAME
INI_TRANS
MAX_TRANS
INITIAL_EXTENT
NEXT_EXTENT
MIN_EXTENTS
MAX_EXTENTS
PCT_INCREASE
PCT_FREE
STATUS
SQL>
SQL>
SQL>
SQL>
2
3

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

NULL
NULL
NULL
NULL

Type
---CHAR(30)
CHAR(30)
CHAR(30)
CHAR(11)
CHAR(9)
CHAR(30)
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
CHAR(17)

COLUMN INDEX_NAME FORMAT A20


COLUMN TABLE_OWNER FORMAT A20
COLUMN TABLE_NAME FORMAT A20
SELECT INDEX_NAME, TABLE_OWNER, TABLE_NAME, TABLE_TYPE
FROM USER_INDEXES
ORDER BY 1,2

INDEX_NAME
TABLE_TYPE
-------------------ITEM_INDEX
ORD_INDEX
PRICE_INDEX
PRODUCT_INDEX

TABLE_OWNER

TABLE_NAME

-------------------ALUNO1
ALUNO1
ALUNO1
ALUNO1

-------------------ITEM
ORD
PRICE
PRODUCT

Listar as descries das colunas de todas as tabelas do banco de dados.


SQL> DESCRIBE DBA_COL_COMMENTS
ERROR:
ORA-00942: table or view does not exist

Esta consulta s pode ser realizada por um usurio com privilgio de DBA.
SQL> CONNECT SYSTEM
Connected.
SQL> DESCRIBE DBA_COL_COMMENTS
Name
------------------------------OWNER
TABLE_NAME
COLUMN_NAME
COMMENTS

13.7

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

Exerccios
a) Mostrar as seguintes informaes para a tabela EMP:
108

Type
---CHAR(30)
CHAR(30)
CHAR(30)
CHAR(255)

-------TABLE
TABLE
TABLE
TABLE

Coluna
Nulo?
------------------------------- -------EMPNO
NOT NULL
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO

109

Tipo
-------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)

Captulo 14: Linguagem de Definio de Dados


14.1

Objetivos deste captulo


Apresentar os comandos utilizados para criar, alterar, trocar de nome, adicionar comentrios
e remover tabelas.

14.2

Estrutura de Dados do Oracle


Tabelas podem ser criadas a qualquer momento, mesmo com usurios acessando o banco de
dados.
Comprimento dos dados varivel. Somente os caracteres e nmeros especificados so
armazenados. Espaos frente e traz no so armazenados.
No existe a necessidade de se especificar o tamanho das tabelas. As tabelas ocupam novos
segmentos quando necessrio.
A estrutura das tabelas podem ser modificadas on-line.

14.3

Criando uma tabela


Devem ser observadas as seguintes regras para o nome de uma tabela:

O nome deve comear por uma letra, de "A" a "Z", ou de "a" a "z".

O nome pode conter letras, nmeros, e o caractere especial sublinhado (_). Os caracteres
"$" e "# tambm podem ser usado, mas seu uso desaconselhado.

O nome o mesmo, independentemente do uso de letras minsculas ou maisculas. Por


exemplo, EMP, emp. EmP, Emp, e Emp so a mesma tabela.

O nome pode conter at 30 caracteres.

O nome da tabela no pode ser igual ao de outra tabela, sinnimo ou viso, a no ser que
pertenam a usurios diferentes.

O nome no pode ser uma das palavras reservadas do Oracle.


Nome
EMP85
85EMP
LUCRO_BRUTO
LUCRO BRUTO
UPDATE
TABELA1

Vlido
Sim
No, comea com nmero.
Sim
No, contm espao.
No, palavra reservada.
Sim, mas nome no diz nada.

110

14.4

14.5

Recomendaes sobre os nomes das tabelas

Usar nomes descritivos para as tabelas, colunas, ndices e outros objetos.

Abreviar de forma consistente, mantendo sempre a mesma abreviatura.

Consistncia de singular e plural, no colocando o nome de algumas tabelas no singular


e de outras no plural

Usar uma regra consistente para atribuir nomes. Uma regra pode ser, todas as tabelas do
sistema financeiro comeam com FIN_.

Use o mesmo nome para descrever o mesmo atributo em tabelas diferentes.

Tipo de dado das colunas


Tipo
CHAR(n)

VARCHAR(n)
VARCHAR2(n)

LONG

RAW(n)

LONG RAW
ROWID
MLSLABEL
NUMBER(p,s)
DATE

FLOAT

Contedo
Caracteres alfanumricos com at 'n' caracteres. Coluna de
tamanho constante independente do que est armazenado.
Mximo de 255 caracteres.
Caracteres alfanumricos com at 'n' caracteres. No Oracle 6
sinnimo de CHAR, e pode ter no mximo 255 caracteres.
Caracteres alfanumricos com at 'n caracteres. Introduzida no
Oracle 7, o tamanho armazenado varia de acordo com o contedo
da coluna, e pode ter at 2000 caracteres.
Caracteres alfanumricos com at 2 GigaBytes (2**31 - 1). S
pode haver uma coluna LONG por tabela. No pode ser
indexada. No podem ser especificadas restries de integridade,
exceto NOT NULL.
Dados binrios, como som e imagem, at 255 bytes. No podem
ser executadas funes de manipulao de caracteres sobre
colunas RAW. Tem as mesmas restries de LONG. No existe
converso de caracteres, como, por exemplo, ANSI x PC850.
Semelhante a RAW, porm podendo armazenar at 2 GigaBytes.
Caracteres hexadecimais representando o endereo nico de uma
linha em uma tabela.
Formato binrio to rtulo do sistema operacional. Usado com o
Trusted ORACLE.
Nmero com a preciso 'p' e a escala 's'. A preciso 'p' pode
variar de 1 a 38. A escala 's' pode variar de -84 a +127
Data vlida, desde 1 de janeiro de 4712 AC, at 31 de dezembro
de 4712 DC. Para cada coluna DATA so armazenados o Sculo,
o Ano, o Ms, o Dia, a Hora, o Minuto e o Segundo.
Nmero de ponto flutuante com preciso decimal de 38 dgitos,
ou preciso binria de 126 dgitos.

111

Dado
7456123,89
7456123,89
7456123,89
7456123,89
7456123,8
7456123,8
7456123,89
7456123,8
14.6

Especificao
NUMBER
NUMBER(9)
NUMBER(9,2)
NUMBER(9,1)
NUMBER(6)
NUMBER(15,1)
NUMBER(7,-2)
NUMBER(7,2)

Relao entre os tipos de dados ANSI e do Oracle


ANSI
CHARACTER(n), CHAR(n)
CHARACTER VARYING(n), CHAR VARYING(n)
NUMERIC(p,s), DECIMAL(p,s), DEC(p,s)
INTEGER, INT, SMALLINT
FLOAT(b), DOUBLE PRECISION, REAL

14.7

ORACLE
CHAR(n)
VARCHAR(n)
NUMBER(p,s)
NUMBER(38)
NUMBER

Relao entre os tipos de dados do SQL/DS e do Oracle


SQL/DS ou DB2
CHARACTER(n)
VARCHAR(n)
LONG VARCHAR
DECIMAL(p,s)
INTEGER, SMALLINT
FLOAT(b)
GRAPHIC
LONG VARGRAPHIC
VARGRAPHIC
TIMESTAMP
TIME

14.8

Valor armazenado
7456123,89
7456124
7456123,89
7456123,9
preciso excedida
7456123,8
7456100
preciso excedida

ORACLE
CHAR(n)
VARCHAR(n)
LONG
NUMBER(p,s)
NUMBER(38)
NUMBER
DATE
DATE

Criao de tabelas
14.8.1 Sintaxe do comando:
CREATE TABLE [esquema.] nome_da_tabela [restries]
(nome_da_coluna tipo_de_dado (tamanho) [DEFAULT valor] [restries])
[PCTFREE inteiro PCTUSED inteiro INITRANS inteiro MAXTRANS inteiro]
[TABLESPACE espao_de_tabela STORAGE armazenamento]
112

Restrio
CONSTRAINT
nome_da_restrio

NULL
NOT NULL
UNIQUE

PRIMARY KEY

FOREIGN KEY
(coluna...)
REFERENCES
tabela(col(s))
CHECK condio

DISABLE
(ENABLE)
EXCEPTIONS
INTO

Descrio
Especifica o nome da restrio. opcional. Quando
omitido o nome padro tem a forma de SYS_Cn, onde 'n'
um nmero inteiro atribudo pelo Oracle que identifica
unicamente a restrio.
Especifica se a coluna pode ou no conter valores nulos.
Designa uma coluna, ou uma combinao de colunas,
como chave nica. Cada coluna deve ser declarada como
NOT NULL, e no podem ser chave primria.
Designa uma coluna, ou uma combinao de colunas,
como chave primria. As colunas devem ser declaradas
como NOT NULL e no podem ter a restrio UNIQUE.
Se a chave primria contiver apenas uma coluna pode ser
declarada na restrio da coluna. Se a chave primria
contiver mltiplas colunas deve ser declarada na restrio
da tabela.
Identifica a(s) coluna(s) como chave estrangeira .
REFERENCES identifica a chave primria ou chave nica
que referenciada.
Especifica a condio que uma coluna deve satisfazer para
a linha ser aceita na tabela. S pode se referenciar a colunas
da mesma tabela. Uma restrio de coluna s pode
referenciar a uma coluna, porm uma restrio de tabela
pode referenciar mltiplas colunas.
Desativa (ativa) uma restrio de integridade. O pado a
restrio ativa.
Identifica a tabela na qual o ORACLE armazena as
informaes sobre as linhas que violaram as restries de
integridade. A tabela deve existir antes desta condio ser
especificada.

14.8.2 Criao das tabelas do curso:


CREATE TABLE DEPT (
DEPTNO
NUMBER(2)
DNAME
CHAR(14),
LOC
CHAR(13),
PRIMARY KEY (DEPTNO)

NOT NULL,
CONSTRAINT DEPT_PRIMARY_KEY)

CREATE TABLE EMP (


EMPNO
NUMBER(4)
NOT NULL,
ENAME
CHAR(10),
JOB
CHAR(9),
MGR
NUMBER(4)
REFERENCES EMP (EMPNO) CONSTRAINT EMP_S_KEY,
HIREDATE
DATE,
SAL
NUMBER(7,2),
COMM
NUMBER(7,2),
DEPTNO
NUMBER(2)
NOT NULL,

113

FOREIGN KEY (DEPTNO)


PRIMARY KEY (EMPNO)

REFERENCES DEPT (DEPTNO) CONSTRAINT EMP_F_K,


CONSTRAINT EMP_PRIMARY_KEY)

CREATE TABLE SALGRADE (


GRADE
NUMBER,
LOSAL
NUMBER,
HISAL
NUMBER)

14.8.3 Exemplos de restries


Tabela SAL no permitindo salrio nulo.
ALTER TABLE EMP MODIFY (SAL NUMBER CONTRAINT NN_SAL NOT NULL)

Tabela DEPT com restries de coluna.


CREATE TABLE DEPT (
DEPTNO
NUMBER(2)
CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME
VARCHAR2(9) CONSTRAINT UNQ_DNAME UNIQUE,
LOC
VARCHAR2(10))

Tabela DEPT com chave primria definida como restrio de tabela.


CREATE TABLE DEPT (
DEPTNO
NUMBER(2)
NOT NULL,
DNAME
VARCHAR2(9),
LOC
CHAR(13),
PRIMARY KEY (DEPTNO) CONSTRAINT DEPT_PRIMARY_KEY)

Tabela DEPT com nome do departamento nico definido como restrio de tabela.
CREATE TABLE DEPT (
DEPTNO
NUMBER(2) NOT NULL,
DNAME
CHAR(14),
LOC
CHAR(13),
CONSTRAINT UNQ_DNAME UNIQUE (DNAME)
USING INDEX PCTFREE 20 TABLESDPACE TBLSP_DEPT
STORAGE (INITIAL 8K NEXT 6K))

Tabela DEPT com opo CHECK.


CREATE TABLE DEPT (
DEPTNO
NUMBER
CONSTRAINT CHECK_DEPTNO
CHECK (DEPTNO BETWEEN 10 AND 99)
DISABLE,
DNAME

CHAR(14)
CONSTRAINT CHECK_DNAME
CHECK(DNAME=UPPER(DNAME))
DISABLE,

LOC

CHAR(13)
CONSTRAINT CHECK_LOC
CHECK (LOC IN ('DALLAS','BOSTON',...))
DISABLE)

Tabela EMP com opo ON DELETE CACADE.


CREATE TABLE EMP (
EMPNO
NUMBER(4)
ENAME
CHAR(10),
JOB
CHAR(9),

NOT NULL,

114

MGR
NUMBER(4)
REFERENCES EMP (EMPNO) CONSTRAINT EMP_S_KEY,
HIREDATE
DATE,
SAL
NUMBER(7,2),
COMM
NUMBER(7,2),
DEPTNO
NUMBER(2)
NOT NULL,
CONSTRAINT FK_DEPTNO REFERENCES DEPT(DEPTNO) ON DELETE CASCADE)

Tabela CENSUS com um ndice nico composto


CREATE TABLE CENSUS
ADD CONSTRAINT UNQ_CITY_STATE UNIQUE (CITY, STATE)
USING INDEX PCTFREE 5 TABLESPACE TBLSP_CESUS
EXCEPTIONS INTO BAD_KEYS_IN_SHIP_CONT

14.9

Criando uma tabela a partir de outra tabela


possvel criar uma tabela a partir de outra tabela j existente, atravs do comando:
CREATE TABLE nome_da_tabela
[(especificao das colunas)]
AS SELECT...
Exemplo:
SQL> CREATE TABLE EMPREGADOS AS SELECT * FROM EMP
Table created.

O comando DESCRIBE permite visualizar a estrutura das tabelas.


SQL> DESCRIBE EMP
Name
------------------------------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO

Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)

SQL> DESCRIBE EMPREGADOS


Name
------------------------------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO

Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)

SQL> SELECT * FROM EMPREGADOS


EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- -------

115

7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782

13-JUN-83
15-AUG-83
26-MAR-84
31-OCT-83
05-DEC-83
11-JUN-84
14-MAY-84
05-MAR-84
09-JUL-84
04-JUN-84
04-JUN-84
23-JUL-84
05-DEC-83
21-NOV-83

800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

300
500
1400

20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.

Como pode ser visto, as duas tabelas tem exatamente a mesma estrutura e o mesmo
contedo.
Tabelas tambm podem ser criadas a partir da juno de outras tabelas.
SQL>
2
3
4
5
6

CREATE TABLE SALARIOS_DOS_EMPREGADOS


(NOME, SALARIO, FAIXA)
AS
SELECT
ENAME, SAL, GRADE
FROM
EMP, SALGRADE
WHERE
SAL BETWEEN LOSAL AND HISAL

Table created.
SQL> DESCRIBE SALARIOS_DOS_EMPREGADOS
Name
Null?
------------------------------- -------NOME
SALARIO
FAIXA
SQL> SELECT *
2 FROM
SALARIOS_DOS_EMPREGADOS
NOME
SALARIO
FAIXA
---------- ------- ------SMITH
800
1
ADAMS
1100
1
JAMES
950
1
WARD
1250
2
MARTIN
1250
2
MILLER
1300
2
ALLEN
1600
3
TURNER
1500
3
JONES
2975
4
BLAKE
2850
4
CLARK
2450
4
SCOTT
3000
4
FORD
3000
4
KING
5000
5
14 rows selected.

14.10 Alterando uma tabela


Para adicionar uma coluna na tabela usamos:
116

Type
---CHAR(10)
NUMBER(7,2)
NUMBER

ALTER TABLE nome_da_tabela


ADD ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restries_de_coluna])
SQL> ALTER TABLE EMPREGADOS
2 ADD (NOME_DA_ESPOSA CHAR(10))
Table altered.
SQL> DESCRIBE EMPREGADOS
Name
------------------------------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
NOME_DA_ESPOSA

Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)
CHAR(10)

Para alterar a tabela empregados e garantir todos tenham salrio inferior a 5000:
SQL> ALTER TABLE EMPREGADOS
2 ADD (CHECK(SAL<=5000))
Table altered.

Para modificar uma coluna na tabela usamos:


ALTER TABLE nome_da_tabela
MODIFY ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restries_de_coluna])
Para modificar a coluna NOME_DA_ESPOSA para aceitar at 25 caracteres fazemos:
SQL> ALTER TABLE EMPREGADOS
2 MODIFY (NOME_DA_ESPOSA CHAR(25))
Table altered.
SQL> DESCRIBE EMPREGADOS
Name
------------------------------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
NOME_DA_ESPOSA

Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)
CHAR(25)

14.11 Trocando o nome de uma tabela


Os nomes dos objetos do banco de dados podem ser trocado atravs do comando:
RENAME nome_antigo TO nome_novo
117

Para trocar o nome da tabela de EMPREGADOS para FUNCIONARIOS:


SQL> RENAME EMPREGADOS TO FUNCIONARIOS
Table renamed.
14.12 Descrio das tabelas e colunas
A descrio das tabelas e das colunas pode ser armazenada no dicionrio de dados atravs do
comando COMMENT.
Para adicionar a descrio da tabela FUNCIONARIOS:
SQL> COMMENT ON TABLE FUNCIONARIOS IS 'CADASTRO DE FUNCIONARIOS'
Comment created.

Para adicionar a descrio da coluna NOME_DA_ESPOSA da tabela FUNCIONARIOS:


SQL> COMMENT ON COLUMN FUNCIONARIOS.NOME_DA_ESPOSA IS > 'NOME DA ESPOSA DO FUNCIONARIO'
Comment created.

14.13 Removendo tabelas


As tabelas podem ser removidas do banco de dados atravs do comando:
DROP TABLE nome_da_tabela
Para remover a tabelas SALARIOS_DOS_EMPREGADOS e FUNCIONARIOS:
SQL> DROP TABLE SALARIOS_DOS_EMPREGADOS
Table dropped.
SQL> DROP TABLE FUNCIONARIOS
Table dropped.

14.14 Exerccios
a) Criar as seguintes tabelas:
Tabela: PROJECTS
PROJID
P_DESC
P_START_DATE
P_END_DATE
BUDGET_AMOUNT
MAX_NO_STAFF

NUMBER
CHARACTER
DATE
DATE
NUMBER
NUMBER

4
20

Tabela: ASSIGNMENTS
PROJID
EMPNO

NUMBER
NUMBER

4
4

NOT NULL

7,2
2

118

NOT NULL
NOT NULL

A_START_DATE
A_END_DATE
BILL_RATE
ASSIGN_TYPE

DATE
DATE
NUMBER
CHAR

4,2
2

b) Com as tabelas criadas adicionar a seguinte coluna a tabela ASSIGNMENTS:


HOURS

NUMBER

c) Adicionar comentrios s tabelas criadas para descrever o contedo.


d) Adicionar comentrios coluna PROJID da tabela PROJECTS descrevendo seu
contedo.
e) Mostrar a especificao das colunas das viso USER_COL_COMMENTS.
f) Mostrar os nomes das tabelas, das colunas, e os comentrios para as colunas.
g) Mostrar a especificao das colunas das viso USER_TAB_COMMENTS.
h) Mostrar os nomes das tabelas e os comentrios para as tabelas.

119

14.15 Respostas dos exerccios


a)
SQL>
2
3
4
5
6
7

CREATE TABLE PROJECTS (


PROJID
NUMBER(4)
P_DESC
CHAR(20),
P_START_DATE
DATE,
P_END_DATE
DATE,
BUDGET_AMOUNT
NUMBER(7,2),
MAX_NO_STAFF
NUMBER(2))

SQL>
2
3
4
5
6
7

CREATE TABLE ASSIGNMENTS (


PROJID
NUMBER(4)
EMPNO
NUMBER(4)
A_START_DATE
DATE,
A_END_DATE
DATE,
BILL_RATE
NUMBER(4,2),
ASSIGN_TYPE
CHAR(2))

NOT NULL,

NOT NULL,
NOT NULL,

b)
SQL> ALTER TABLE ASSIGNMENTS
2 ADD (HOURS NUMBER(2))
c)
SQL> COMMENT ON TABLE PROJECTS IS 'UNIQUE PROJECT DETAILS'
SQL> COMMENT ON TABLE ASSIGNMENTS IS > 'ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT'
d)
SQL> COMMENT ON COLUMN PROJECTS.PROJID IS > 'UNIQUE IDENTIFIER FOR A PROJECT'
e)
SQL> DESCRIBE USER_COL_COMMENTS
Name
------------------------------TABLE_NAME
COLUMN_NAME
COMMENTS

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

Type
---CHAR(30)
CHAR(30)
CHAR(255)

f)
SQL> SELECT * FROM USER_COL_COMMENTS WHERE COMMENTS IS NOT NULL
TABLE_NAME
COLUMN_NAME
COMMENTS
--------------- --------------- --------------------------------------PROJECTS
PROJID
UNIQUE IDENTIFIER FOR A PROJECT
g)
SQL> DESCRIBE USER_TAB_COMMENTS
Name
Null?
------------------------------- -------TABLE_NAME
NOT NULL
TABLE_TYPE
COMMENTS

Type
--------CHAR(30)
CHAR(11)
CHAR(255)

h)
SQL> SELECT * FROM USER_TAB_COMMENTS WHERE COMMENTS IS NOT NULL
TABLE_NAME
--------------ASSIGNMENTS
PROJECTS

TABLE_TYPE
----------TABLE
TABLE

COMMENTS
-----------------------------------------ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT
UNIQUE PROJECT DETAILS

120

Captulo 15: Linguagem de Manipulao de Dados


15.1

Objetivos deste captulo


Mostrar a linguagem de manipulao de dados (DML), utilizada para inserir, atualizar e
eliminar registros do banco de dados.

15.2

Inserindo novas linhas em uma tabela


Para inserir linhas em uma tabela utilizado o comando INSERT.
INSERT INTO nome_da_tabela [(coluna, coluna, ...)]
VALUES (valor, valor, ...)
Os exemplos sero efetuados sobre a tabela Department criada a partir da tabela Dept.
SQL>
2
3
4

CREATE TABLE DEPARTMENT


AS
SELECT *
FROM DEPT

Table created.

Quando os novos valores so inseridos em todas as colunas da tabela, na mesma ordem das
colunas da tabela, a lista de colunas pode ser omitida. recomendado que a lista de colunas
seja sempre especificada, para no haver necessidade de alterar o programa quando uma
nova coluna for adicionada tabela.
Para inserir um novo departamento.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC )
2 VALUES (50, 'MARKETING', 'SAN JOSE' )
1 row created.

Para inserir apenas o nmero e a localidade do novo departamento.


SQL> INSERT INTO DEPARTMENT ( DEPTNO, LOC )
2 VALUES ( 60, 'ALBERTA' )
1 row created.

Em vez que omitir o nome do departamento na lista de colunas, pode ser especificado o
valor nulo para o nome do departamento, o resultado o mesmo.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC )
2 VALUES ( 70, NULL, 'DETROIT' )
1 row created.

Podem ser utilizadas variveis de substituio para fornecimento dos valores.


SQL> INSERT
2 VALUES
Enter value
Enter value

INTO DEPARTMENT ( DEPTNO, DNAME, LOC )


( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' )
for dept_num: 80
for dept_name: RESEARCH

121

Enter value for dept_loc: ATLANTA


old
2: VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' )
new
2: VALUES ( 80, 'RESEARCH', 'ATLANTA' )
1 row created.

Para inserir um novo departamento omitindo a lista de colunas.


SQL> INSERT INTO DEPARTMENT
2 VALUES ( 90, 'INSURANCE', 'LONDON' )
1 row created.

Listando a tabela de departamentos aps as inseres:


SQL> SELECT *
2 FROM DEPARTMENT
3 ORDER BY DEPTNO
DEPTNO
------10
20
30
40
50
60
70
80
90

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
MARKETING
RESEARCH
INSURANCE

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
SAN JOSE
ALBERTA
DETROIT
ATLANTA
LONDON

9 rows selected.

Para os exemplos de insero de valores de data e hora ser criada a tabela Employee a partir
da tabela Emp.
SQL>
2
3
4

CREATE TABLE EMPLOYEE


AS
SELECT *
FROM EMP

Table created.

Quando uma data inserida, o formato DD-MON-YY geralmente usado. Com este
formato, o sculo padro o sculo 20 (19xx). O campo data tambm contm informao de
hora, que quando no especificada assume o valor padro de zero horas (00:00:00).
Se for necessrio especificar a data em outro sculo, ou for necessrio especificar a hora, a
funo TO_DATE utilizada.
SQL>
2
3
4
5
6
7
8
9
10

INSERT INTO EMPLOYEE


( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO )
VALUES (
7658,
'CODD',
'ANALYST',
7566,
TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
3000,
NULL,

122

11 20)
1 row created.

Para exemplo de insero de valores a partir de uma outra tabela ser criada a tabela
SALARY_GRADE a partir da tabela SALGRADE.
SQL>
2
3
4

CREATE TABLE SALARY_GRADE


AS
SELECT * FROM SALGRADE
WHERE GRADE=0

Table created.

Como no existe nenhum departamento com nmero zero na tabela SALGRADE, no foi
includa nenhuma linha na tabela SALARY_GRADE durante a criao.
SQL> SELECT *
2 FROM SALARY_GRADE
no rows selected

Para inserir na tabela SALARY_GRADE, a partir da tabela SALGRADE, os valores


correspondentes faixa 1.
SQL>
2
3
4

INSERT INTO SALARY_GRADE


SELECT *
FROM SALGRADE
WHERE GRADE = 1

1 row created.

Para verificar se a incluso foi feita corretamente.


SQL> SELECT *
2 FROM SALARY_GRADE
GRADE
LOSAL
HISAL
------- ------- ------1
700
1200

15.3

Atualizando linhas em uma tabela


Para atualizar linhas de uma tabela utilizado o comando UPDATE.
UPDATE
SET
[WHERE

nome_da_tabela [alis]
coluna, [,coluna...] = {expresso ou sub-consulta}
condio]

Para atualizar as informaes do funcionrio SCOTT.


SQL>
2
3
4
5
6

UPDATE EMPLOYEE
SET
JOB
= 'SALESMAN',
HIREDATE = SYSDATE,
SAL
= SAL*1.1
WHERE ENAME = 'SCOTT'

1 row updated.

123

Para trocar todos os cargos de SALESMAN por vendedor.


SQL> UPDATE EMPLOYEE
2 SET JOB
= 'VENDEDOR'
3 WHERE JOB = 'SALESMAN'
5 rows updated.

Para listar a tabela aps as atualizaes.


SQL> SELECT ENAME, JOB
2 FROM EMPLOYEE
3 ORDER BY JOB, ENAME
ENAME
---------CODD
FORD
ADAMS
JAMES
MILLER
SMITH
BLAKE
CLARK
JONES
KING
ALLEN
MARTIN
SCOTT
TURNER
WARD

JOB
--------ANALYST
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
MANAGER
MANAGER
PRESIDENT
VENDEDOR
VENDEDOR
VENDEDOR
VENDEDOR
VENDEDOR

15 rows selected.

15.4

Eliminando linhas de uma tabela


Para eliminar linhas de uma tabela utilizado o comando DELETE.
DELETE FROM nome_da_tabela
[WHERE condio]
Para eliminar todos os empregados que trabalham no departamento 10.
SQL> DELETE FROM EMPLOYEE
2 WHERE DEPTNO = 10
3 rows deleted.

Para eliminar todos os empregados.


SQL> DELETE FROM EMPLOYEE
12 rows deleted.

Para verificar como ficou a tabela aps a eliminao.


SQL> SELECT * FROM EMPLOYEE

124

no rows selected

Apesar de no possuir nenhuma linha, a tabela Employee ainda existe, para elimin-la
utilizado o comando da linguagem de definio de dados (DDL) DROP TABLE.
SQL> DROP TABLE EMPLOYEE
Table dropped.

15.5

Exerccios
a) Inserir as seguintes linhas na tabela PROJECTS
PROJID
P_DESC
P_START_DATE
P_END_DATE
BUDGET_AMOUNT
MAX_NO_STAFF

1
WRITE C030 COURSE
02-JAN-88
07-JAN-88
500
1

2
PROOF READ NOTES
01-JAN-89
10-JAN-89
600
1

b) Inserir as seguintes linhas na tabela ASSIGNMENTS


PROJID
EMPNO
A_START_DATE
A_END_DATE
BILL_RATE
ASSIGN_TYPE
HOURS

1
7369
01-JAN-88
03-JAN-88
50.00
WR
15

1
7902
04-JAN-88
07-JAN-88
55.00
WR
20

c) Alterar ASSIGNMENT_TYPE: trocar WR por WT.

125

2
7844
01-JAN-89
10-JAN-89
45.50
PF
30

15.6

Respostas dos exerccios


a)
SQL>
2
3
4

INSERT INTO PROJECTS


(PROJID,P_DESC,P_START_DATE,P_END_DATE,BUDGET_AMOUNT,MAX_NO_STAFF)
VALUES
(1,'WRITE C030 COURSE','02-JAN-88','07-JAN-88',500,2)

SQL>
2
3
4

INSERT INTO PROJECTS


(PROJID,P_DESC,P_START_DATE,P_END_DATE,BUDGET_AMOUNT,MAX_NO_STAFF)
VALUES
(2,'PROOF READ NOTES','01-JAN-89','10-JAN-89',600,1)

b)
SQL>
2
3
4

INSERT INTO ASSIGNMENTS


(PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS)
VALUES
(1,7369,'01-JAN-88','03-JAN-88',50.00,'WR',15)

SQL>
2
3
4

INSERT INTO ASSIGNMENTS


(PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS)
VALUES
(1,7902,'04-JAN-88','07-JAN-88',55.00,'WR',20)

SQL>
2
3
4

INSERT INTO ASSIGNMENTS


(PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS)
VALUES
(2,7844,'01-JAN-89','10-JAN-89',45.50,'PF',30)

c)
SQL> UPDATE ASSIGNMENTS
2 SET ASSIGN_TYPE = 'WT'
3 WHERE ASSIGN_TYPE = 'WR'

126

Captulo 16: Processamento de transaes


16.1

Objetivos deste captulo


Fazer uma introduo ao conceito de transao.

16.2

O que uma transao


Uma transao um conjunto de operaes efetuadas em um banco de dados, que causam
alteraes em uma ou mais tabelas.
Existem duas classes de transaes. Transaes produzidas pela linguagem de manipulao
de dados (DML), que consistem em um ou mais comandos de DML, as quais o Oracle trata
como uma nica entidade ou unidade lgica de trabalho (LUW). Transaes causadas pela
linguagem de definio de dados (DDL) contm apenas um comando.
As transaes no podem ficar pela metade no banco de dados, ou todas as transaes de
uma unidade lgica de trabalho so efetivadas, ou nenhuma efetivada no banco de dados.
No pode haver o caso em que umas so efetivadas e outras no.
Uma transao comea com o primeiro comando de DML ou DDL executado, e termina
com um dos seguintes comandos.

COMMIT ou ROLLBACK

comando de DDL

Erros

Desconexo (logoff, exit)

Falha de mquina

Um comando de DDL efetivado automaticamente, e portanto termina implicitamente uma


transao.
Aps o fim de uma transao, a prxima declarao SQL inicia uma nova transao
automaticamente.
16.3

Efetivando as mudanas
Para tornar as mudanas no banco de dados permanentes, elas devem ser efetivadas. O
comando COMMIT utilizado para efetivar as mudanas, e o comando ROLLBACK
utilizado para descartar as mudanas.
Os comandos emitidos entre dois comandos COMMIT definem uma transao.
At que o comando Commit seja executado, as mudanas so vistas apenas pelo usurio que
as efetuou, os demais usurios enxergam a situao anterior as modificaes.
127

16.4

Removendo mudanas
Mudanas no efetivadas podem ser descartadas atravs do comando ROLLBACK.
O comando ROLLBACK retorna os dados ao estado em que se encontrava
aps o ltimo COMMIT.

16.5

Falhas do sistema
Quando uma transao interrompida por um erro, como, por exemplo, uma falha do
sistema, toda a transao descartada (Rolled back). Este procedimento previne que os erros
causem mudanas no desejadas aos dados.
O Rollback automtico mais freqentemente causado por falhas no sistema, tais como falta
de luz ou queda do sistema operacional. Erros causados pela entrada de comandos, tais como
digitar o nome errado para uma coluna ou tentar realizar uma operao no permitida na
tabela de outro usurio, no interrompem uma transao, nem causam um Rollback
automtico, porque estes erros so detectados na fase de 'parse' do comando (quando o
comando lido e verificado), e no durante a fase de execuo.

16.6

O significado de uma transao


O Oracle garante a consistncia dos dados baseado nas transaes. Transaes fornecem
mais flexibilidade e controle para trabalhar com os dados. Por exemplo, quando um valor
debitado de uma conta e creditado em outra, esta operao uma transao, que deve ser
totalmente efetivada (Commit), ou descartada (Rollback), no pode haver o caso em que
existe o dbito sem que haja o crdito correspondente.

16.7

Controlando transaes
Os seguintes comandos SQL so utilizados para controlar uma transao:

16.8

COMMIT [WORK]

SAVEPOINT nome_do_savepoint

ROLLBACK [WORK]

ROLLBACK TO nome_do_savepoint

COMMIT [WORK]

Torna as mudanas causadas pela transao corrente permanente

Elimina todos os SavePoints

Termina a transao
128

Libera os Locks causados pela transao

A palavra WORK opcional

Deve ser executada explicitamente e no implicitamente, caso contrrio em caso de


trmino anormal do programa a ltima transao desfeita (Rollback).

COMMIT implcito ou automtico ocorre nas seguintes situaes:


-

antes de um comando de DDL

aps um comando de DDL

quando de uma desconexo normal

Comandos de DDL sempre geram um Commit quando so executados. Quando um


comando de DDL executado aps a execuo de vrios comandos de DML, o Commit
executado antes do comando de DDL ser executado. Aps o comando DDL ser executado,
se a execuo no causar erro, esta tambm efetivada.
16.9

SAVEPOINT savepoint_name

Pode ser utilizado para dividir uma transao em pores menores.

Permite guardar o trabalho at um determinado ponto, para que mais tarde seja
possvel desfaz-lo totalmente, ou apenas at este determinado ponto.

Quando um novo SavePoint criado com o mesmo nome de um anterior, o anterior


eliminado.

O nmero mximo de SavePoints por processo de usurio 5, por padro. Este


padro pode ser mudado.

S existe Rollback to SavePoint, no existe Commit to SavePoint.

16.10 ROLLBACK[WORK] to [SAVEPOINT] savepoint_name

O comando Rollback utilizado para desfazer alteraes.

A palavra WORK opcional.

Rollback sem To SavePoint causa:


-

Fim da transao

Desfaz as alteraes

Elimina todos os SavePoints da transao


129

Libera os Locks da transao

16.11 Rollback a nvel de declarao


Se uma nica declarao de DML falha, somente esta transao desfeita. Esta caracterstica
chamada de Rollback a nvel de declarao, e permite que se efetue tanto o Rollback
quanto o Commit das transaes anteriores a transao que falhou.
Se a transao for de DDL, o Commit executado antes da transao no permite o Rollback
das transaes anteriores.
Oracle realiza um Rollback a nvel de declarao atravs da criao de um SavePoint
implcito antes de cada transao de DML. Este SavePoint no acessvel diretamente pelo
usurio.
Quando feito um ROLLBACK TO SAVEPOINT:

Uma poro da transao desfeita.

mantm o SavePoint at onde foi feito o Rollback, mas perde os SavePoints criados
aps o SavePoint para o qual o Rollback foi feito.

Libera tabelas e Locks a nvel de linha.

16.12 Rollbacks implcitos


Rollbacks implcitos ocorrem em caso de trmino anormal
16.13 Autocommit
Commit pode ser executado automaticamente atravs do comando SET AUTOCOMMIT
ON. Neste caso, aps cada comando INSERT, UPDATE ou DELETE executado um
comando COMMIT automaticamente.
Com SET AUTOCOMMIT OFF, o prprio usurio tem que executar o comando COMMIT
manualmente.
O comando SET AUTOCOMMIT um comando do SQL*PLUS, no do Oracle.
16.14 Exemplo de utilizao de COMMIT e ROLLBACK
Para eliminar os departamentos com nmero maior do que 40.
SQL> DELETE FROM DEPARTMENT
2 WHERE DEPTNO > 40
5 rows deleted.

130

Para efetivar o comando anterior.


SQL> COMMIT
Commit complete.

Para verificar que os departamentos foram realmente eliminados.


SQL> SELECT * FROM DEPARTMENT
DEPTNO
------10
20
30
40

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

Para inserir o departamento 50, Testing, de Las Vegas.


SQL> INSERT INTO DEPARTMENT VALUES ( 50, 'TESTING', 'LAS VEGAS')
1 row created.

Para verificar como ficou a tabela aps a insero.


SQL> SELECT * FROM DEPARTMENT
DEPTNO
------10
20
30
40
50

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
TESTING

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS

Para criar um SavePoint neste ponto.


SQL> SAVEPOINT INSERT_DONE
Savepoint created.

Para, por erro, trocar o nome de todos os departamentos por MARKETING.


SQL> UPDATE DEPARTMENT
2 SET DNAME = 'MARKETING'
5 rows updated.

Para verificar o erro cometido.


SQL> SELECT * FROM DEPARTMENT
DEPTNO DNAME
LOC
------- -------------- ------------10 MARKETING
NEW YORK
20 MARKETING
DALLAS
30 MARKETING
CHICAGO
40 MARKETING
BOSTON
50 MARKETING
LAS VEGAS

131

Para desfazer o erro da ltima declarao, mas sem desfazer a incluso do departamento 50.
SQL> ROLLBACK TO INSERT_DONE
Rollback complete.

Para verificar como ficou a tabela.


SQL> SELECT * FROM DEPARTMENT
DEPTNO
------10
20
30
40
50

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
TESTING

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS

Para atualizar apenas o nome do departamento SALES, como seria correto.


SQL> UPDATE DEPARTMENT
2 SET DNAME = 'MARKETING'
3 WHERE DNAME = 'SALES'
1 row updated.

Para efetivar todas as mudanas.


SQL> COMMIT
Commit complete.

Para verificar como ficou a tabela.


SQL> SELECT * FROM DEPARTMENT
DEPTNO
------10
20
30
40
50

DNAME
-------------ACCOUNTING
RESEARCH
MARKETING
OPERATIONS
TESTING

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS

Para desabilitar a efetivao automtica (padro).


SQL> SET AUTOCOMMIT OFF

Para eliminar todas as linhas da tabela.


SQL> DELETE FROM DEPARTMENT
5 rows deleted.

Para verificar como ficou a tabela.


132

SQL> SELECT * FROM DEPARTMENT


no rows selected

Para desfazer a eliminao das linhas.


SQL> ROLLBACK
Rollback complete.

Para verificar como ficou a tabela.


SQL> SELECT * FROM DEPARTMENT
DEPTNO
------10
20
30
40
50

DNAME
-------------ACCOUNTING
RESEARCH
MARKETING
OPERATIONS
TESTING

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS

Para habilitar a efetivao automtica.


SQL> SET AUTOCOMMIT ON

Quando se apaga as linhas da tabela no h retorno com efetivao automtica habilitada.


SQL> DELETE FROM DEPARTMENT
Commit complete.
5 rows deleted.
SQL> ROLLBACK
Rollback complete.
SQL> SELECT * FROM DEPARTMENT
no rows selected

16.15 Consistncia de leitura


Usurios de banco de dados realizam dois tipos de acesso ao banco de dados:

Operaes de leitura (comando Select)

Operaes de gravao (comandos Insert, Update e Delete)

necessrio se garantir uma consistncia de leitura tanto para os usurios que esto
gravando quanto para os usurios que esto lendo do banco de dados. Os usurios que esto
lendo no devem enxergar os dados que esto em processo de alterao. Os usurios que
esto gravando devem enxergar os dados da forma como foram alterados, mesmo que as
mudanas no tenham ainda sido efetivadas.
A finalidade da consistncia de leitura garantir que cada usurio veja os dados da forma
como existiam antes do ltimo Commit.
133

A consistncia de leitura implementada mantendo-se uma cpia parcial do banco de dados


nos segmentos de Rollback.
Quando uma insero, uma atualizao ou uma eliminao feita no banco de dados, o
Oracle faz uma cpia dos dados antes das mudanas, e guarda esta cpia no Segmento de
Rollback.
Todos os usurios que efetuam leituras, exceto aquele que causou as mudanas, enxergam o
banco de dados como ele existia antes das mudanas, atravs da cpia mantida nos
Segmentos de Rollback.
Antes das mudanas serem efetivadas, somente o usurio que modificou os dados enxerga o
banco de dados com as modificaes incorporadas.
Aps a efetivao das mudanas, todos os usurios passam a enxergar os dados com as
mudanas efetuadas, e os Segmentos de Rollback so liberados.
Quando ocorre um Rollback, os dados gravados nos Segmentos de Rollback so escritos de
volta nas tabelas.
16.16 Transaes somente de leitura
Por padro, o modelo de consistncia do Oracle garante que os resultados de um comando
so consistentes. Entretanto, em algumas situaes, pode ser necessrio processar vrias
consultas em dados de vrias tabelas e garantir que os dados so consistentes, ou seja, os
resultados produzidos pela consulta uma tabela so consistentes com os resultados das
consultas a qualquer outra tabela.
A declarao SQL SET TRANSACTION READ ONLY utilizada para iniciar uma
transao de leitura apenas.
A consistncia de leitura que READ ONLY prov implementada da mesma maneira que a
consistncia nvel de declarao - usando segmentos de rollback. Cada declarao por
padro enxerga uma viso consistente dos dados na hora em que a declarao foi feita. Esta
funcionalidade muito til para relatrios que processam mltiplas consultas enquanto os
usurios atualizam as mesmas tabelas.
Notas:
A declarao SET TRANSACTION READ ONLY deve ser a primeira da transao.
Somente consultas so permitidas na transao.
COMMIT, ROLLBACK ou uma declarao DDL terminam a transao. Com DDL
nenhuma indicao dada que a transao terminou.
Durante a transao, todas as consultas se referem ao mesmo instantneo (snapshot)
do banco de dados (mudanas efetivadas antes da transao comear).
134

Outros usurios podem continuar a atualizar os dados.

Exemplo:
SQL> SET TRANSACTION READ ONLY
Transaction set.
SQL> SELECT * FROM DEPT
DEPTNO
------10
20
30
40

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

SQL> COMMIT
Commit complete.

135

Captulo 17: Concorrncia e Bloqueio


17.1

Objetivos deste captulo


Mostrar como o Oracle manuseia os bloqueios (locks).
Tipos e nveis de bloqueio.
Bloqueio padro.
Bloqueio implcito e explcito.
Bloqueio mortal (Deadlock).
Este captulo no possui exerccios.

17.2

Introduo ao bloqueio
Uma das maiores tarefas de um sistema gerenciador de banco de dados (SGBD) controlar a
concorrncia, ou seja, o acesso aos mesmos dados por vrios usurios. Sem um controle
correto de concorrncia os dados podem ser atualizados incorretamente ou fora de
seqncia, comprometendo, portanto, a integridade dos dados.
Oracle resolve os problemas resultantes das atualizaes concorrentes atravs de bloqueios.
Bloqueios de tabelas e linhas so uma parte essencial para manter a consistncia e a
integridade do banco de dados.
Bloqueios so usados para:
proteger os dados
controlar os usurios
Qualquer estratgia de bloqueio deve balancear os objetivos de mxima concorrncia, isto ,
permitir o maior nmero de usurios no sistema, com relao a mxima proteo dos dados.

17.3

O que um bloqueio
O bloqueio o mecanismo que usado para controlar o acesso aos dados em um sistema
multi-usurio, prevenindo que dois usurios atualizem o mesmo dado ao mesmo tempo.

17.4

Quando os bloqueios so necessrios


Bloqueios so ativados sempre que um usurio comea a realizar alteraes no banco de
dados.
O Oracle permite que qualquer nmero de usurios leiam os dados ao mesmo tempo, porque
os bloqueios no so necessrios para a leitura.
136

Usurios consultando dados nunca bloqueiam usurios modificando dados, e


usurios modificando dados nunca bloqueiam usurios lendo dados.
17.5

Quando os bloqueios so liberados


Os bloqueios so liberados aps o Commit ou o Rollback, ou seja, no final da transao.

17.6

Tipos de bloqueios
17.6.1 Bloqueios do dicionrio de dados (DDL)
controla o acesso s definies dos objetos do banco de dados.
usado para controlar as operaes SQL que modificam o dicionrio de dados, tais
como, Create Table, Alter Table, Drop Table...
controlado automaticamente pelo SGBD Oracle.
17.6.2 Bloqueios da manipulao de dados (DML)
controla o acesso aos dados nas tabelas dos usurios.
o Oracle automaticamente bloqueia as tabelas que esto sendo atualizadas pelos
usurios (bloqueio implcito).
o usurio pode solicitar o bloqueio atravs de comandos SQL (bloqueio explcito)
Este captulo trata de bloqueios causados pela DML.

17.7

Nveis de bloqueio
Bloqueio a nvel de tabela - toda a tabela bloqueada.
Bloqueio a nvel de linha - somente as linhas da tabela so bloqueadas.

17.8

Descrio dos bloqueios


Modo de bloqueio
Compartilhado
Share locks
Exclusivo
Exclusive lock

Severidade
Pode ser adquirido por mais de um usurio para a mesma
tabela ao mesmo tempo. Permite o compartilhamento do
recurso dependendo da operao.
Pode ser adquirido por apenas um usurio de cada vez. O
primeiro usurio a adquirir um bloqueio exclusivo o
nico que pode atualizar at o bloqueio exclusivo ser
liberado.
137

Nveis de Bloqueio
Nvel de Linha
Row Locks (TX)

Nvel de Tabela
Table Locks (TM)

Descrio
- Um bloqueio exclusivo adquirido para cada linha
modificada pelos comandos INSERT, UPDATE,
DELETE ou SELECT FOR UPDATE.
- Uma linha sempre bloqueada de forma exclusiva, para
no permitir outros usurios atualizar a mesma linha ao
mesmo tempo.
- Bloqueios de linha so sempre adquiridos
automaticamente pelo Oracle quando um dos comandos
listados anteriormente executado.
- Existem diversos modos de bloqueio para tabelas.
- Um bloqueio para a tabela adquirido quando a tabela
modificada pelos comandos INSERT, UPDATE,
DELETE, SELECT FOR UPDATE ou LOCK TABLE.
- As operaes de DML necessitam de bloqueio a nvel
de tabela para impedir comandos de DDL serem
executados sobre uma tabela sendo modificada.

Descrio dos modos de bloqueio s tabelas.


Bloqueio de Tabela
Row Share (RS)

Row Exclusive (RX)

Share Lock (S)

Descrio
- Indica que a transao tem inteno de atualizar linhas
da tabela.
- Adquirido quando um dos comandos SELECT FOR
UPDATE ou LOCK TABLE IN ROW SHARE MODE
executado.
- o menos restritivo dos bloqueios, permitindo o maior
grau de concorrncia para a tabela.
- Permite: consultas, inseres, atualizaes , eliminao
e bloqueio de linhas da mesma tabela.
- No permite: LOCK TABLE IN EXCLUSIVE MODE.
- Indica que a transao atualizou uma ou mais linhas da
tabela.
- automaticamente adquirido quando um dos comandos
INSERT, UPDATE, DELETE ou LOCK TABLE IN
ROW EXCLUSIVE MODE executado.
- um pouco mais restritivo do que Row Share.
- Permite: consultas, inseres, atualizaes,, eliminao
e bloqueios de linhas na mesma tabela.
- No permite: LOCK TABLE IN SHARE MODE,
LOCK TABLE IN SHARE EXCLUSIVE MODE e
LOCK TABLE IN EXCLUSIVE MODE.
- ativado pelo comando LOCK TABLE IN SHARE
MODE.
- Permite: consultas, SELECT FOR UPDATE e LOCK
TABLE IN SHARE MODE.
- No permite: INSERT, DELETE, UPDATE, LOCK
TABLE IN SHARE ROW EXCLUSIVE MODE, LOCK
138

TABLE IN EXCLUSIVE MODE, LOCK TABLE IN


ROW EXCLUSIVE MODE.
Share Row Exclusive - ativado pelo comando LOCK TABLE IN SHARE
(SRX)
ROW EXCLUSIVE MODE.
- Permite: consultas tabela e bloqueios atravs do
comando SELECT FOR UPDATE.
- No permite: outras transaes atualizar a tabela.
Exclusive (X)
- ativado pelo comando LOCK TABLE IN
EXCLUSIVE MODE.
- o mais restritivo dos bloqueios.
- Permite: consultas tabela.
- No permite: qualquer operao de DML por outros
usurios.
A tabela abaixo indica os modos de bloqueio adquiridos pelos comandos SQL e as
operaes que estes bloqueios permitem e proibem.

DECLARAO SQL
SELECT
INSERT
UPDATE
DELETE
SELECT FOR UPDATE
LOCK TABLE IN ROW SHARE
MODE
LOCK TABLE IN ROW EXCLUSIVE
MODE
LOCK TABLE IN SHARE MODE
LOCK TABLE IN SHARE ROW
EXCLUSIVE MODE
LOCK TABLE IN EXCLUSIVE
MODE

17.9

Modo
de lock
da
tabela
none
RX
RX
RX
RS
RS

RS

RX

SRX X

S
S
S*
S*
S*
S

S
S
S*
S*
S*
S

S
N
N
N
S*
S

S
N
N
N
S*
S

S
N
N
N
N
N

RX

S
SRX

S
S

N
N

Y
N

N
N

N
N

Bloqueios implcitos
Relao dos bloqueios adquiridos automaticamente pelo Oracle:
Comando
SELECT
INSERT
UPDATE
DELETE
SELECT FOR UPDATE
DDL

LINHA
X
X
X
X
139

TABELA
RX
RX
RX
RS
RX

17.10 Bloqueios explcitos

Comando
LOCK TABLE tabela IN ROW SHARE MODE
LOCK TABLE tabela IN ROW EXCLUSIVE MODE
LOCK TABLE tabela IN SHARE MODE
LOCK TABLE tabela IN SHARE EXCLUSIVE MODE
LOCK TABLE tabela IN EXCLUSIVE MODE

Bloqueio
RS
RX
S
SRX
X

17.11 Identificao da linha e bloqueio


importante executar os comandos Commit ou Rollback o quanto antes para liberar os
bloqueios adquiridos pela transao.
O processo de efetivao pode ser acelerado utilizando ROWID para localizar as linhas
dentro das tabelas. ROWID uma pseudo-coluna que tem um valor nico para cada linha da
tabela. ROWID contm o endereo da linha, sendo, portanto, o meio mais rpido de acesso
uma linha.

ROWID

00004C90.0001.0001

Descrio:
Bloco:
00004C90
Linha do bloco:
0001
Arquivo do banco de dados: 0001

ROWID uma chave nica para uma linha de uma tabela,


mesmo que a linha esteja repetida na tabela.

Exemplo:
COLUMN ROWID NEW_VALUE ROW_IDENT
SELECT ENAME, JOB, HIREDATE, SAL, ROWID
FROM EMP
WHERE ENAME = SCOTT
FOR UPDATE OF JOB, HIREDATE, SAL

140

UPDATE EMP
SET JOB = SALESMAN, HIREDATE = SYSDATE, SAL = 1.1 * SAL
WHERE ROWID = &ROW_IDENT

17.12 Impasse (Deadlock)


Imagine a seguinte situao:
Transao A:
UPDATE EMP SET SAL = 1200 WHERE ENAME = LEWIS
Transao B:
UPDATE DEPT SET LOC = LONDON WHERE DEPTNO = 20
Transao A:
UPDATE DEPT SET LOC = RICHMOND WHERE DEPTNO = 20
Transao B:
UPDATE EMP SET SAL = 1750 WHERE ENAME = LEWIS
Desta forma:
a transao A s pode prosseguir aps a transao B liberar a linha da tabela
DEPT bloqueada
a transao B s pode prosseguir quando a transao A liberar a linha da tabela
EMP bloqueada
ou seja, temos um caso de DEADLOCK.
Deadlocks podem ocorrer sempre que dois ou mais usurios esto acessando as mesmas
tabelas do banco de dados. Ocorre quando o usurio A est aguardando a liberao de uma
linha bloqueada pelo usurio B, e o usurio B est na mesma situao com relao ao
usurio A.
Esta situao pode ser evitada quando os dois usurios acessando a mesma tabela o fazem na
mesma ordem. Desta forma um segue o outro, no havendo Deadlock.
Quando o acesso feito a mais de uma tabela, deve ser estabelecida uma ordem de acesso s
tabelas para todas as aplicaes. Pode ser criado para isto uma tabela no banco de dados,
com uma identificao nica de sua ordem de acesso. As tabelas de menor ordem so
acessadas primeiro.
TABELA

LOCK

SEQNCIA
141

-----------------EMP
DEPT
SALGRADE

---------RS
RS
X

-----------------2
1
10

142

Captulo 18 - Vises
18.1

Objetivos deste captulo


Mostrar a criao e utilizao de vises (views).

18.2

O que uma viso


Uma viso como uma janela atravs da qual os dados das tabelas podem ser vistos
e alterados.
Uma viso derivada de uma tabela ou de outra viso, a qual chamada de tabela ou
viso base. - uma tabela real com os dados fisicamente armazenados.
Uma viso armazenada na forma de um comando SELECT apenas. uma tabela
virtual, ou seja, uma tabela que no existe fisicamente no banco de dados, mas parece
existir.
Uma viso no tem dados prprios. Os dados so manipulados a partir das tabelas
base.
Vises so teis pelas seguintes razes:
Restringir o acesso ao banco de dados. Permite enxergar apenas parte das tabelas.
Permite aos usurios executar consultas simples para obter resultados de consultas
complexas. Podem ser recuperados dados de vrias tabelas como se fosse uma nica
tabela.
Prov independncia de dados, permitindo alterar as tabelas base sem afetar as
aplicaes dos usurios.

18.3

Classificao das vises


18.3.1 Vises simples
dados derivados de uma nica tabela
no contm funes ou dados grupados.
18.3.2 Vises complexas
dados derivados de mltiplas tabelas
contm funes ou dados grupados.

143

18.4

O comando CREATE VIEW


Sintaxe:
CREATE VIEW nome_da_view [(coluna1, coluna2,...)]
AS
SELECT clusula_select
[WITH CHECK OPTION [CONSTRAINT nome_da_restrio]]
Para criar uma viso simples chamada D10EMP, a partir da tabela EMP, contendo certos
detalhes dos funcionrios do departamento 10:
SQL>
2
3
4
5
6

CREATE VIEW D10EMP


AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
WITH CHECK OPTION

View created.

Para recuperar os dados atravs da viso:


SQL> SELECT *
2 FROM D10EMP
EMPNO
------7782
7839
7934

ENAME
DEPTNO
---------- ------CLARK
10
KING
10
MILLER
10

Para criar uma viso complexa, chamada DEPT_SUMMARY, contendo funes de grupo e
dados de mais de uma tabela:
CREATE VIEW DEPT_SUMMARY ( NAME, MINSAL, MAXSAL, AVGSAL )
AS
SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL)
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DNAME

Note que nomes alternativos para as colunas foram especificados na viso, o que
necessrio quando os itens da clusula Select no esto de acordo com as regras para nomes
de colunas, ou se alguma coluna derivada de uma funo ou expresso.
Quando um alis utilizado para o nome da coluna na clusula Select, no necessrio
colocar um nome para a coluna na clusula Create View.
CREATE VIEW DEPT20
AS
SELECT ENAME, SAL*12 ANNSAL
FROM EMP
WHERE DEPTNO = 20

144

18.5

Usando uma viso para operaes de DML


Vises so poderosas porque permitem realizar verificao de integridade referencial nos
dados modificados atravs delas.
A clusula WITH CHECK OPTION especifica que inseres e atualizaes realizadas
atravs da viso no podem gerar linhas que a viso no pode enxergar. Se na viso
D10EMP tentarmos inserir um funcionrio do departamento 20 um erro gerado.
SQL> INSERT INTO D10EMP ( EMPNO, ENAME, DEPTNO )
2 VALUES ( 9999, 'MICHAEL', 20 )
INSERT INTO D10EMP ( EMPNO, ENAME, DEPTNO )
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

A viso EMP_DATA s permite inseres ou atualizaes se o salrio estiver na faixa 1000


a 2000, o gerente estiver cadastrado na tabela de empregados, e o departamento estiver
cadastrado na tabela de departamentos.
SQL>
2
3
4
5
6
7
8

CREATE VIEW EMP_DATA


AS
SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND MGR IN ( SELECT DISTINCT EMPNO FROM EMP )
AND DEPTNO IN ( SELECT DEPTNO FROM DEPT )
WITH CHECK OPTION

View created.

A viso EMP_DETAILS restringe o acesso aos dados do prprio usurio, no perodo das 7
s 17 horas, de segunda a sexta-feira.
SQL>
2
3
4
5
6
7
8

CREATE VIEW EMP_DETAILS


AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE ENAME = USER
AND TO_CHAR(SYSDATE,'HH24') BETWEEN 7 AND 17
AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
WITH CHECK OPTION

View created.

A restrio WITH CHECK OPTION pode ter um nome prprio.


SQL>
2
3
4
5
6

CREATE VIEW EMPLOYEES ( ID_NUMBER, NAME, POSITION, DEPARTMENT )


AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT )
WITH CHECK OPTION CONSTRAINT DEPT_CHECK

View created.

145

Quando a viso criada, o comando SELECT no executado, o comando


SELECT simplesmente armazenado no dicionrio de dados.
Quando os dados so acessados atravs da viso, so realizadas as seguintes operaes:
Recuperao da definio da viso do dicionrio de dados.
Verificao dos privilgios de acesso.
Converter a consulta da viso em uma operao equivalente sobre a(s) tabela(s) base.
Atravs da viso USER_VIEWS do dicionrio de dados, a definio da viso pode ser
recuperada. Alguns parmetros SET influenciam no texto mostrado:
Maxdata
Arraysize
Long
SQL> DESCRIBE USER_VIEWS
Name
Null?
------------------------------- -------VIEW_NAME
NOT NULL
TEXT_LENGTH
TEXT

Type
---CHAR(30)
NUMBER
LONG

SQL> COLUMN VIEW_NAME FORMAT A15


SQL> COLUMN TEXT FORMAT A50
SQL> SELECT *
2 FROM USER_VIEWS
VIEW_NAME
TEXT_LENGTH TEXT
--------------- ----------- ------------------------------------------D10EMP
73 SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
WITH CHECK OPTION
EMPLOYEES

113 SELECT EMPNO, ENAME, JOB, DEPTNO


FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPT

EMP_DATA

190 SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO


FROM EMP
WHERE SAL BETWEEN 1000 AND 2

EMP_DETAILS

165 SELECT EMPNO, ENAME, JOB, DEPTNO


FROM EMP
WHERE ENAME = USER
AND TO_CHAR(SYSDATE

SALES

291 SELECT REPID,ORD.CUSTID,CUSTOMER.NAME CUSTNAME


PRODUCT.PRODID,
DESCRIP PRODNA

146

18.6

Alterando dados atravs das vises


As seguintes restries se aplicam quando os dados so alterados atravs das vises:
Eliminao proibida de a viso contm:
Juno.
Funes de grupo.
Clusula GROUP BY.
Clusula DISTINCT.
Coluna ROWNUM.
Sub-consulta correlacionada.
Atualizao proibida se a viso contm:
Alguma das condies anteriores.
Colunas definidas por expresso.
Insero proibida se a viso contm:
Alguma das condies acima.
Coluna NOT NULL da tabela que no consta da viso.

18.7

Eliminao de vises
As vises so eliminadas atravs do comando DROP VIEW nome_da_viso.
SQL> DROP VIEW D10EMP
View dropped.
SQL> DROP VIEW EMPLOYEES
View dropped.
SQL> DROP VIEW EMP_DATA
View dropped.
SQL> DROP VIEW EMP_DETAILS
View dropped.

147

18.8

Exerccios
a) Criar uma viso que produza o seguinte resultado.
SQL> SELECT * FROM AGGREGATES
DEPTNO
------10
20
30

AVERAGE MAXIMUM MINIMUM


SUM NO_SALS NO_COMMS
------- ------- ------- ------- ------- -------2916.67
5000
1300
8750
3
0
2175
3000
800
10875
5
0
1566.67
2850
950
9400
6
4

b) Utilizando a viso do exerccio anterior, extrair as seguintes informaes. O nmero do


empregado deve ser solicitado em tempo de execuo.
EMPNO ENAME JOB
SAL HIREDATE MINIMUM MAXIMUM AVERAGE
------- ------ --------- ------- --------- ------- ------- ------7902 FORD
ANALYST
3,000 05-DEC-83
800
3,000
2,175

c) Criar uma viso que garanta as seguintes restries ao se inserir dados na tabela
ASSIGNMENTS:
-

nmero do projeto menor do que 2000.

Trmino do projeto aps o incio do projeto.

ASSIGN_TYPE vlidos so PF, WT e ED.

BILL_RATE menor do que 50 para ASSIGN_TYPE PF.


BILL_RATE menor do que 60 para ASSIGN_TYPE WT.
BILL_RATE menor do que 70 para ASSIGN_TYPE ED.

O nmero do empregado deve ser vlido.

No esquea a clusula WITH CHECK OPTION

SQL> SELECT * FROM ASG_VAL


PROJID
EMPNO A_START_D A_END_DAT BILL_RATE AS
HOURS
------- ------- --------- --------- --------- -- ------1
7369 01-JAN-88 03-JAN-88
50 WT
15
2
7844 01-JAN-89 10-JAN-89
45.5 PF
30
1
7902 04-JAN-88 07-JAN-88
55 WT
20

d) Inserir valores na tabela ASSIGNMENTS atravs da viso criada.


Enter
Enter
Enter
Enter
Enter
Enter
Enter

value
value
value
value
value
value
value

for
for
for
for
for
for
for

id: 1
empno: 7566
start: 01-JAN-89
end: 01-JAN-88
bill_r: 40.00
asgt: ED
hours: 20

old

3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)

148

new
3: (1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20)
(1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20)
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL> /
Enter value for id: 2
Enter value for empno: 7698
Enter value for start: 01-FEB-89
Enter value for end: 20-FEB-89
Enter value for bill_r: 55.00
Enter value for asgt: WT
Enter value for hours: 30
old
3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new
3: (2,7698,'01-FEB-89','20-FEB-89','55.00','WT',30)
1 row created.
SQL> /
Enter value for id: 2
Enter value for empno: 8000
Enter value for start: 01-MAR-89
Enter value for end: 31-DEC-89
Enter value for bill_r: 69.00
Enter value for asgt: ED
Enter value for hours: 40
old
3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new
3: (2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40)
(2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40)
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation

e) Consulte o dicionrio de dados para ver a clusula SELECT da viso.

149

18.9

Respostas dos exerccios


a)
SQL>
2
3
4
5
6
7

CREATE VIEW AGGREGATES


(DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM, NO_SALS, NO_COMMS)
AS
SELECT DEPTNO, AVG(SAL), MAX(SAL), MIN(SAL),
SUM(SAL), COUNT(SAL), COUNT(COMM)
FROM EMP
GROUP BY DEPTNO

b)
SQL> COLUMN MAXIMUM FORMAT 99,999
SQL> COLUMN MINIMUM LIKE MAXIMUM
SQL> COLUMN AVERAGE LIKE MAXIMUM
SQL> COLUMN SAL LIKE MAXIMUM
SQL> COLUM JOB FORMAT A9
SQL> COLUMN ENAME FORMAT A6
SQL> SELECT EMP.EMPNO, ENAME, JOB, SAL, HIREDATE,
2 MINIMUM, MAXIMUM, AVERAGE
3 FROM EMP, AGGREGATES AGG
4 WHERE EMP.DEPTNO = AGG.DEPTNO
5 AND EMP.EMPNO = &EMPNO
Enter value for empno: 7902
old
5: AND EMP.EMPNO = &EMPNO
new
5: AND EMP.EMPNO = 7902
c)
SQL>
2
3
4
5
6
7
8
9
10
11

CREATE VIEW ASG_VAL


AS
SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE,
BILL_RATE, ASSIGN_TYPE, HOURS
FROM ASSIGNMENTS
WHERE A_START_DATE < A_END_DATE
AND PROJID < 2000
AND BILL_RATE <= DECODE(ASSIGN_TYPE, 'PF', 50, 'WT', 60, 70)
AND ASSIGN_TYPE IN ('PF', 'WT', 'ED')
AND EMPNO IN (SELECT EMPNO FROM EMP)
WITH CHECK OPTION

d)
SQL> INSERT INTO ASG_VAL
2 VALUES
3 (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
e)
SQL> SELECT VIEW_NAME, TEXT
2 FROM USER_VIEWS
3 WHERE VIEW_NAME = ASG_VAL
VIEW_NAME
TEXT
--------------- -------------------------------------------------ASG_VAL
SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE,
BILL_RATE, ASSIGN_TYPE, HOURS
FR........

150

Captulo 19 - ndices
19.1

Objetivos deste captulo


Mostrar a criao e a utilidade dos ndices.

19.2

Finalidades dos ndices


Os ndices do Oracle tm duas finalidades principais.
- Otimizar o tempo de resposta de uma consulta.
- Garantir unicidade de valores para uma coluna ou conjunto de colunas.
A utilizao de ndices altamente recomendada para obter melhor desempenho, e
geralmente um dos primeiros ndices a serem criados na tabela o da chave primria.
Os ndices so criados, normalmente, pelos donos das tabelas, mas qualquer usurio que
tenha privilgio de ndice sobre a tabela tambm pode criar ndices para a tabela.
Uma vez criado, o ndice ser utilizado pelo Oracle, sempre que for possvel, para acelerar o
acesso aos dados. Note que os ndices so utilizados automaticamente, sem requerer
qualquer ao por parte do usurio, que nem precisa saber da existncia dos ndices.

19.3

Estrutura dos ndices


O Oracle utiliza rvores binrias balanceadas para os ndices, o que garante o mesmo tempo,
aproximadamente, para o acesso a qualquer linha da tabela, independente de sua posio. O
tempo de acesso tambm bastante independente do volume de dados indexados.

19.4

Tipos de ndices
UNIQUE
Garante que os valores especificados para a(s) coluna(s) so nicos.
NON UNIQUE
o padro, usado para melhorar o tempo de acesso.
SINGLE COLUMN
ndice composto de apenas uma coluna.
CONCATENATED
ndice composto de at 16 colunas.

151

19.5

Criao dos ndices


Os ndices so criados juntamente com as tabelas, ou atravs do comando:
CREATE [UNIQUE] INDEX nome-do-ndice
ON nome-da-tabela (coluna1, [,coluna2...])
19.5.1 Criao de um ndice para melhorar o acesso.
Para criar um ndice chamado ENAME_IDX para melhorar o tempo de acesso das consultas
feitas atravs do nome do funcionrio:
CREATE INDEX ENAME_IDX
ON EMP(ENAME)
19.5.2 Criao de um ndice para garantir unicidade.
Para evitar a duplicao do nome do departamento:
CREATE UNIQUE INDEX DNAME_IDX
ON DEPT(DNAME)
O ndice abaixo garante que no h duplicidade do par fornecedor/material fornecido.
CREATE UNIQUE INDEX FORNEC_IDX
ON FORNECIMENTO (NUM_FORNECEDOR, NUM-MATERIAL)

19.6

Eliminao dos ndices


Os ndices so eliminados atravs do comando:
DROP INDEX nome-do-ndice

19.7

Quando um ndice utilizado


O Oracle decide quando apropriado utilizar um ndice. O Oracle sabe quais colunas esto
indexadas e o tipo do ndice, e decide de acordo com regras especficas.
a) A coluna indexada deve ser referenciada na clusula Where.
A consulta mostrada abaixo no utiliza ndice porque no possui clusula Where.
SELECT
FROM

ENAME, JOB, SAL


EMP

A consulta abaixo utiliza o ndice criado para a coluna ENAME:


SELECT

*
152

FROM
WHERE

EMP
ENAME = JONES

b) O ndice no utilizado se a coluna referenciada na clusula Where parte de uma funo


ou de uma expresso.
No exemplo abaixo o ndice no utilizado porque a coluna ENAME parte de uma
funo:
SELECT
FROM
WHERE

*
EMP
UPPER(ENAME) = JONES

No exemplo abaixo o ndice no utilizado porque a coluna parte de uma expresso:


SELECT
FROM
WHERE
19.8

*
EMP
HIREDATE+7 = 01-JAN-84

ndices e Junes
Se no existirem ndices nas colunas utilizadas para realizar a juno equivalente, o Oracle
obrigado a realizar uma operao de SORT/MERGE para responder a consulta. Isto significa
que cada tabela ordenada separadamente, e depois as duas so unidas de acordo com a
condio de juno.

19.9

Sugestes para criao dos ndices


As colunas que no permitem valores duplicados devem ser indexadas.
As colunas que so utilizadas habitualmente na clusula Where devem ser indexadas.
As colunas utilizadas nas condies de juno equivalente devem ser indexadas.
No devem ser utilizados mais de 3 ndices por tabela para no prejudicar as operaes
realizadas atravs das operaes de DML.

19.10 Exerccios
a) Criar um ndice nico na coluna PROJID da tabela PROJECTS. Teste o ndice inserindo
um valor para PROJID j existente.
b) Criar um ndice no nico na coluna PROJID da tabela ASSIGNMENTS.
c) Consulte o dicionrio de dados para obter as informaes de seus ndices.

153

19.11 Respostas dos exerccios


a) CREATE
ON

UNIQUE INDEX PROJ_PROJID


PROJECTS(PROJID)

b) CREATE
ON

INDEX ASG_PROJID
ASSIGNMENTS(PROJID)

c) SELECT
FROM

*
USER_INDEXES

154

Captulo 20: Seqncias


20.1

Objetivos deste captulo


Mostrar a criao e a utilizao das seqncias.

20.2

O gerador de seqncias
O gerador de seqncias do Oracle utilizado para gerar automaticamente seqncias de
nmeros para as linhas das tabelas.
Para gerar os nmeros seqenciais automaticamente, primeiro a seqncia deve ser definida
utilizando a declarao CREATE SEQUENCE, conforme a sintaxe mostrada abaixo:
CREATE SEQUENCE [esquema.]nome-da-seqncia
[INCREMENTED BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
esquema
nome-da-seqncia
INCREMENT WITH
START WITH
MINVALUE|NOMINVALUE
MAXVALUE|NOMAXVALUE

identificao do dono da seqncia.


nome vlido para a seqncia.
incremento positivo ou negativo. Padro: 1.
primeiro nmero a ser gerado. Padro: 1.
menor valor a ser gerado. Padro: 1 para seqncias
ascendentes, 10**27-1 para seqncias descendentes.
maior valor a ser gerado. Padro: 1 para seqncias
descendentes, 10**27-1 para seqncias ascendentes.

Para um usurio poder criar uma seqncia deve possuir o privilgio de resource. O
comando mostrada abaixo cria uma seqncia para a coluna DEPTNO da tabela DEPT.
CREATE SEQUENCE DEPT_SEQ
INCREMENT BY 10
START WITH 10
MAXVALUE 10000

20.1

Gerao de nmeros seqenciais com NEXTVAL


A pseudo-coluna NEXTVAL utilizada para gerar nmeros seqenciais sucessivos de uma
seqncia especificada. Quando a coluna NEXTVAL especificada um novo nmero
seqencial gerado.
SELECT
FROM

DEPT_SEQ.NEXTVAL
SYS.DUAL

NEXTVAL
------10

Se o comando for executado novamente, o valor incrementado de 10.


155

SELECT
FROM

DEPT_SEQ.NEXTVAL
SYS.DUAL

NEXTVAL
------20

Todo os valores subsequentes sero incrementados de 10.


Notas:
A coluna NEXTVAL sempre deve ser prefixada pelo nome da seqncia.
Se a coluna NEXTVAL for referenciada diversas vezes dentro do mesmo comando
SQL, todas as referncias retornam o mesmo valor.

A coluna NEXTVAL mais til em comandos de DML. Por exemplo, quando so inseridas
linhas na tabela, a seqncia pode ser utilizada para gerar valores nicos para a chave
primria.
INSERT INTO DEPT
VALUES
(DEPT_SEQ.NEXTVAL, ACCOUNTING, NEW YORK)

Quando o nmero seqencial gerado, a seqncia incrementada independentemente de


haver um Commit ou um Rollback para a transao. Quando dois usurios acessam a mesma
seqncia ao mesmo tempo, os dois usurios podem ver descontinuidades na seqncia,
devido a valores gerados para o outro usurio que ainda no receberam o Commit. Os
nmeros produzidos pelo gerador de seqncias podem ser saltados devido a Rollbacks.
20.1

Valor atual da seqncia


Para se referir ao valor atual da seqncia, pode ser utilizada a pseudo-coluna CURRVAL.
Toda vez que a pseudo-coluna NEXTVAL utilizada, o valor gerado armazenado em
CURRVAL, que s pode ser utilizada aps NEXTVAL ser referenciado na sesso atual do
usurio.
INSERT INTO DEPT_HISTORY
VALUES
(DEPT_SEQ.CURRVAL, ACCOUNTING, NEW YORK)

20.2

Regras para utilizar CURRVAL E NEXTVAL


Currval e Nextval podem ser utilizados na:
Clusula SELECT da declarao SELECT (exceto para vises).
Lista de valores da declarao INSERT.
Clusula SET da declarao UPDATE.
156

SELECT mais externo (consulta principal) de uma subconsulta.


Currval e Nextval no podem ser utilizados:
Em vises.
Com a palavra chave DISTINCT.
Com as clusulas Order By, Group By, Connect By, ou Having da declarao
SELECT.
Com os operadores Intersect, Union e Minus.
Dentro de uma consulta interna.
Seqncias so tratadas de maneira similar s tabelas, podendo ser alteradas e eliminadas. O
dono de uma seqncia pode conceder privilgios a outros usurios.
20.3

Alterando uma seqncia


O comando ALTER SEQUENCE utilizado para modificar uma seqncia existente.
ALTER SEQUENCE [esquema.]nome-da-sequencia
[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
Por exemplo, para modificar o valor mximo para a seqncia DEPT_SEQ:
ALTER SEQUENCE dept_seq
MAXVALUE 100000

Notas:
Somente os nmeros a serem gerados no futuro so alterados pelo comando Alter
Sequence. Os nmeros que j foram gerados no so alterados.
Validaes so realizadas. No pode ser especificado, por exemplo, um novo valor
mximo menor que o valor corrente.
O parmetro START WITH no pode ser alterado pelo comando Alter Sequence.
A seqncia deve ser eliminada e recriada para ser iniciada com um novo nmero.
20.4

Concedendo privilgios em seqncias


O dono de uma seqncia pode conceder os privilgios Select e Alter.

20.5

Eliminando uma seqncia


157

O comando Drop Sequence remove a definio da seqncia do dicionrio de dados.


DROP SEQUENCE [esquema.]nome-da-seqncia
Apenas o dono da seqncia e o DBA podem utilizar este comando.
20.6

Listando seqncias
As vises USER_SEQUENCES ou ALL_SEQUENCES podem ser utilizadas para descobrir
as seqncias existentes.

158

Apndice A - Tabelas do Curso

Tabela EMP - Empregados


EMPNO
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

MGR
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782

HIREDATE
13-JUN-83
15-AUG-83
26-MAR-83
31-OCT-83
05-DEC-83
11-JUN-84
14-MAY-84
05-MAR-84
09-JUL-84
04-JUN-84
04-JUN-84
23-JUL-84
05-DEC-83
21-NOV-83

SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

Tabela DEPT - Departamentos


DEPTNO
10
20
30
40

DNAME
ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
NEW YORK
DALLAS
CHICAGO
BOSTON

Tabela SALGRADE - Faixas Salariais


GRADE
1
2
3
4
5

LOSAL
700
1201
1401
2001
3001

159

HISAL
1200
1400
2000
3000
9999

COMM
300
50
1400

DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10

CAPTULO 1: CONCEITOS DE BANCO DE DADOS ............................................................................................... 1


1.1 OBJETIVOS DESTE CAPTULO .......................................................................................................................................... 1
1.2 SISTEMA DE GERENCIAMENTO DE BANCO DE DADOS .................................................................................................... 1
1.3 BANCO DE DADOS RELACIONAL ..................................................................................................................................... 1
1.4 ARQUITETURA DO ORACLE ............................................................................................................................................ 4
CAPTULO 2: INTRODUO S CONSULTAS........................................................................................................ 6
2.1 OBJETIVOS DESTE CAPTULO .......................................................................................................................................... 6
2.2 O UTILITRIO SQL*PLUS.............................................................................................................................................. 6
2.3 CONSTRUO BSICA DE UMA CONSULTA...................................................................................................................... 6
2.4 EXPRESSES ARITMTICAS............................................................................................................................................. 7
2.5 NOMES ALTERNATIVOS PARA TTULOS DE COLUNAS....................................................................................................... 9
2.6 O OPERADOR DE CONCATENAO .................................................................................................................................. 9
2.7 LITERAIS ...................................................................................................................................................................... 10
2.8 MANUSEIO DE VALORES NULOS.................................................................................................................................... 10
2.9 ELIMINAO DE LINHAS DUPLICADAS .......................................................................................................................... 12
2.10 ORDENAO DAS LINHAS ........................................................................................................................................... 13
2.11 CRITRIOS DE PESQUISA ............................................................................................................................................. 14
2.12 CONSULTAS COM CONDIES MLTIPLAS .................................................................................................................. 18
2.13 PRECEDNCIA DOS OPERADORES................................................................................................................................ 19
2.14 RESUMO DO COMANDO SELECT ............................................................................................................................... 20
2.15 EXERCCIOS................................................................................................................................................................ 20
2.16 RESPOSTAS DOS EXERCCIOS ...................................................................................................................................... 23
CAPTULO 3: VARIVEIS DE SUBSTITUIO ..................................................................................................... 24
3.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 24
3.2 VARIVEIS DE SUBSTITUIO COM UM "&" ................................................................................................................. 24
3.3 VARIVEIS DE SUBSTITUIO COM DOIS "&" ............................................................................................................... 24
CAPTULO 4: FUNES NUMRICAS E DE CARACTERES.............................................................................. 25
4.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 25
4.2 FUNES QUE MANIPULAM CARACTERES .................................................................................................................... 25
4.2.1 LOWER(coluna | literal) ..................................................................................................................................... 25
4.2.2 UPPER(coluna | literal) ...................................................................................................................................... 25
4.2.3 INITCAP(coluna | literal) ................................................................................................................................... 25
4.2.4 LPAD(coluna | literal, tamanho, 'caracter') ....................................................................................................... 25
4.2.5 RPAD(coluna | literal, tamanho, 'caracter') ....................................................................................................... 26
4.2.6 SUBSTR(coluna | literal, posio, comprimento) ............................................................................................... 26
4.2.7 INSTR(coluna | literal, seqncia de caracteres', posio, n) ........................................................................... 26
4.2.8 LTRIM(coluna | literal, 'caracteres')................................................................................................................... 27
4.2.9 RTRIM(coluna | literal, 'caracteres') .................................................................................................................. 27
4.2.10 SOUNDEX(coluna | literal) .............................................................................................................................. 27
4.2.11 LENGTH(coluna | literal) ................................................................................................................................. 28
4.2.12 TRANSLATE(coluna | literal, de, para) ............................................................................................................ 28
4.2.13 REPLACE(coluna | literal, de, para) ................................................................................................................ 28
4.2.14 Funes aninhadas............................................................................................................................................ 29
4.3 FUNES NUMRICAS .................................................................................................................................................. 30
4.3.1 ROUND(coluna | literal, n) ................................................................................................................................. 30
4.3.2 TRUNC(coluna | literal, n) .................................................................................................................................. 30
4.3.3 CEIL(coluna | literal) .......................................................................................................................................... 30
4.3.4 FLOOR(coluna | literal) ...................................................................................................................................... 30
4.3.5 POWER(coluna | literal, n) ................................................................................................................................. 31
4.3.6 EXP(coluna | literal) ........................................................................................................................................... 31
4.3.7 LOG(base, coluna | literal) ................................................................................................................................. 31
4.3.8 LN(coluna | literal).............................................................................................................................................. 31
4.3.9 SQRT(coluna | literal) ......................................................................................................................................... 31
4.3.10 SIGN(coluna | literal) ........................................................................................................................................ 32
4.3.11 ABS(coluna | literal).......................................................................................................................................... 32
4.3.12 MOD(valor1, valor2) ........................................................................................................................................ 32

160

4.3.13 Funes trigonomtricas ................................................................................................................................... 33


4.3.14 Funes hiperblicas ........................................................................................................................................ 33
4.4 EXERCCIOS.................................................................................................................................................................. 33
4.5 RESPOSTAS DOS EXERCCIOS ........................................................................................................................................ 36
CAPTULO 5: FUNES DE DATA E DE CONVERSO ...................................................................................... 37
5.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 37
5.2 FUNES QUE MANIPULAM DATAS ............................................................................................................................... 37
5.2.1 SYSDATE............................................................................................................................................................. 37
5.2.2 Aritmtica de datas.............................................................................................................................................. 37
5.2.3 MONTHS_BETWEEN(data1,data2) ................................................................................................................... 37
5.2.4 ADD_MONTHS(data, meses).............................................................................................................................. 38
5.2.5 NEXT_DAY(data, dia_da_semana) ..................................................................................................................... 38
5.2.6 LAST_DAY(data) ................................................................................................................................................. 38
5.2.7 ROUND(data) ..................................................................................................................................................... 39
5.2.7 TRUNC(data) ...................................................................................................................................................... 39
5.3 FUNES DE CONVERSO ............................................................................................................................................ 39
5.3.1 Formatos de Data ............................................................................................................................................... 39
5.3.2 TO_CHAR(nmero|data,['formato']) .................................................................................................................. 40
5.3.3 Formatos Numricos ........................................................................................................................................... 41
5.3.4 TO_NUMBER(cadeia_de_caracteres) ................................................................................................................ 42
5.3.5 TO_DATE('cadeia_de_caracteres','formato') ..................................................................................................... 42
5.4 FUNES QUE ACEITAM QUALQUER TIPO DE DADO ...................................................................................................... 42
5.4.1 DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default) ........................................................................... 42
5.4.2 NVL(coluna|valor, valor) .................................................................................................................................... 44
5.4.3 GREATEST(coluna|valor, coluna|valor,...) ........................................................................................................ 44
5.4.4 LEAST(coluna|valor, coluna|valor,...) ................................................................................................................ 44
5.4.5 VSIZE(coluna|valor) ........................................................................................................................................... 45
5.4.5 Funes aninhadas revisitadas ........................................................................................................................... 45
5.5 EXERCCIOS.................................................................................................................................................................. 45
5.6 RESPOSTAS DOS EXERCCIOS ........................................................................................................................................ 48
CAPITULO 6: FUNES DE GRUPO........................................................................................................................ 49
6.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 49
6.2 FUNES DISPONVEIS.................................................................................................................................................. 49
6.3 USANDO FUNES DE GRUPO ....................................................................................................................................... 49
6.4 A CLUSULA GROUP BY ............................................................................................................................................ 50
6.5 EXCLUINDO LINHAS DOS GRUPOS ................................................................................................................................. 50
6.6 GRUPOS DENTRO DE GRUPOS ....................................................................................................................................... 51
6.7 FUNES DE GRUPO E RESULTADOS INDIVIDUAIS ......................................................................................................... 51
6.8 A CLUSULA HAVING ................................................................................................................................................ 52
6.9 ORDEM DAS CLUSULAS .............................................................................................................................................. 53
6.10 EXERCCIOS................................................................................................................................................................ 54
6.11 RESPOSTAS DOS EXERCCIOS ...................................................................................................................................... 56
CAPTULO 7: EXTRAINDO DADOS DE MAIS DE UMA TABELA ..................................................................... 57
7.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 57
7.2 JUNES EQUIVALENTES .............................................................................................................................................. 57
7.3 PRODUTO ..................................................................................................................................................................... 58
7.4 JUNES NO EQUIVALENTES ...................................................................................................................................... 58
7.5 REGRA PARA JUNO DE TABELAS ............................................................................................................................... 59
7.6 SUMRIO DA SINTAXE .................................................................................................................................................. 59
7.7 EXERCCIOS.................................................................................................................................................................. 59
7.8 SOLUO DOS EXERCCIOS ........................................................................................................................................... 62
CAPTULO 8: OUTROS MTODOS DE JUNO .................................................................................................. 63
8.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 63
8.2 JUNES EXTERNAS ..................................................................................................................................................... 63
8.3 JUNO DE UMA TABELA COM ELA MESMO .................................................................................................................. 63
8.4 JUNES VERTICAIS ..................................................................................................................................................... 64

161

8.4.1 Unio ................................................................................................................................................................... 64


8.4.2 Interseo ............................................................................................................................................................ 64
8.4.3 Subtrao ............................................................................................................................................................ 65
8.4.4 Combinao de operadores ................................................................................................................................ 65
8.4.5 A clusula ORDER BY ........................................................................................................................................ 65
8.4.6 Regras para utilizar junes verticais ................................................................................................................. 65
8.5 EXERCCIOS.................................................................................................................................................................. 66
8.6 RESPOSTAS DOS EXERCCIOS ........................................................................................................................................ 68
CAPTULO 9: CONSULTAS ANINHADAS ............................................................................................................... 69
9.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 69
9.2 DEFINIO DE CONSULTAS ANINHADAS ....................................................................................................................... 69
9.3 CONSULTAS INTERNAS QUE RETORNAM APENAS UM VALOR ......................................................................................... 69
9.4 COMO AS CONSULTAS ANINHADAS SO EXECUTADAS .................................................................................................. 70
9.5 CONSULTAS INTERNAS QUE RETORNAM MAIS DE UM VALOR ........................................................................................ 70
9.6 OPERADORES ANY E ALL ........................................................................................................................................... 71
9.7 CLUSULA HAVING COM CONSULTAS ANINHADAS .................................................................................................... 72
9.8 ORDENAO EM CONSULTAS ANINHADAS .................................................................................................................... 73
9.9 LIMITE PARA O ANINHAMENTO ..................................................................................................................................... 73
9.10 CONSULTA INTERNA CORRELACIONADA ..................................................................................................................... 73
9.11 O OPERADOR EXISTS................................................................................................................................................ 74
9.12 EXERCCIOS................................................................................................................................................................ 75
9.13 RESPOSTA DOS EXERCCIOS ........................................................................................................................................ 78
CAPTULO 10: GERAO DE RELATRIOS ........................................................................................................ 80
10.1 OBJETIVOS DESTE CAPTULO ...................................................................................................................................... 80
10.2 CONJUNTO DE COMANDOS SET DO SQL*PLUS ........................................................................................................ 80
10.3 COLUMN ................................................................................................................................................................. 80
10.3.1 Formato de exibio para as colunas ............................................................................................................... 81
10.3.2 Outras opes de exibio das colunas. ........................................................................................................... 81
10.4 EXEMPLO DE FORMATAO DE COLUNAS................................................................................................................... 81
10.5 EXEMPLO DE FORMATAO DE TTULO ...................................................................................................................... 82
10.6 EXEMPLO DE REMOO DA FORMATAO ................................................................................................................. 83
CAPTULO 11: GERAO DE RELATRIOS - PARTE 2 .................................................................................... 84
11.1 OBJETIVOS DESTE CAPTULO ...................................................................................................................................... 84
11.2 PROPRIEDADES DOS CABEALHOS E DOS RODAPS .................................................................................................... 84
11.3 A CLUSULA NEW_VALUE ..................................................................................................................................... 85
11.4 QUEBRAS NOS RELATRIOS ........................................................................................................................................ 86
11.5 CLCULO DE SUMRIOS ............................................................................................................................................. 87
11.6 RELATRIO MATRICIAL .............................................................................................................................................. 89
11.7 ARQUIVO DE COMANDOS PARA O SQL*PLUS ........................................................................................................... 91
11.8 EXERCCIOS................................................................................................................................................................ 93
11.9 RESPOSTAS DOS EXERCCIOS ...................................................................................................................................... 95
CAPTULO 12: HIERARQUIAS - CAMINHANDO NA RVORE ......................................................................... 96
12.1 OBJETIVOS DESTE CAPTULO ...................................................................................................................................... 96
12.2 QUANDO POSSVEL CAMINHAR NA RVORE ............................................................................................................. 96
12.3 EXCLUINDO UM N DA RVORE ................................................................................................................................. 98
12.4 TERMINOLOGIA ........................................................................................................................................................ 100
12.5 EXERCCIOS.............................................................................................................................................................. 100
CAPTULO 13: DICIONRIO DE DADOS .............................................................................................................. 101
13.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 101
13.2 O QUE O DICIONRIO DE DADOS ............................................................................................................................ 101
13.3 INFORMAES CONTIDAS NO DICIONRIO DE DADOS ............................................................................................... 101
13.4 TABELAS DO DICIONRIO DE DADOS ........................................................................................................................ 101
13.5 VISES DO DICIONRIO DE DADOS............................................................................................................................ 101
13.6 EXEMPLOS DE UTILIZAO DO DICIONRIO DE DADOS ............................................................................................. 106
13.7 EXERCCIOS.............................................................................................................................................................. 108

162

CAPTULO 14: LINGUAGEM DE DEFINIO DE DADOS................................................................................ 110


14.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 110
14.2 ESTRUTURA DE DADOS DO ORACLE ......................................................................................................................... 110
14.3 CRIANDO UMA TABELA ............................................................................................................................................ 110
14.4 RECOMENDAES SOBRE OS NOMES DAS TABELAS .................................................................................................. 111
14.5 TIPO DE DADO DAS COLUNAS ................................................................................................................................... 111
14.6 RELAO ENTRE OS TIPOS DE DADOS ANSI E DO ORACLE ....................................................................................... 112
14.7 RELAO ENTRE OS TIPOS DE DADOS DO SQL/DS E DO ORACLE ............................................................................. 112
14.8 CRIAO DE TABELAS .............................................................................................................................................. 112
14.8.1 Sintaxe do comando: ....................................................................................................................................... 112
14.8.2 Criao das tabelas do curso: ........................................................................................................................ 113
14.8.3 Exemplos de restries .................................................................................................................................... 114
14.9 CRIANDO UMA TABELA A PARTIR DE OUTRA TABELA................................................................................................ 115
14.10 ALTERANDO UMA TABELA ..................................................................................................................................... 116
14.11 TROCANDO O NOME DE UMA TABELA ..................................................................................................................... 117
14.12 DESCRIO DAS TABELAS E COLUNAS .................................................................................................................... 118
14.13 REMOVENDO TABELAS ........................................................................................................................................... 118
14.14 EXERCCIOS............................................................................................................................................................ 118
CAPTULO 15: LINGUAGEM DE MANIPULAO DE DADOS........................................................................ 121
15.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 121
15.2 INSERINDO NOVAS LINHAS EM UMA TABELA ............................................................................................................ 121
15.3 ATUALIZANDO LINHAS EM UMA TABELA .................................................................................................................. 123
15.4 ELIMINANDO LINHAS DE UMA TABELA...................................................................................................................... 124
15.5 EXERCCIOS.............................................................................................................................................................. 125
15.6 RESPOSTAS DOS EXERCCIOS .................................................................................................................................... 126
CAPTULO 16: PROCESSAMENTO DE TRANSAES ...................................................................................... 127
16.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 127
16.2 O QUE UMA TRANSAO ....................................................................................................................................... 127
16.3 EFETIVANDO AS MUDANAS..................................................................................................................................... 127
16.4 REMOVENDO MUDANAS ......................................................................................................................................... 128
16.5 FALHAS DO SISTEMA ................................................................................................................................................ 128
16.6 O SIGNIFICADO DE UMA TRANSAO ........................................................................................................................ 128
16.7 CONTROLANDO TRANSAES................................................................................................................................... 128
16.8 COMMIT [WORK] ................................................................................................................................................. 128
16.9 SAVEPOINT SAVEPOINT_NAME ............................................................................................................................. 129
16.10 ROLLBACK[WORK] TO [SAVEPOINT] SAVEPOINT_NAME............................................................................... 129
16.11 ROLLBACK A NVEL DE DECLARAO..................................................................................................................... 130
16.12 ROLLBACKS IMPLCITOS ......................................................................................................................................... 130
16.13 AUTOCOMMIT ........................................................................................................................................................ 130
16.14 EXEMPLO DE UTILIZAO DE COMMIT E ROLLBACK........................................................................................ 130
16.15 CONSISTNCIA DE LEITURA .................................................................................................................................... 133
16.16 TRANSAES SOMENTE DE LEITURA ...................................................................................................................... 134
CAPTULO 17: CONCORRNCIA E BLOQUEIO ................................................................................................. 136
17.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 136
17.2 INTRODUO AO BLOQUEIO ..................................................................................................................................... 136
17.3 O QUE UM BLOQUEIO ............................................................................................................................................. 136
17.4 QUANDO OS BLOQUEIOS SO NECESSRIOS .............................................................................................................. 136
17.5 QUANDO OS BLOQUEIOS SO LIBERADOS ................................................................................................................. 137
17.6 TIPOS DE BLOQUEIOS ................................................................................................................................................ 137
17.6.1 Bloqueios do dicionrio de dados (DDL) ....................................................................................................... 137
17.6.2 Bloqueios da manipulao de dados (DML) ................................................................................................... 137
17.7 NVEIS DE BLOQUEIO ................................................................................................................................................ 137
17.8 DESCRIO DOS BLOQUEIOS .................................................................................................................................... 137
17.9 BLOQUEIOS IMPLCITOS ............................................................................................................................................ 139
17.10 BLOQUEIOS EXPLCITOS.......................................................................................................................................... 140
17.11 IDENTIFICAO DA LINHA E BLOQUEIO ................................................................................................................... 140

163

17.12 IMPASSE (DEADLOCK)............................................................................................................................................ 141


CAPTULO 18 - VISES ............................................................................................................................................. 143
18.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 143
18.2 O QUE UMA VISO ................................................................................................................................................. 143
18.3 CLASSIFICAO DAS VISES ..................................................................................................................................... 143
18.3.1 Vises simples ................................................................................................................................................. 143
18.3.2 Vises complexas............................................................................................................................................. 143
18.4 O COMANDO CREATE VIEW ................................................................................................................................. 144
18.5 USANDO UMA VISO PARA OPERAES DE DML ..................................................................................................... 145
18.6 ALTERANDO DADOS ATRAVS DAS VISES ............................................................................................................... 147
18.7 ELIMINAO DE VISES ........................................................................................................................................... 147
18.8 EXERCCIOS.............................................................................................................................................................. 148
18.9 RESPOSTAS DOS EXERCCIOS .................................................................................................................................... 150
CAPTULO 19 - NDICES ........................................................................................................................................... 151
19.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 151
19.2 FINALIDADES DOS NDICES ....................................................................................................................................... 151
19.3 ESTRUTURA DOS NDICES ......................................................................................................................................... 151
19.4 TIPOS DE NDICES ..................................................................................................................................................... 151
19.5 CRIAO DOS NDICES .............................................................................................................................................. 152
19.5.1 Criao de um ndice para melhorar o acesso. .............................................................................................. 152
19.5.2 Criao de um ndice para garantir unicidade. .............................................................................................. 152
19.6 ELIMINAO DOS NDICES ........................................................................................................................................ 152
19.7 QUANDO UM NDICE UTILIZADO ............................................................................................................................. 152
19.8 NDICES E JUNES .................................................................................................................................................. 153
19.9 SUGESTES PARA CRIAO DOS NDICES .................................................................................................................. 153
19.10 EXERCCIOS............................................................................................................................................................ 153
19.11 RESPOSTAS DOS EXERCCIOS .................................................................................................................................. 154
CAPTULO 20: SEQNCIAS................................................................................................................................... 155
20.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 155
20.2 O GERADOR DE SEQNCIAS .................................................................................................................................... 155
20.1 GERAO DE NMEROS SEQENCIAIS COM NEXTVAL .......................................................................................... 155
20.1 VALOR ATUAL DA SEQNCIA .................................................................................................................................. 156
20.2 REGRAS PARA UTILIZAR CURRVAL E NEXTVAL ................................................................................................. 156
20.3 ALTERANDO UMA SEQNCIA .................................................................................................................................. 157
20.4 CONCEDENDO PRIVILGIOS EM SEQNCIAS ............................................................................................................ 157
20.5 ELIMINANDO UMA SEQNCIA ................................................................................................................................. 157
20.6 LISTANDO SEQNCIAS ............................................................................................................................................ 158
APNDICE A - TABELAS DO CURSO .................................................................................................................... 159

164

Você também pode gostar