Você está na página 1de 191

ndice

Contedo

I Introduo
-

1.1 Objetivos do curso


1.2 O que SQL*Plus
-

II Comandos SQL e SQL*Plus


-

II-Contedo
11.1 Ativao do SQL*Plus
11.2 Criao de tabelas
11.3 Manipulao de tabelas
11.4 Formatao de relatrios
11.5 Edio de comandos
11.6 Outros comandos
II Exerccios
-

III Consultas bsicas


-

111-Contedo
111.1 Seleo de colunas
111.2- Uso de expresses
111.3 Seleo de linhas
111.4 Ordenao de resultados
111.5 Agrupamento
111.6 Operaes de conjunto
111.7 Juno de tabelas
III Exerccios
-

IV- Criao e uso de tabelas


1V-Contedo
1V.1 -CREATETABLE
IV.2 Tipos de colunas
IV.3 Alterao de uma tabela
lV.4 O comando INSERT
lV.5 O comando DELETE
IV.6 O comando UPDATE
IV.7 Controle de transaes
lV.8 Manipulao de vises
IV.9 Criao de seqncias
IV Exerccios
-

V -Gerao de Relatrios
V Contedo
-

V.1
V.2
V.3
V.4
V.5
V.6

Formatao de colunas
Formatao de ttulos
BREAK e COMPUTE
Parmetros de controle
Utilizao de variveis
Relatrios avanados

4
5
6

10
12
16
17
22
23

24

25
26
27
29
31
33
35
39
44

45

46
47
51
52
54
56
57
59
67
72
73

75

76
77
80
84
89
93
98

V Exerccios
-

VI Expresses e funes
-

VI- Contedo
VI.1 Operadores
Vl.2 Funes numricas
VI.3 Funes de caracteres
VI.4 Funes de grupo
VI.5 Converso entre tipos
VI.6 Funes de datas
Vl.7 Outras funes
VI Exerccios
-

VII Consultas avanadas


-

VII-Contedo
VII.1 Pseudo-colunas
VII.2 Juno externa
VII.3 Auto-Juno
VII.4 Consultas encaixadas
VII.5 Consultas hierrquicas
VII Exerccios
-

VIII Tpicos avanados


-

VIII Contedo
VIII.1 Manuteno de usurios
VllI.2 Privilgios de acesso
VIII.3 Acesso concorrente
-

VIII.4 lndices
VIII.5 Clusters
VIII.6 Dicionrio de dados
VIII Exerccios
-

Ap. A- Tabelas utilizadas


Ap. B- Sumrio dos Comandos
Ap. C- Resposta dos exerccios

107

110
111
112
114
116
119
120
123
124
125

126
127
128
129
132
133
138
141

142

143
144
146
149
153
157
162
168

169
174
178

Contedo

I Introduo
II Comando SQL e SQL*Plus
III Consultas bsicas
IV Criao e uso de tabelas
V Gerao de relatrios
VI Expresso e Funes
VII Consultas avanadas
VIII Tpicos avanados
Apndice A Tabelas utilizadas
Apndice B Sumrio dos comandos

I Introduo

I.1 Objetivos do Curso

Neste curso voc aprender a usar o SQL*Plus para:

- Definir e alterar a estrutura de um banco de dados


- Consultar, inserir, alterar ou remover informaes de um
banco de dados
- Gerar relatrios a partir de consultas
- Gerenciar a segurana e o desempenho de um banco de
dados

I Introduo
5

I.2 O que SQL*Plus


a interface bsica para manipulaes genticas de um banco
de dados ORACLE

SQL +
comando
do controle

SQL*PLUS

SQL

Parmetros de
Controle de
formatao

BD
ORACLE

Caractersticas principais:
- interpretador de comando SQL
- possui extenses para formatao de relatrios

I Introduo

II Comandos SQL e SQL*Plus

II - Contedo

1. Ativao do SQL*Plus
2. Criao de tabelas
3. Manipulao de tabelas
4. Formatao de relatrios
5. Edio de comandos
6. Outros comandos

II Comandos SQL e SQL*Plus


8

II.1 Ativao do SQL*Plus


Para entrar no SQL*Plus, digite:
$ sqlplus <ENTER>
SQL*Plus: Version 3.0.6.5.1 Production on Wed Apr 3 08:56...
Copyright (c) ORACLE Corporation 1979, 1989. All...
Enter user-name: ora1
a senha no exibida
Enter password: ____
Connected to: ORACLE RDBMS V6.0.27.9.2, with transaction...
PL/SQL V1.0.29.1.0 Beta
SQL>

ou

a senha exibida

$ sqlplus ora 1/senha1


SQL*Plus: Version 3.0.6.5.1 Production on Wed Apr 3 08:56 ...
Copyright (c) ORACLE Corporation 1979, 1989. All ...
Connected to: ORACLE RDBMS V6.0.27.9.2, with transaction ...
PL / SQL V1.0.29.1.0 Beta
SQL >

Para sair do SQL*Plus, digite:

SQL > exit


$

II Comandos SQL e SQL*Plus


9

II.2 Criao de tabelas


O que uma tabela?

Coluna
Nome da coluna

N_EMP

NOME_EMP

103

SAMANTA

110

Linha (ou registro)

CARGO

CHEFE

DATA_ADM

SAL

ANALISTA

110

17-MAR-85

150000

UBIRATAN

DIRETOR

175

175

PAULO

PRESIDENTE

189

RITA

DIRETOR

201

EVERALDO

208

N_DEP
20

300000

20

27-FEB-86

500000

10

175

25-DEC-85

330000

5000

30

VENDEDOR

189

28-SEP-86

200000

3000

30

SILVIO

VENDEDOR

189

30-OCT-86

150000

230

ANA

SECRETARIA 175

01-MAY-89

120000

10

276

RENATO

ANALISTA

30-APR-86

100000

20

110

20-APR-85

COM

9000

30

Campos

II Comandos SQL e SQL*Plus


10

Para criar a tabela de empregados

SQL > create table emp (


2 n_emp number (4) not null,
3

nome_emp char (10),

cargo char (10)

chefe number (4),

data_adm date,

sal number (10,2),

com number (10,2),

n_dep number (2) );

. Separa as
definies
das colunas

. Executa o
comando

Indica a continuao do
comando

N_EMP

NOME_EMP

Somente o
cabealho

CARGO

CHEFE

DATA_ADM

SAL

COM

N_DEP

II Comandos SQL e SQL*Plus


11

II.3 Manipulao de tabelas

Para inserir informaes na tabela EMP:

SQL > insert into emp values


2

( 103, `SAMANTA`, `ANALISTA`, 110,

17-MAR-85, 150000, NULL, 209;

SQL > insert into emp values


2 ( 110, UBIRATAN, DIRETOR, 175, 20-APR-85,
3

300000, NULL, 20);

N_EMP

NOME_EMP

CARGO

103

SAMANTA

110

UBIRATAN

CHEFE

DATA_ADM

SAL

ANALISTA 110

17-MAR-85

150000

DIRETOR

20-APR-85

175

COM

N_DEP
20

300000

20

II Comandos SQL e SQL*Plus


12

Para recuperar as informaes da tabela EMP:

SQL > select * from emp;

N_EMP

NOME_EMP

CARGO

103

SAMANTA

ANALISTA

110

17-MAR-85

150000

20

110

UBIRATAN

DIRETOR

175

20-APR-85

300000

20

175

PAULO

PRESIDENTE

27-FEB-86

500000

10

189

RITA

DIRETOR

175

25-DEC-85

330000

5000

30

201

EVERALDO

VENDEDOR

189

28-SEP-86

200000

3000

30

208

SILVIO

VENDEDOR

189

30-OCT-86

150000

9000

30

230

ANA

SECRETARIA 175

10-MAY-89

120000

10

276

RENATO

ANALISTA

30-APR-86

100000

20

CHEFE

110

DATA_ADM

SAL

COM

N_DEP

Para recuperar apenas o nome dos empregados que so


analistas:
Nome da coluna

SQL > select nome_emp


2 from emp
3

Condio a ser satisfeita

where cargo = ANALISTA`;

NOME_EMP
SAMANTA
RENATO

Maisculas e minsculas
somente
fazem diferena

II Comandos SQL e SQL*Plus


13

Para remover o empregado de nmero 110:

SQL > delete from emp


2 where n_emp = 110;

Para remover todos os empregados admitidos a partir de 1989:

SQL > delete from emp


2 where data_adm > = `01-JAN-89;

II Comandos SQL e SQL*Plus


14

Para atualizar o salrio do funcionrio 110:

N_EMP

NOME_EMP

110

UBIRATAN

...

SAL

...

300000

SQL > update emp


2 set sal = 350000
3 where n_emp= 110;

N_EMP

NOME_EMP

110

UBIRATAN

...

SAL

...

350000

II Comandos SQL e SQL*Plus


15

II.4 Formatao de relatrios


Comandos SQL x Comandos SQL*Plus
- SQL acesso ao banco de dados
- SQL*Plus formato de apresentao dos resultados,
basicamente.
Para produzir um relatrio com o n, nome e salrio de todos os
funcionrios:
SQL > column n_emp heading NUMERO
SQL > column nome_emp heading NOME

Comandos SQL*Plus no
Precisam de ;

SQL > column sal format 999999.99


> heading SALARIO
SQL > select n_emp, nome_emp, sal from emp;

NUMERO

NOME

SALARIO

103

SAMANTA

150000.00

110

UBIRATAN 300000.00

175

PAULO

500000.00

189

RITA

330000.00

201

EVERALDO 200000.00

208

SILVIO

150000.00

230

ANA

120000.00

276

RENATO

100000.00

Para continuar um
comando,
Use o caractere _

16

II Comandos SQL e SQL*Plus

II.5 Edio de comandos

O ultimo comando SQL (no SQL*Plus) fica armazenado no


buffer de edio do SQL*Plus

Para listar o contedo do buffer:


SQL > list
ou
SQL > I
1
select
2
n_emp, nome_emp
3
from emp
4* where n_emp =110

Qualquer em desses comando


Poder ser utilizado

* indica a linha corrente

Para apagar a linha corrente:


SQL > del
SQL > I
1 select
2 n_emp, nome_emp
3* from emp

17

II Comandos SQL e SQL*Plus

Para inserir linha aps a linha corrente:


SQL > list 2
2* n_emp, nome_emp
SQL > input
ou
SQL > I
3 cargo,
4 sal
5
SQL > list
1 select
2 n_emp, nome_emp
3 cargo,
4 sal
5* from emp

Deixe uma linha em branco


Para terminar a insero

Para acrescentar caracteres no fim da linha corrente:


SQL > list 2
2* n_emp, nome_emp
SQL > append, chefe,
ou
SQL > a, chefe,
SQL > list
1 select
2 n_emp, nome_emp, chefe,
3 cargo,
4 sal
5* from emp

18

II Comandos SQL e SQL*Plus

Para substituir caracteres da linha corrente:


SQL > list 2
2* n_emp, nome_emp, chefe,
SQL > change/chefe/sal/
ou
SQL > c/chefe/sal/
SQL > list
1 select
2 n_emp, nome_emp, sal,
3 cargo,
4 sal
5* from emp

Para executar o comando existente no buffer:


SQL > run
ou
SQL > r
ou
SQL > /

19

II Comandos SQL e SQL*Plus

O SQL*Plus permite a utilizao de outros buffers alm do


buffer de comandos SQL
Para ativar um buffer chamado TESTE, por exemplo:
SQL > set buffer teste

Para saber qual o buffer corrente:


SQL > show buffer
buffer TESTE

Para modificar o contedo do buffer corrente com um editor


externo:
SQL > edit

O editor externo pode ser especificado pelo usurio da seguinte


forma:
SQL > define _ editor = vi

20

II Comandos SQL e SQL*Plus

para salvar o buffer corrente num arquivo do Sistema


Operacional:
SQL > save arquivo
nome do arquivo; a extenso .sql
acrescentada automaticamente

Para recuperar um comando SQL armazenado num arquivo:


SQL > get arquivo

Para executar um seqncia de comando (SQL ou SQL*Plus)


armazenada num arquivo:
SQL > start arquivo
ou
SQL > @arquivo

Para editar um arquivo qualquer do sistema operacional:


SQL > edit en21

assumida a extenso .sql

21

II Comandos SQL e SQL*Plus

II.6 Outros comandos


Para executar um comando qualquer do sistema operacional:
SQL > host
ou
SQl > !
total 20
drwxr-xr-x 2
drwxr-xr-x 3
-rw-r-r1
-rw-r-r1
-rw-r-r1
-rw-r-r1
-rw-r-r1

curso
curso
curso
curso
curso
curso
curso

oracle
oracle
oracle
oracle
oracle
oracle
oracle

128
1024
800
838
1152
1616
1796

Jan 3
Jan 3
Jan 3
Jan 3
Jan 3
Jan 3
Jan 3

18:02 .
17:59 ..
17:59 ex21.sql
17:59 ex22.sql
18:01 ex23.sql
18:01 ex24.sql
18:01 ex25.sql

Para obter ajuda sobre um comando SQL ou SQL*Plus:


SQL > help select

nome do comando

Para saber todos os comandos disponveis:


SQL > help commands

22

II Comandos SQL e SQL*Plus

II - Exerccios
1. Crie uma tabela chamada ALUNO com as seguintes colunas:
NOME
ENDER
CIDADE
ESTADO
CEP
ANIVERSARIO

CHAR( 30 ) NOT NULL


CHAR( 50 )
CHAR( 25 )
CHAR( 2 )
NUMBER( 5 )
DATE

dica: veja um exemplo na pgina 11


2. Insira dados sobre voc e algum membro da sua famlia na tabela
ALUNO
(dica: exemplos na pgina 12)
3. Consulte o nome e a data de aniversrio das pessoas cadastradas
(dica: exemplo na pgina 13)
4. Consulte o seu (e somente o seu ) endereo completo
5. Salve o comando anterior no arquivo ex24.sql, saia do SQL*Plus,
entre novamente e execute o comando contido no arquivo gerado

23

II Comandos SQL e SQL*Plus

III Consultas bsicas

24

III - Contedo

1.

Seleo de colunas

2.

Uso de expresses

3.

Seleo de linhas

4.

Ordenao de resultados

5.

Agrupamento

6.

Operao de conjunto

7.

Juno de tabelas

III Consultas bsicas


25

III.1 Seleo de colunas


Para indicar as colunas a serem recuperadas de uma tabela:
SQL > select n_emp, nome_emp
2 from emp
3 where n_emp < 200;

N_EMP

NOME_EMP

103
110
175
189

SAMANTA
UBIRATAN
PAULO
RITA

A ordem em que as colunas so especificadas muda a


apresentao do resultado:
SQL > select nome_emp, n_emp
2 from emp
3 where n_emp < 200;

NOME_EMP

N_EMP

SAMANTA
UBIRATAN
PAULO
RITA

103
110
175
189

III Consultas bsicas


26

III.2 Uso de expresses


Para saber o salrio anual dos empregados
NOME_EMP

CARGO

SAL

SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

ANALISTA
DIRETOR
PRESIDENTE
DIRETOR
VENDEDOR
VENDEDOR
SECRETARIA
ANALISTA

150000
300000
500000
330000
200000
150000
120000
100000

SQL > select nome_emp, 12* sal from emp;

NOME_EMP

12*SAL

SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

1800000
3600000
6000000
3960000
2400000
1800000
1440000
1200000

III Consultas bsicas


27

Para saber o n total de caracteres nas colunas NOME_EMP E


CARGO
NOME_EMP

CARGO

SAL

SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

ANALISTA
DIRETOR
PRESIDENTE
DIRETOR
VENDEDOR
VENDEDOR
SECRETARIA
ANALISTA

150000
300000
500000
330000
200000
150000
120000
100000

SQL > select


2 length ( nome_emp ) +
3 length ( cargo ) Comprimento Total
4 from emp;
Comprimento Total
15
15
15
11
16
14
13
14

III Consultas bsicas


28

III.3 Seleo de linhas


Para saber os nomes dos empregados que trabalham no
departamento 20:

N_EMP

NOME_EMP

103
110
175
189
201
208
230
276

SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

CARGO
ANALISTA
DIRETOR
PRESIDENTE
DIRETOR
VENDEDOR
VENDEDOR
SECRETARIA
ANALISTA

...
...
...
...
...
...
...
...
...

N_DEP
20
20
10
30
30
30
10
20

SQL > select nome_emp


3 from emp
4 where n_dep = 20;

NOME_EMP
SAMANTA
UBIRATAN
RENATO

29

III Consultas bsicas

Para saber o tempo de servio dos funcionrios cuja comisso


maior que 5% do salrio:

SQL > select nome_emp,


2
months_between( sysdate, data_adm ) MESES
3 from emp
4
where com > sal * 0.05;

NOME_EMP
SILVIO

MESES
48.689726

30

III Consultas bsicas

III.4 Ordenao de resultados


Para listar os funcionrios em ordem alfabtica:

SQL > select nome_emp, cargo, sal


2 from emp
3 order by nome_emp;

NOME_EMP

CARGO

ANA
EVERALDO
PAULO
RENATO
RITA
SAMANTA
SILVIO
UBIRATAN

SECRETARIA
VENDEDOR
PRESIDENTE
ANALISTA
DIRETOR
ANALISTA
VENDEDOR
DIRETOR

SAL
120000
200000
500000
100000
330000
150000
150000
300000

31

III Consultas bsicas

Para listar os empregados em ordem decrescente de salrio, por


cargo:
SQL > select nome_emp, cargo, sal
2 from emp
3 where cargo in ( `ANALISTA`, VENDEDOR`,
4
`DIRETOR`, SECRETARIA` )
5 order by cargo, sal desc;

NOME_EMP

CARGO

SAMANTA
RENATO
RITA
UBIRATAN
ANA
EVERALDO
SILVIO

ANALISTA
ANALISTA
DIRETOR
DIRETOR
SECRETARIA
VENDEDOR
VENDEDOR

SAL
150000
100000
330000
300000
120000
200000
150000

Pode-se usar expresses ou referencias posio de expresses


no SELECT como argumento do ORDER BY:
SQL > select nome_emp, cargo, length( cargo ), sal
2 from emp
3 where cargo in (`ANALISTA`, `VENDEDOR`,
4
`DIRETOR`, `SECRETARIA`)
5 order by 3, sal nvl(com, 0 ) desc;
Indica a 3 expresso do
SELECT, que
length(cargo)

32

III Consultas bsicas

III.5 - Agrupamento
Para saber quantos
departamento:
N_EMP

NOME_EMP

CARGO

230

ANA

SECRETARIA

funcionrios

CHEFE
175

trabalham

DATA_ADM

SAL

01-MAY-89

120000

em

COM

cada

N_DEP
10

Para saber quantos funcionrios trabalham em cada


175
PAULO
PRESIDENTE
27-FEB-86
500000
departamento:

10

276

103

SAMANTA

ANALISTA

110

17-MAR-85

150000

20

RENATO

ANALISTA

110

30-APR-86

100000

20

UBIRATAN

DIRETOR

175

20-APR-85

300000

20

189

RITA

DIRETOR

175

25-DEC-85

330000

5000

30

201

EVERALDO

VENDEDOR

189

28-SEP-86

200000

3000

30

208

SILVIO

VENDEDOR

189

30-OCT-86

150000

9000

30

110

22222222222jhglkjhgflkgjhfdlghfg ,lhdlfgn v

coluna do agrupamento

SQL > select n_dep, count(*)


2 from emp
3 group by n_dep;

N_DEP
10
20
30

COUNT(*)

todas as linhas

Funo de grupo

critrio de agrupamento

2
3
3

Nota: omitir a clusula GROUP BY significa agrupar toda a


tabela

33

III Consultas bsicas

Para saber a soma dos salrios para os cargos onde a mdia de


salrios maio que 150000:
N_EMP

NOME_EMP

CARGO

...

SAL

...

103
276

SAMANTA
RENATO

ANALISTA
ANALISTA

...
...

150000
100000

...
...

AVG = 125000

110
189
175

UBIRATAN
RITA
PAULO

DIRETOR
DIRETOR
PRESIDENTE

...
...
...

300000
330000
500000

...
...
...

AVG = 315000

230

ANA

SECRETARIA

...

120000

...

AVG = 120000

201
208

EVERALDO
SILVIO

VENDEDOR
VENDEDOR

...
...

200000
150000

...
...

AVG = 175000

SQL > select cargo, sum( sal ), max( sal )


2 from emp
3 group by cargo
4 having avg( sal ) > 150000;
funo de grupo

seleciona os
grupos
(where de

CARGO
DIRETOR
PRESIDENTE
VENDEDOR

SUM(SAL)
630000
500000
350000

MAS(SAL)
330000
500000
200000

34

III Consultas bsicas

III.6 Operaes de conjunto


Uma tabela pode ser encerada como um conjunto
Os elementos do conjunto so as linhas da tabela:
Col. 1 Col. 2
A
1
B
1
D
2

Tabela

(A, 1)
(B, 1)
(D, 2)

elementos
do
conjunto

Conjunto

Existem trs operaes bsicas de conjunto em SQL:


- unio (UNION)

- interseco (INTERSECT)

- diferena (MINUS)

35

III Consultas bsicas

Unio:
TABELAS

TAB1

TAB2

Col. 1 Col. 2
A
1
B
1
D
2

CONJUNTOS

Cj1

Cj2
(A, 2)
(B, 1)
(E, 2)
(D, 2)

(A, 1)
(B, 1)
(D, 2)

Col. 1 Col. 2
A
2
B
1
E
2
D
2

colunas com tipo igual


select col1, col2 from tab1
Cj1 U Cj2
union
select col1, col2 from tab2

Col. 1 Col. 2
A
1
A
2
B
1
D
2
E
2

(A, 1)
(A, 2)
(B, 1)
(D, 2)
(E, 2)

36

III Consultas bsicas

Interseco:
TABELAS

TAB1

TAB2

Col. 1 Col. 2
A
1
B
1
D
2

CONJUNTOS

Cj1

Cj2

(A, 1)
(B, 1)
(D, 2)

(A, 2)
(B, 1)
(E, 2)
(D, 2)

Col. 1 Col. 2
A
2
B
1
E
2
D
2

colunas com tipo igual


select col1, col2 from tab1
Cj1 inter Cj2
intersect
select col1, col2 from tab2

Col. 1 Col. 2
B
1
D
2

(B, 1)
(D, 2)
37

III Consultas bsicas

Diferena:
TABELAS

TAB1

TAB2

Col. 1 Col. 2
A
1
B
1
D
2

CONJUNTOS

Cj1

Cj2
(A, 2)
(B, 1)
(E, 2)
(D, 2)

(A, 1)
(B, 1)
(D, 2)

Col. 1 Col. 2
A
2
B
1
E
2
D
2

colunas com tipo igual


select col1, col2 from tab1
Cj1 - Cj2
minus
select col1, col2 from tab2

38

Col. 1 Col. 2
A
1
(A, 1)

III Consultas bsicas

III.7 Juno de tabelas


A juno de tabelas corresponde operao de produtos
cartesiano entre conjuntos:

A,
B, C

1, 2

(A, 1), (A, 2),


(B,1), (B,2),
(C,1), (C, 2)

tab1
col1
A

col2
3

col3
B

tab2
col4
2

col5
E

39

select col1, col2, col3, col4, col5


from tab1, tab2;

Col1
A

col2
3

col3
B

col4
2

col5
E

III Consultas bsicas

Para saber o nome do departamento onde cada empregado


trabalha:
SQL > select nome_emp, nome_dep
2 from emp, dep
3

where emp.n dep = dep.n_dep;

produto cartesiano
critrio de seleo da juno

para diferenciar coluna


de
mesmo nome usa-se o
no-

NOME_EMP

NOME_DEP

PAULO
ANA
SAMANTA
UBIRITAN
RENATO
RITA
SILVIO
EVERALDO

ADMINISTRAO
ADMINISTRAO
PESQUISA
PESQUISA
PESQUISA
VENDAS
VENDAS
VENDAS

40

III Consultas bsicas


NOME_EMP

NOME_DEP

EMP.N_DEP

DEP.N_DEP

SAMANTA
UBIRATAN

ADMINISTRAO
ADMINISTRAO

20
20

10
10

UBIRATAN

ADMINISTRAO

20

10

PAULO

ADMINISTRAO

10

10

RITA

ADMINISTRAO

30

10

EVERALDO

ADMINISTRAO

30

10

SILVIO

ADMINISTRAO

30

10

ANA

ADMINISTRAO

10

10

RENATO

ADMINISTRAO

20

10

SAMANTA

PESQUISA

20

20

UBIRATAN

PESQUISA

20

20

PAULO

PESQUISA

10

20

RITA

PESQUISA

30

20

EVERALTO

PESQUISA

30

20

SILVIO

PESQUISA

30

20

ANA

PESQUISA

10

20

RENATO

PESQUISA

20

20

SAMANTA

VENDAS

20

30

UBIRATAN

VENDAS

20

30

PAULO

VENDAS

10

30

RITA

VENDAS

30

30

EVERALDO

VENDAS

30

30

SILVIO

VENDAS

30

30

ANA

VENDAS

10

30

RENATO

VENDAS

20

30

SAMANATA

PRODUO

10

40

PAULO

PRODUO

10

40

RITA

PRODUO

30

40

EVERALDO

PRODUO

30

40

SILVIO

PRODUO

30

40

ANA

PRODUO

10

40

RENATO

PRODUO

20

40

41

III Consultas bsicas

Dada a tabela FAIXA_SAL, que classifica faixas de salrios:


SALMIN
1
100000
150000
200000
400000

SALMAX

99999
149999
199999
399999
800000

A
B
C
D
E

Para saber a faixa salarial de todos os empregados:


SQL > select nome_emp, sal, faixa
2 from emp, faixa_sal
3 where sal between salmin and salmax;

NOME_EMP

SAL

ANA
RENATO
SAMANTA
SILVIO
UBIRATAN
RITA
EVERALDO
PAULO

120000
100000
150000
150000
300000
300000
200000
500000

B
B
C
C
D
D
D
E

especifica um tipo
de juno

42

III Consultas bsicas

Pode-se combinar diversas opes no mesmo comando SQL:


SQL > select nome_dep, faixa, count( * )
2 from emp, dep, faixa_sal
3 where emp.n_dep = dep.n_dep and
4
sal between salmin and salmax
5 group by nome_dep, faixa
6 having sum( sal ) > 120000
7 order by nome_dep, count( * ) desc

NOME_DEP

ADMINISTRAO
PESQUISA
PESQUISA
VENDAS
VENDAS

E
C
D
D
C

COUNT(*)
1
1
1
2
1

43

III Consultas bsicas

III - Exerccios
1. Consulte o cargo, o nome e o salrio por hora (assumindo 160
horas/ms) de todos os funcionrios da tabela EMP; salve seu
exerccio no arquivo ex31.sql.
2. Consulte o nome e o total mensal (salrio mais comisso)
recebido pelos vendedores da tabela EMP.
3. Carregue o contedo do arquivo ex31.sql no buffer corrente e
modifique-o de forma a ordenar o resultado em ordem
decrescente do salrio por hora; salve seu exerccio novamente,
no mesmo arquivo.
4.

Descubra o menor salrio de todos os empregados. Dica: vela a


nora da pgina 33.

5.

Descubra o menor, o maior e a mdia dos salrios de cada


departamento, para aqueles departamentos que tem mais de um
empregado. Dica: veja a pgina 34.

6.

Consulte o nome e o departamento de todos os empregados que


trabalham em So Paulo ou Campinas; salve sei exerccios no
arquivo ex36.sql. Dica: faa uma juno da tabela EMP com a
tabela DEP (pgina 42), e recupere somente as linhas onde a
localidade do departamento So Paulo ou Campinas.

44

III Consultas bsicas

IV Criao e uso de tabelas

45

IV Contedo

1. CREATE TABLE
2. Tipos de colunas
3. Alterao de uma tabela
4. O comando INSERT
5. O comando DELETE
6. O comando UPDATE
7. Controle de transaes
8. Manipulao de vises
9. Criao de seqncias
46

IV Criao e uso de tabelas

IV.1 CREATE TABLE


O comando CREATE TABLE usado para criar novas tabelas
no banco de dados
- Forma 1:

especificao do tamanho
entre parnteses

CREATE TABLE nome_da_tabela


Definio das
(
colunas separadas
coluna_1 tipo1,
por ,
coluna_2 tipo2( tamanho ),
coluna_3 tipo3 restries,
coluna_4 tipo4( tamanho ) restries
restries
);

nome_da_tabela
nome da tabela a ser criada
coluna_1,...
colunas da tabela
tipo1, tipo2,...
tipos das respectivas colunas
tamanho
tamanho para um tipo
restries
uma combinao de zero ou mais de:
>NULL ou NOT
indica que a coluna pode conter
valores nulos (opo default) ou no

>DEFAULT expr

determina o valor default da coluna


como sendo expr

47

>UNIQUE

indica que no podem existir valores


duplicados para esta coluna. No pose
ser usado com PRIMARY KEY

>PRIMARY KEY

indica que esta coluna chave primaria.


No pode ser usado com UNIQUE.

IV Criao e uso de tabelas

>REFERENCES
/ FOREINGN
KEY tab (col)

>CHECK
deve
condio
especificada

>CONSTRAINT
deve
nome_restr

indica que o valor desta coluna,


se existir,
deve existir tambm na coluna
col da tabela
primria
tab.
As
colunas
referenciadas na
tabela primria
devem ser PRIMARY KEY ou
UNIQUE.
determina que o valor desta coluna
obedecer condio lgica

determina que o valor desta coluna


obedecer restries nome_restr

OBS: Embora todas as restries acima possam ser definidas, o


RDBMS ORACLE verso 6 s garante a primeira: NULL ou
NOT NULL. Entretanto, o SQL*Forms 3.0 capaz de gerar
cdigo automaticamente para vrios tipos de restries.
SQL > CREATE TABLE emp
number(4)
NOT NULL PRIMARY KEY,
3 nome_emp char(10)
NOT NULL,
4 cargo
char(10),
5 chefe
number(4)
REFERENCES emp(n_emp),
6 data_adm
date
DEFAULT sysdate
7 CHECK (data_adm < = sysdate),
8 sal
number(10,2),
9 com
number(10,2)
CHECK(com > 0),
10 n_dep
number(2)
REFERENCES dep(n_dep) );

Exemplo:
2 ( n_emp

48

IV Criao e uso de tabelas

- Forma 2:
CREATE TABLE tabelas AS
SELECT col1, col2, ... coln
FROM ...

- Cria uma tabela igual ao resultado da consulta executada


com o comando SELECT
- Exemplo:
SQL > create table sal_mdio as
2 select nome_dep, avg( sal ) Media_Salario
3 from dep, emp
4 where emp.n_dep = dep.n_dep
5 group by nome_dep;

SQL > select * from sal_mdio;


NOME_DEP
ADMINISTRAO
PESQUISA
VENDAS

Media_Salrio
310000
183333.333
226666.667
49

IV Criao e uso de tabelas

Para verificar a estrutura de uma tabela


SQL > describe emp
Ou
SQL > desc emp
Name
Null?
Type
N_EMP
NOT NULL NUMBER(4)
NOME_EMP
NOT NULL CHAR(10)
CARGO
CHAR(10)
CHEFE
NUMBER(4)
DATA_ADM
DATE
SAL
NUMBER(10,2)
COM
NUMBER(10,2)
N_DEP
NUMBER(2)

Para remover uma tabela:


SQL > drop table faixa_sal;

Para mudar o nome de uma tabela:


SQL > rename dep to departamento;

50

IV Criao e uso de tabelas

IV.2 Tipos de colunas


O Oracle suporta os seguintes tipos:

CHAR [(tamanho)]

VARCHAR [(tamanho)] (sinnimo de CHAR)

CHARACTER [(tamanho)] (sinnimo de CHAR)

DATE

NUMBER [(tamanho [, decimais] )]

DECIMAL [(tamanho [, decimais] )]

INTEGER, INT (sinnimos de NUMBER)


NUMERIC, DEC (sinnimo de DECIAMAL)

FLOAT [(tamanho)]

REAL

51

DOBLE PRECISION
LONG

RAW (tamanho), LONG RAW

IV Criao e uso de tabelas

IV.3 Alterao de uma tabela


SQL > desc dep
Name

Null?

N_DEP
NOME_DEP
LOCAL_DEP

NOT NULL NUMBER(2)


CHAR(14)
CHAR(13)

Type

Para acrescentar uma coluna tabela DEP:


SQL > alter table dep
2 add ( diretor number( 4 ) );

nome da coluna

tabela a ser modificada

Tipo da coluna

Para aumenta o tamanho da coluna NOME_DEP:

SQL
table dep
SQL >
> alter
desc dep
2
modify
( nome_dep
);
Name
Null? char( 30 )Type
N_DEP
NOME_DEP
LOCAL_DEP
DIRETOR

coluna a ser modificada

NOT NULL NUMBER(2)


novo tipo
CHAR(30)
CHAR(13)
NUMBER(4)

52

IV Criao e uso de tabelas

Restries para a alterao da estrutura de uma tabela:


- No se pode adicionar colunas no nulas (NOT NULL)
em tabelas que j possuem linhas.
- S possvel diminuir o tamanho de uma coluna, ou
mudar seu tipo, se todos os valores desta coluna forem
nulos.
- S possvel alterar o tipo de uma coluna para NOT
NULL se nenhum dos seus valores for nulo.
- No possvel remover uma coluna de uma tabela com o
comando ALER TABLE. Para conseguir este efeito devese criar outra tabela sem a coluna a ser removida. Por
exemplo. Para apagar a coluna DIRETOR:

SQL > create table dep_temp as


2 select n_dep, nome_dep, local_dep
3 from dep;
SQL > drop table dep;
SQL > rename dep_temp to dep;
53

IV Criao e uso de tabelas

IV.4 O comando INSERT


O comando INSERT usado para inserir linhas com uma tabela.
- Forma 1:
INSERT INTO tabela [( cil1, col2, ... coln)]
VALUES ( val1, val2, ... valn)

tabela

nome da tabela onde os dados sero inseridos

col1, col2, ... coln

lista de colunas nas quais sero inseridos os


valores. Ser inserido o valor NULL nas colunas no
especificadas. Se nenhuma coluna for especificada,
assumida uma lista com todas as colunas da tabela na
ordem apresentada pelo comando DESCRIBE.

val1, val2, ... valn

lista de valores a serem inseridos. Os valores


devem concordar em n, ordem e tipo com as colunas
especificadas no comando INSERT

SQL > Insert into emp


2
(nome_emp, n_emp, cargo, chefe, data_adm, sal, n_dep)
Exemplo:
3
values ( SAMANTA`, 103, `ANALISTA`, 110, sysdate-30,
4
150000, 20);
ou
SQL > Insert into emp
2
values ( 103, `SAMANTA`, `ANALISTA`, 110, sysdate-30
3
150000, NULL, 20);

54

IV Criao e uso de tabelas

- Forma 2:
INSERT INTO tabela ( col, col2, ... coln )
SELECT exp1, exp2, ... expn
FROM ...

- Insere todas as linhas retornadas pela consulta executada pelo


comando SELEC
- As expresses exp1, exp2, expn devem concordar em n,
ordem e tipo com as colunas especificadas no comando
INSERT.
- Exemplo:
SQL > insert into faixa_sal(salmin, salmax, faixa)
2 select min( sal ), max( sal ), substr( cargo, 1, 1 )
3 from emp
4 group by substr( cargo, 1, 1 );

55

IV Criao e uso de tabelas

IV.5 Comando DELETE


O comando DELETE usado para remover linhas de uma
tabela:
DELETE FROM tabela WHERE condio

tabela

nome da tabela de onde sero removidas as linhas

condio
Opcional.

condio que especifica as linhas a serem removidas.

Exemplos
- Para remover o empregado de n 189:
SQL > delete from emp where n_emp = 189;

- Para remover todos empregados do departamento 20:


SQL > delete from emp where n_dep = 20;
56

- Para remover todos os empregados:


SQL > delete from emp;

IV Criao e uso de tabelas

IV.6 O comando UPDATE


O comando UPDATE usado para alterar valores j
armazenados em tabelas:
UPDATE tabela
SET col1 = exp1, col2, = exp2, ... coln = expn
WHERE condio

ou
UPDATE tabela
SET ( col1 [, col2 ...] ) = ( consulta )
WHERE condio

tabela

nome da tabela a ser atualizada

col1, col2, ... coln

colunas cujos valores sero alterados

exp1, exp2, ... expn

expresses cujos resultados sero atribudos s


colunas col1, ... coln respectivamente

consulta

consultas que deve retornar o mesmo nmero


de colunas especificas na clusula SET

57

condio

especifica as linha que sero atualizadas

IV Criao e uso de tabelas

Exemplos
- Para colocar 1000 de comisso para o funcionrio de nmero
208:
SQL > update emp
2 set com = 1000
3 where n_emp = 208;

- Para dobrar o salrio de todos empregados do departamen20 e


transferi-los para o departamento 30:
SQL> update emp
2 set sal = 2 * sal, n_dep = 30
3 where n_dep = 20;

- Para atualizar o salrio do funcionrio 208 como sendo o


salrio de seu chefe:
SQL > update emp e 1
2 set sal = ( select sal from emp e2
3 where e2.n:emp = e1.chefe )
where e1.n_emp = 208;
58

IV Criao e uso de tabelas

IV.7 Controle de transaes

Uma transao uma seqncia indivisvel de comandos SQL


que modifica o contedo de banco de dados.
Por exemplo, para transferir uma certa quantia em dinheiro de
uma conta A para uma conta B, devemos:
- retirar o dinheiro da conta A
- depositar o dinheiro n conta B
Para que a operao acima seja segura, ou os dois passos so
executados ou nenhum deles pode ocorrer.

59

IV Criao e uso de tabelas

O incio de uma transao determinado pelo primeiro


comando de manipulao de dados (INSERT, UPDATE,
DELETE) desde o fim da ltima transao ou inicio da seo
corrente.

O fim de uma transao determinada de uma das seguintes


formas:

execuo do comando COMMIT, todas as modificaes


so efetivadas no banco de dados

execuo do comando
modificao efetivada

ROLLBACK;

nenhuma

- execuo de comando de definio de dados (CREATE,


ALTER, ...); equivale ao comando COMMIT
- trmino da sesso corrente: equivale ao comando
COMMIT

60

- quando uma transao interrompida por fatores externos


(queda do sistema) ou internos (deadlock); equivale ao
comando ROLLBACK

IV Criao e uso de tabelas

Exemplo:
$ sqlplus ora 1/senha 1
SQL*Plus: version 3.0.6.5.1 Production on Wed Apr 3 08:56 ...
Copyright (c) ORACLE Corporation 1979, 1989. All ...
Connected to: ORACLE RDBMS V6.0.27.9.2, with transaction ...
PL/SQL V1.0.29.1.0 Beta
SQL > set feedback off
SQL > select n_dep, nome_dep from dep;
N_DEP
10
20
30
40

NOME_DEP
ADMINISTRAO
PESQUISA
VENDAS
PRODUO

inibe algumas mensagens de


aviso

Incio de uma transao

SQL > insert into dep values( 50, `MARKETING`. `SAO PAULO` );
SQL > insert into dep values( 60, `INFORMATICA`, `CAMPINAS`);
SQL > select n_dep, nome_dep from dep;
N_DEP
10
20
30
40
50
60

NOME_DEP
ADMINISTRAO
PESQUISA
VENDAS
PRODUO
MARKETING
INFORMATICA

SQL > commit;


Commit complete.

O prprio usurio v os dados, mas


eles ainda no foram efetivados

fim da transao, com


efetivao dos dados

61

IV Criao e usa de tabelas


SQL > update dep set nome_dep = `COMERCIAL`
2 where n_dep = 30;
SQL > select nome_dep from dep where n_dep = 30;
Incio de
outra
transao

NOME_DEP
COMERCIAL
fim da transao;
as
atualizaes foram

SQL > rollback;


Rollback complete.
SQL > select nome_dep from dep where n_dep = 30;
NOME_DEP
VENDAS

SQL > delete from emp where n_emp = 103;


SQL > insert into emp values
2
( 103, `SAMANTA`, `DIRETOR`, 175, `17-MAR-85`,
Produzem o
3
200000, NULL, 20);
Mesmo
SQL > commit;
efeito
Commit complete.
SQL > update emp set cargo = `DIRETOR`, chefe = 175, sal = 200000
2 where n_emp =103;
SQL > commit;
Commit complete.
SQL > delete from emp
62
2 where n_dep = 10;
SQL > exit

inicio da
ultima
transao
Fim da ultima transao
Com COMMIT implcito

IV Criao e usa de tabelas

Observaes
- Uma transao ou executada totalmente ou no
executada; no existe transao parcialmente executada,
por definio.

USURIO 1
SQL > select sal from emp
- n_emp
As modificaes
2 where
= 189;

USURIO 2
SQL > select sal from emp
efetuadas no
de uma
transao
2 decorrer
where n_emp
= 189;

por um usurio s so visveis a outros usurios aps a


SAL
da transao (COMMIT).

SAL efetivao
330000

330000

SQL > update emp


2 set sal = 400000
3 where n_emp = 189;

SQL >

SQL > select sal from emp


2
where n_emp = 189;

SQL > select sal from emp


2
where n_emp = 189;

SAL
400000

SAL
330000

SQL > commit;


Commit coplete.

SQL >

SQL > select sal from emp


2
where n_emp = 189;

SQL > select sal from emp


2
where n_emp = 189;

SAL
400000

SAL
400000

63

IV Criao e usa de tabelas

O comando SET AUTOCOMMIT ON do SQL*Plus faz com


que o commit seja executado automaticamente a cada
SQL > set feedback on
SQL > setcomando
autocommitde
onmanipulao de dados:
SQL > delete from dep
2 where n_emp = 10;
Commmit complete.
1 record deleted.
SQL > insert into emp values( 103, `SAMANTA`, `ANALISTA`,
2 110, `17-MAR-85`, 150000, NULL, 20);
Commit complete.
1 record created.
SQL > set autocommit off
SQL > delete from emp
2 where n_emp = 189;
1 record deleted.
SQL > rollback;
Rollback complete.

64

IV Criao e usa de tabelas

possvel determinar pontos de salvamento intermedirios


em transaes:

SQL > update conta


2 set saldo = saldo 10
3 where codigo = 1;

determina um ponto de
salvamento

SQL > savepoint ja_tirou;


SQL > update conta
2 set saldo = saldo + 10
3 where codigo = 2;

desfaz as modificaes feitas aps


o ponto de salvamento j_tirou

SQL > rollback to ja_tirou;

65

IV Criao e usa de tabelas

Para garantir que vrios comandos SELECT recuperem


sempre os mesmo dados, independentemente de transaes
concorrentes:

SQL > set transction read only;


SQL > select sal
2 from emp
3 where n_emp = 110;
SAL
300000
SQL >
SQL > select sal
2 from emp
3 where n_emp = 110;

os resultados sero
sempre iguais

SAL
300000
66

IV Criao e usa de tabelas

IV.8 Manipulao de vises


Uma viso como uma janela que permite visualizar ao
modificar seletivamente informaes armazenadas em
tabelas.
Vises so utilizadas por:
-

segurana: pode-se restringir o acesso a informaes


contidas em tabelas

Tabela Emp
N_EMP

NOME_EMP

...N_DEP

103
110
175
189
201
208
230
276

SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

... 20
...20
...10
...30
...30
...30
...10
...20

Viso Emp_10
N_EMP

NOME_EMP

...N_DEP

175
230

PAULO
ANA

... 10
...10

67

as colunas (nome e definio)


so
herdadas da tabela origem

SQL > create view emp_10 as


2 select * from emp
3 where n_dep = 10;

IV Criao e usa de tabelas

- convenincia: consultas complexas podem ser simplificadas


com a criao de vises
Emp
N_EMP

NOME_EMP

103
110
175
189
201
208
230
276

SAMANTA
UIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

...20
...20
...10
...30
...30
...30
...10
...20

Dep
N_DEP

NOME_DEP

10
20
30
40

ADMINISTRAO
PESQUISA
VENDAS
PRODUO

indicaes para o
dep. 20 apenas,
por motivos de
clareza

NOME
NUM NUM_DEPTO NOME_DEPTO
SAMANTA
103
20
PESQUISA
UBIRATAN
110
20
PESQUISA
PAULO
175
10
ADMINISTRAO
RITA
189
30
VENDAS
create view emp_dep
( nome,
num, 30
num_epto, nome_depto
EVERALDO
201
VENDAS )
SILVIO n_emp,208
30
as select nome_emp,
dep.n_dep,
nome_depVENDAS
68
ANA
230
10
ADMINISTRAO
from emp, dep
RENATO
276
20
PESQUISA
where emp.n_dep
= dep.n_dep;
o nome das colunas pode ser modificado

Emp_Dep
SQL >
2
3
4

...N_DEP

IV Criao e usa de tabelas

Uma viso considerada uma tabela virtual, isto , funciona


como uma tabela mas no contem dados. Os dados de uma viso
so calculados a partir de outras tabelas (ou vises!).
Para descrever a estrutura de uma viso:
SQL > desc emp_dep
Name
Null?
NOME
NUM
NUM_DEPTO
NOME_DEP

Type

CHAR(10)
NOT NULL NUMBER(4)
NOT NULL NUMBER(2)
CHAR(14)

Para consultar uma viso:


SQL > select
* from emp_dep;
NOME
NUM
SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

103
110
175
189
201
208
230
276

NUM_DEPTO

NOME_DEPTO

20
20
10
30
30
30
10
20

PESQUISA
PESQUISA
ADMINISTRAO
VENDAS
VENDAS
VENDAS
ADMINISTRAO
PESQUISA

69

IV Criao e usa de tabelas

Uma viso pode ser criada em temo de execuo:


SQL > select ep.nome_emp, dp.nome_dep
1 from emp ep, ( select de.n_dep, de.nome_dep
2
from dep de ) dp
3
where ep.n_dep = dp.n_dep
nome_emp
SAMANTA
UBIRATAN
PAULO
RITA
...

nome_dep
PESQUISA
PESQUISA
ADMINISTRAO
VENDAS

70

IV Criao e usa de tabelas

Somente possvel atualizar (INSERT, DELERE, UPDATE)


informaes em vises que:
- esto baseadas em uma nica tabela
- fazem referncia a todas as colunas no nulas (NOT
NULL) da tabela
- recuperam todas as colunas diretamente, sem nenhuma
expresso
A viso EMP_10 pode ser atualizada, ao contrrio da viso
EMP_DEP, que baseada em duas tabelas
Para visualizar a consulta que define uma viso:
faz o SQL*Plus mostrar at 500 caracteres de
colunas do tipo LONG

SQL > set long 500


SQL > select tex from eser_views where view_name = `EMP_DEP`;
TEXT
select nome_emp, n_emp, dep.n_dep, nome_dep
from emp, dep
where emp.n_dep = dep.n_dep

71

Para remover uma viso:


SQL > drop view emp_dep;

IV Criao e usa de tabelas

IV.9 Criao de seqncias


possvel definir seqncias numricas a serem geradas
automaticamente pelo OROCLE:
CREATE SEQUENCE nome_seq
[INCREMENT BY {1 / num}]
[START WITH num]
[MAXVALUE num / NOMAXVALUE]
[MINVALUE num / NOMINVALUE]
[CYCLE / NOCYCLE]
[CACHE {20 / num} / NOCACHE]
[ORDER / NOORDER]

Para criar uma seqncia chamada seq_emp :


SQL > CREATE SEQUENCE seq_emp
2 START WITH 1 NOMAXVALUE ORDER;
72

Para us-la:
SQL > INSERT INTO( nome_emp, n_emp, ...)
2 VALUES ( `PROXIMO CLIENTE`, seq_emp.NEXTVAL, ...);

IV Criao e usa de tabelas

IV - Exerccios
1.

Crie uma tabela EMPREG que contm os dados das colunas


N_EMP, NOME_EMP E SAL da tabela EMP. Dica: use a forma
2 do comando CREATE TABLE (pgina 49).

2. mude o nome da tabela EMPREG para TEMP e depois a


remova.
3. altere a estrutura da tabela ALUNO criada no exerccio a da
parte II, de forma a:
a) aumenta o tamanho da coluna CIDADE para 35 caracteres
b) acrescentar o campo SAL_DESEJADO, com tipo
numrico de 9 dgitos na parte inteira e 2 casas decimais.
Dica: lembre-se que o tamanho de um numero dado pela

73

soma dos dgitos na parte inteira com os dgitos na parte


decimal do numero.
4. Insira os seguintes dados de um(a) amigo(a) seu(sua) na tabela
ALUNO: NOME, ANIVERSARIO e SAL_DESEJADO
5. Atualize o seu salrio desejado e o endereo completo da pessoa
cadastrada no exerccio anterior.
6. Remova o atributo SAL_DESEJADO da tabela ALUNO. Dica:
veja a pgina 54.
7. Remova os dados da pessoa cadastrada no exerccio 4 e efetive
sua transao.

IV Criao e usa de tabelas

8. Crie uma viso chamada DEP_SAL baseada nas tabelas EMP e


DEP, contendo as seguintes informaes:
-

Nome do departamento (NOME_DEP)


Numero de funcionrios (NUM_FUNC)
Salrio mnimo (SAL_MIN)
salrio mdio (SAL_MED)
salrio Maximo (SAL_MAX)

dica: primeiro faa uma consulta que retorna os dados acima,


para depois criar uma viso baseada nessa consulta
9. Verifique a estrutura da viso DEP_SAL com o comando
DESCRIBE e depois consulte todos os seus dados.
10.Atualize o salrio de SAMANTA para 300000 e consulte a viso
DEP_SAL novamente.
74

11.Desfaa a ltima atualizao realizada.

IV Criao e usa de tabelas

V Gerao de Relatrios
75

V Contedo

1. Formatao de colunas
2. Formatao de ttulos
3. BREAK e COMPUTE
4. Parmetros de controle

76

5. Utilizao de variveis
6. Relatrios avanados

V Gerao de Relatrios

V.1 Formatao de colunas


Os comandos de formatao de colunas (formatao em geral)
COLUMN coluna
do SQL*Plus
so acumulativos
Sintaxe

ALIAS sinnimo
CLEAR
DEFAULT
doFOLD_A[FTER]
comando COLUMN:
FOLD_B[EFORE]
FORMAT formato
HEADING texto
JUSTIFY
LEFT
CENTER
RIGHT
LIKE coluna
NEWLINE
NEW_VALUE var
OLD_VALUE var
NULL nulo
NOPRINT
PRINT
ON
OFF
WRAPPED
WORD_WRAPPERD
TRUNCATED

77

V Gerao de Relatrios
coluna

nome de uma coluna ou expresso especificada no


comando SELECT, tal qual aparece no cabealho do
resultado do comando.

sinnimo

nome de uma outra coluna da qual sero copiadas as


especificaes de formatao

formato

formato de apresentao do contedo de uma coluna

texto

texto a ser apresentado como cabealho de uma


coluna

nulo

texto a ser exibido quando o contedo de uma coluna


for nulo

var

nome de uma varivel (ser explicado adiante)

78

V Gerao de Relatrios

Exemplos de formatos disponveis para o comando COLUMN:


Formato
A20
A5
999.99
999V99
9,999
99999
09999
999
9999MI
9999PR
B999
B999
99.99
DATE
EDATE

Valor
Empregado
Empregado
56.478
56.478
8410
607
607
-5609
-5609
-5609
564
0
124.98
2441453
2441453

Resultado
Empregado
Empre
56.48
5648
8,410
607
00607
-5609
5609<5609>

Observao

brancos
# #.# #
12/23/80
23/12/80

imprime brancos quando zero


estouro
valor = data Juliana

corta o resto
arredonda
alinha pelo V

79

O comando COLUMN, seguido de um nome de coluna (ou


sozinho), exibe as definies daquela coluna (ou de todas as
coluna)
O comando CLEAR COLUMN elimina todas as definies de
uma coluna

V Gerao de Relatrios

Exemplos
SQL > column 12*sal format 999999999.99
SQL > column nome_emp format a20 heading `Empreg.`word_wrap
SQL > column nome_dep like nome_emp heading `Departamento`
SQL > column com heading `comisso | adicional`format 9999-99
SQL > column 12*sal g~heading `salario| anual`
definies acumulativas
SQl > column 12*sal
column
12*sal ON
Pula uma linha
heading
`salario | anual`headsep `|`
format
999999999.99
exibe as definies
SQL > select nome_dep, nome_emp, 12*sal,com
associadas
2 from emp, dep
coluna 12*sal
3 where emp.n_dep = dep.n_dep

Departamento
ADMINISTRAO
ADMINISTRAO
PESQUISA
PESQUISA
PESQUISA
VENDAS
VENDAS
VENDAS

salrio
Empreg.
anual
PAULO
6000000.00
ANA
1440000.00
SAMANTA 1800000.00
UBIRATAN 3600000.00
RENATO
1200000.00
RITA
3960000.00
SILVIO
1800000.00
EVERALDO 2400000.00

comisso
adicional

5000.00
9000.00
3000.00

80

V Gerao de Relatrios

V.2 Formatao de ttulos


possvel definir o cabealho (TTITLE) e o rodap (BTITLE)
das pginas de uma consulta:
-

TTITLE (BTITLE) texto


o define o texto como cabealho (rodap), podendo
conter | para pular linhas
o este formato acrescenta data e numerao de pgina
automaticamente
o s existe para manter compatibilidade com verses
antigas

- TTITLE (BTITLE)
81

o mostra a definies corrente


- TTITLE (BTITLE) OFF
o desabilita a exibio do cabealho (rodap)
- TTIBLE (BTITLE) ON
o habilita a exibio do cabealho (rodap)

V Gerao de Relatrios

- TTITLE (BTITLE) param1 param2 ...

paramN:

texto
&varivel
COLn
SKIPn
LEFT
CENTER
RIGHT
SQL.PNO
SQL.LNO

texto livre que aparecer no cabealho


imprime o valor de uma varivel no cabealho
faz o prximo caracter na coluna n
pula n linhas
alinha o texto seguinte esquerda
centraliza o texto seguinte
alinha direita o texto seguinte
imprime o nmero da pgina corrente
imprime o nmero da linha corrente

82

V Gerao de Relatrios

Exemplo:
SQL > ttitle center `25 de dezemvro de 1990`skip col 6
> `Relatrio de empregados Departamento de Pessoal`
SQL > select n_emp, nome_emp, sal
2 from emp
3 where n_dep = 30;

25 de dezembro de 1990
Relatrio de Empregados Departamento de Pessoal
N_EMP

NOME_EMP

SAL

189
201
208

RITA
EVERALDO
SILVIO

330000
200000
150000

SQL > ttitle


Ttitle on and is the follwing 95 characters:
Center `25 de dezembro de 1990` skip col 6
`Relatrio de Empregados Departamento de Pessoal`

83

V Gerao de Relatrios

V.3 BREAK e COMPUTE


O comando BREAK permite organizar grupos de linhas de um
relatrio
possvel definir aes a serem executadas no fim de cada
grupo controlado pelo comando BREAK:
BREAK ON controle1 ON controle2 ... ON controleN

controleN
grupo
ao

grupo ao repetio
nome de uma coluna, expresso, ROW ou
REPORT
SKIP n, onde n um nmero de linhas a serem
puladas, SKIP PAGE ou PAGE; este parmetro
pode ser omitido
84

repetio

NODUPLICATES (padro) ou DUPLICATES:


controla se os valores de grupo duplicados so
exibidos ou no

V Gerao de Relatrios

Exemplo:
SQL > break on nome_dep page on cargo skip 1
SQL > select nome_dep, cargo, nome_emp
2 from dep, emp
3 where dep.n_dep = emp.n_dep
4 order
by nome_dep, cargo;
NOME_DEP
CARGO
ADMINISTRAO PRESIDENTE

importante ordenar o resultado


de
acordo com os grupos formados!
NOME_EMP

PAULO

SECRETARIA

ANA

NOME_DEP

CARGO

NOME_EMP

PESQUISA

ANALISTA

SAMANTA
REANATO

DIRETOR

UBIRATAN

NOME_DEP

CARGO

NOME_EMP

VENDAS

DIRETOR

RITA

VENDEDOR

SILVIO
EVERALDO

mudana
de pgina

85

V Gerao de Relatrios

Para mostrar as definies correntes:


SQL > brek
break on nome_dep page 1 nodup
on cargo skip 1 nodup

Para eliminar as definies de grupo:


SQL > clear break

86

O comando BREAK no acumulativo co o comando


COLUMN

V Gerao de Relatrios

O comando COMPUTE permite realizar clculos sobre os


valores de um grupo organizado pelo comando BREAK:
SQL > break on n_dep on nome_dep skip 1
N_DEP NOME_DEP
NOME_EP
SQL > compute sum of sal on nome_dep
10
ADMINISTRAO
PAULO
SQL > select dep.n_dep, nome_dep, nome_emp, sal
ANA
2 from dep, emp
****************
3 where dep.n_dep = emp.n_dep
4
oeder by dep.n_dep;
sum
20

PESQUISA

SAMANTA
RENATO
UBIRATAN

***************
sum
30

VENDAS
***************
sum

SAL
500000.00
120000.00
620000.00
150000.00
100000.00
300000.00
550000.00

RITA
EVERALDO
SILVIO

330000.00
200000.00
150000.00
680000.00

87

V Gerao de Relatrios

Sintaxe do comando:
COMPUTE operao1 ... OF operando1 ... ON
evento_break

opearaoN

uma das seguintes operaes: COUNT, SUM, AVG,


MIN, MAX,STD, NUM, VAR

operaoN

coluna, expresso entre aspas ou sinnimo, sobre o


qual as operaes sero efetuadas. Devem ser
especificados no comando SELECT

88

evento_break

especifica o evento que o SQL*Plus ir utilizar como


quebra . Pode ser o nome de uma coluna, expresso
entre aspas, sinnimo, ROW ou REPORT

V Gerao de Relatrios

V.4 Parmetros de controle


O SQL*Plus possui uma srie de parmetros para controle de
formatao.
O comando SET usado para alterar o valor de um parmetro.
O comando SHOW usado para visualizar o valor atual de um
parmetro.

89

SQL > set pagesize 25


SQL > show pagesize
pagesize 25

V Gerao de Relatrios

Os comandos SET e SHOW podem ser aplicados aos seguintes


parmetros:
ARRAYSIZE

n | 20

nmero
de
linhas
recuperadas
simultaneamente do banco de dados

AUTOCOMMIT

ON | OFF

faz com que cada alterao feita na base


de dados seja efetivada imediatamente

BUFFER

buffer | SQL

torna buffer o buffer de edio corrente

CMDSEP

c | `;` | ON | OFF

caractere de separao entre vrios


comandos SQL digitados em uma
mesma linha

90

COMPATIBILITY V5 | V6

fora compatibilidade com o RDMS


ORACLE V5 ou V6

CONCAT

c | `.` | ON | OFF

caractere
de
concatenao
utilizao de variveis

COPYCOMMIT

n|0

tamanho do lote de registros que deve


ser processado pelo comando COPY
antes da execuo de um COMMIT

CRT

crt

define o crt padro para o comando


RUNFORM

DCLSEP

c | `! `

caractere de separao de comandos do


sistema operacional

DEFINE

c | `&` | ON | OFF

caractere que precede a utilizao de


variveis

DOCUMENT

ON | OFF

interpreta ou no o texto dentro do


comando DOCUMENT

ECHO

ON | OFF

exibe ou no os comandos SQL*Plus


quando so executados de um arquivo
de comandos

EMBEDDED

ON | OFF

fora ou no que todo relatrio comece


em uma nova pgina

ESCAPE

c | ON | OFF

caractere de escape para permitir a


insero de caracteres especiais

V Gerao de Relatrios
FEEDBACK
n | 6 | ON | OFF

para

nmero mnimo de linhas que precisam


ser selecionadas para haver impresso
do total de linhas

HEADING

ON | OFF

permite ou no a
cabealho de colunas

impresso

de

HEADSEP

c | `I`| ON | OFF

caractere para pular linha em cabealhos


(formato antigo)

LINESIZE

n | 80

nmero de caractere por linha

LONG

n | 80

nmero
mximo
de
caracteres
visualizados para valores do tipo LONG

91

MAXDATE

tamanho mximo de uma linha que o


SQL*Plus pode processar

NEWPGE

n|1

nmero de linhas brancas a serem


impressas a cada pgina nova (0 indica a
impresso de um pulo de pgina)

NULL

texto

texto a ser exibido quando um valor


nulo

formato

formato padro para exibio de nmero


(formato numrico do comando
COLUMN)

NUMWIDTH

n | 10

largura padro para exibio de nmeros

PAGESIZE

n | 14

nmero de linhas por pgina

PAUSE

texto | ON | OFF

antes de comear cada pgina, exibe o


texto e espera (ou no) que o usurio
tecle ENTER

NUMFORMAT

SCAN

ON | OFF

liga ou desliga p procedimento


substituio de variveis

SHOWMODE

ON | OFF

exibe ou no os valores antigo e atual de


parmetros modificados com o comando
SET

SPACE

n|1

nmero de espao entre colunas

SQLCONTINUE

c | >

caractere exibido quando da continuao


de um comando SQL*Plus

V Gerao de Relatrios
SQLNUMBER

de

ON | OFF

liga ou desliga a numerao de linhas


quando da continuao de comandos
SQL

SQLPREFIX

c | `#`

caractere de prefixo para a execuo de


comandos SQL durante a edio de um
outro comando

SQLPROMPT

texto | SQL>

texto exibido no incio de cada linha de


edio

SQLTERMINATOR c |`;`| ON | OFF caractere que indica o trmino de um


comando SQL

92

SUFFIX

texto | SQL

texto que ser usado como sufixo para


execuo e edio de arquivos

TAB

ON | OFF

permite ou no a utilizao de caracteres


TAB na impresso de brancos

TERMOUT

ON | OFF

permite ou no a exibio de comando


sendo executados

TIME

ON | OFF

exibe ou no a hora antes de cada linha


de edio

TIMING

ON | OFF

exibe ou no estatsticas de tempo para


cada comando executado

TRIMOUT

ON | OFF

inibe ou no impresso de brancos no


final de cada linha

TRUNCATE

ON | OFF

permite ou no o corte de uma linha


se ela for muito grande

UNDERLINE

c|`-`| ON | OFF

caractere que ser utilizado


sublinhas o cabealho de colunas

VERIFY

ON | OFF

exibe ou no comandos SQL antes e


depois da substituio de variveis

WRAP

ON | OFF

para

o inverso do comando TRUNCATE

O comando SHOW ALL mostra o valor de todos ps parmetros


V Gerao de Relatrios

V.5 Utilizao de variveis


O SQL*Plus permite a definio e uso de variveis genricas:

SQL > define v_dep = 20


SQL > define v_nomerel = relatorio de utilidades

93

Para recuperar o valor de uma varivel em uma comando SQL,


deve-se escrever o nome da varivel precedido de `&`:

SQL > define v_dep = 20


SQL > select * from dep
2 where n_dep = &v_dep

V Gerao de Relatrios

O SQL*Plus requisita o valor de uma varivel se esta no tiver


sido previamente definida:
SQL > select * from emp
2 where sal > &limite;
Enter value for limite: 200000
old
2: where sal > &limite
new 2: where sal > 200000

N_EMP
110
175
189

NOME_EMP
UBIRATAN
PAULO
RITA

94

aps a utilizao de uma varivel no previamente definida,


seu valor (fornecido pelo usurio) descartado

SQL > select nome_emp, sal


2 from emp
3 where n_dep = &&v_dep
Enter
value for
30
V Gerao
de v_dep:
Relatrios
old
3: where n_dep = &&v_dep
new 3: where n_dep = 30

Para
NOME_EMP

manter SAL
o valor fornecido pelo usurio para futuras
utilizaes, deve-se
330000 substituir o `&`por `&&`:

RITA
EVERALDO
SILVIO

200000
150000

SQL > run


1 select nome_emp, sal
2 from emp
3 where n_dep = &&v_dep
old
3: where n_dep = &&v_dep
new 3: where n_dep = 30
NOME_EMP

SAL

RITA
EVERALDO
SILVIO

330000
200000
150000

interao para ler


o
valor da varivel

No h interao: a
varivel
Est permanentemente

95

V Gerao de Relatrios

O comando ACCEPT possibilita iniciar variveis valores


fornecidos pelo usurio:
SQL > accept v_dep NUMBER PROMPT `Departamento: `
Departamento: 30
SQL > select nome_emp, sal
2 from emp
especifica o tipo da varivel;
3 where n_dep = &v_dep;
podendo
oldo 3: where n_emp = &v_dep
ser NUMBER ou CHAR
new 3: where n_emp = 30
NOME_EMP

SAL

RITA
EVERALDO
SILVIO

330000
200000
150000

96

O comando PROMPT permite exibir informaes na tela:


SQL > prompt Relatorio de Empregados
Relatrios de Empregados
SQL >

V Gerao de Relatrios

Pode-se tambm especificar parmentros para a ativao de um


arquivo de comandos SQL*Plus atravs do comando START:
SQL > start listaemp 10 100000

nome do
arquivo
de comandos

Parmetros posicionais

97

Onde o arquivo LISTAEMP.SQL contm os seguintes


comandos:

rem O primeiro parametro determina o departamento onde os


rem empregados selecionados trabalham
rem O segundo parametro determina o menor salrio que os
rem empregados selecionados recebem.
select n_emp, nome_emp
from emp
linhas de comando
where n_emp = & 1 and
primeiro e
sal > = &2;
segundo
parmetro

V Gerao de Relatrios

V.6 Relatrios avanados


Os relatrios produzidos at aqui foram sempre apresentados
na tela; possvel imprimi-los e armazena-los em arquivo do
sistema operacional:

inicia armazenamento do
resultado
no arquivo relat1.lst

98

SQL > apool relat1


SQL > start listaemp 10 100000
SQL > rem O primeiro parametro determina o departamento onde os
SQL > rem empregados selecionados trabalham
SQL > rem O segundo parmetro determina o salrio minino que os
SQL > rem empregados selecionados recebem.
SQL > select n_emp, nome_emp
2 from emp
3 where n_dep = &1 and
4 sal > = &2;
old
3: where n_dep = &1 and
new 3: where n_deo = 10 and
old
4: sal > = &2;
new 4: sal > = 100000;
N_EMP
175
230

NOME_EMP
PAULO
ANA

2 records selected.

termina o armazenamento e
imprime o resultado

SQL > spool out

V Gerao de Relatrios

Se o comando SPOOL OUT for substitudo por SPOOL OFF, o


arquivo de sada no ser impresso.
SQL > set echo off
> Para
evitar
que os prprios
SQL
set verify
off
SQL > SQL*Plus
set feedback off
sejam enviadas para
SQL > relatrio.
spool relat1
SQL > start listaemp 10 10000
N_EMP
175
230
SQL > spool out

comandos e mensagens do
o arquivo juntamente com o

NOME_EMP
PAULO
ANA

99

V Gerao de Relatrios

No caso do comando COMPUTE, para eliminar os textos sum


e ****** que aparecem como indicadores do clculo
executado:
SQL > collumn aux_dep noprint
SQL > column sal format $999,999,999.99
SQL > break on n_dep on nome_dep on aux_dep skip1
SQL > compute sum of sal on aux_dep
SQL > select dep.n_dep aux_dep, dep.n_dep, nome_dep,
2
nome_emp, sal
3
from dep, emp
4 where dep.n_dep = emp.n_dep
5 order by dep.n_dep;

100

N_EMP

NOME_DEP

NOME_EMP

10

ADMINISTRAP PAULO
ANA

SAL
$500,000.00
$120,000.00
$620,000.00

20

PESQUISA

SAMANTA
RENATO
UBIRATAN

$150,000.00
$100,000.00
$300,000.00
$550,000.00

30

VENDAS

RITA
EVERALDO
SILVIO

$330,000.00
$200,000.00
$150,000.00
$680,000.00

V Gerao de Relatrios

As opes NEW_VALUE E OLD_VALUE do comando


COLUMN podem ser utilizadas para recuperar dados em uma
consulta
e us-los em uma outra consulta:
SUM
1850000
SQL > set echo off
SQL > set verify off
SQLNOME_EMP
> set feedback off
SAL
PORCENT
SQL > column PROCENT format 999.99
PAULO
500000
27.03
SQL > column sum(sal) new_value soma
RITA
330000
17.84
SQL > rem calcula o valor de soma
UBIRATAN
300000
16.22
SQL > select sum(sal) from emp;
EVERALDO
200000
10.81
SQL > rem calcula porcentagens dos salarios utilizando soma
SAMANTA
150000
8.11
SQL > select nome_emp, sal, 100 * sal / &soma PORCENT
SILVIO
150000
8.11
2 from emp
ANA
120000
6.49a terceira expresso do
Indica
3 order by 3 desc;
RENATO
100000
5.41 SELECT

101

23/11/90
Relatorio de Empregados
Departamento: VENDAS

Pg.

V Gerao de Relatrios
Num

Nome Empregado

Salrio

Comisso

208
SILVIO
$150,000.00
$9,000.00
189
RITA
$330,000.00
$5,000.00
vamos
agora
considerar
o
seguinte
relatrio:
201
EVERALDO
$200,000.00
$5,000.00
data de hoje

Porc.
5.66
1.49
1.48

nmero da pgina

102
Departamento: VENDAS

departamento dos empregados


apresentados nesta pgina

V Gerao de Relatrios

Para produzir o relatrio da pgina anterior, deve-se acompanhar


os seguintes passos:
1. Definir a consulta a ser realizada:
select nome_dep, n_emp, nome_emp, sal, nvl(com, 0) comisso,
(nvl( com, 0 ) / ( sal + nvl( com, 0) ) * 100) procnt_com,
to_char( sysdate, `DD/MM/YY` ) data
from dep, emp
where dep.n_dep = emp.n_dep
order bu nome_dep, 6 desc;

103

2. Definir os formatos das colunas


column n_emp format 9999 heading `Num`
column nome_emp format A 15 heading `Nome Empregado`
column sal format $999,999,999.99 heading `Salario`
column comissao format $999,999,999.99 heding `Comissao`
column porcent_com format 99.99 heading `Porc.`
column data format A8

3. Definir o agrupamento por departamento:


break on nome_dep skip page

4. Definir duas variveis que armazenaro o valor novo e o


antigo da coluna NOME_DEP durante a quebra do grupo:
column nome_dep old_value vardep_ant new_value vardep_novo

V Gerao de Relatrios

5. Definir uma varive para armazenar a data sendo recuperado


pela consulta:
column data new_value varhoje

6. Esconde as colunas NOME_DEP e DATA:


column nome_dep noprint
column data noprint

104

7. Definir os ttulos:
ttitle left varhoje center `Relatorio de Empregados` right `Pag. `sql.pno skip 1
left `Departamento: `vardep_novo skip 2
btitle left `Departamento: `vardep_ant

8. Definir o tamanho da pgina:


set pagasize 20
set linesize 75
set newpage 0

9. Em caso de erro, interromper o processamento do SQL*Plus


retornando o cdigo do erro:
Wherenever sqlerror exit SQL.SQLCODE;

set echo off


set pagasize 20
set linesize 75
set newpage 0
whenever sqlerror exit sql.sqlcode;
n_emp
A 15 heading `Nome empregado`
Vcolumn
Gerao
de format
Relatrios
column sal format $999,999,999.99 heading `Salario`
column comissao format $999,999,999.99 heading `Comissao`
column porcent_com format 9.99 heading `Porc.`
column data format A8
Os
comandos
necessrios gerao do relatrio
break
on nome_dep
skip page
column
nome_dep old_value
vardep_ant
new_value vardep_novo
especificado
poderiam
(ou deveriam)
estar armazenadas
column data new_value varhoje noprint
arquivo do sistema operacional, RELATORIO.SQL:
column nome_dep noprint
ttitle left varhoje center `Relatorio de Empregados` righe `Pag.`sql.pno skip 1 left `Departamento: `vardep_novo skip 2
btitle left `Departamento: `vardep_ant
spool relatorio
select nome_dep, n_emp, sal, nvl(com,0) comisso,
(nvl(com, 0) / (sal + nvl(com,0) ) * 100) porcent_com,
to_char( sysdate, `DD/MM/YY` ) data
from dep, emp where dep.n_dep = emp.n_dep
order by nome_dep, 6 desc;
spool out

sendo
em um

105

V Gerao de Relatrios

Dessa forma, o comando:


$ sqlplus s ora 1/senha1 @relatorio

106

- teria como efeito gerar o relatrio na impressora do


sistema

V Gerao de Relatrios

V - Exerccios
1. Recupere o comando contido no arquivo ex31.sql e formate
seu resultado da seguinte forma:
a) mude o cabealho da coluna que indica o salrio por hora
para Sal/hora
107

b) coloque um titulo centralizado indicando Salrio por hora


dos Empregados
c) mude o formato da coluna Sal/hora para um nmero
com quatro casas inteiras e duas decimais.
d) Alinhe o cabealho da coluna CARGO pela direita
e) Verifique as definies de coluna existentes

Relatorio de Empregados
Departamento
ADMINISTRAO

Nome
PAULO
ANA

Cargo
PRESIDENTE
SECRETARIA

Salrio
500000
120000

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

310000
620000

V Gerao de Relatrios
PESQUISA

2. Faa um arquivo
**************

SAMANTA ANALISTA
UBIRATAN DIRETOR
RENATO
ANALISTA

150000
300000
100000

de comando SQL*Plus chamado ex52.sql de


forma que sua execuo exiba o seguinte resultado:

avg
sum
VENDAS

183333.333
550000
RITA
DIRETOR
SILVIO
VENDEDOR
EVERALDO VENDEDOR

330000
150000
200000

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

226666.667
680000

108

Dica: comece fazendo a consulta; depois, acrescenta as definies da


coluna, comandos BREAK e COMPUTE; finalmente, ajuste o
tamanho da pgina e o tamanho da linha com o co,mando SET.

V Gerao de Relatrios

3. Altere o arquivo ex52.sql de forma que:


a) O menor salrio a ser considerado na consulta seja
passado como parmetro (veja pgina 99)
b) O maior salrio a ser considerado na consulta seja entrado
pelo usurio atravs de um comando ACCEPT
109

c) Somente o resultado da consulta seja armazenado no


arquivo ex.53.lst
d) Desapaream os textos sum, avg e *********
exibidos pelo SQL`Plus (veja pgina 102)

V Gerao de Relatrios

110

VI Expresses e funes

111

VI - Contedo

1. Operadores
2. Funes numricas
3. Funes de caracteres
4. Funes de grupo
5. Converso entre tipos
6. Funes de datas
7. Outras funes

VI Expresses e funes
112

VI.1 - Operadores

Operadores de valor:
+,*,/
+,||

indicador de sinal
multiplicao e diviso
soma e subtrao
concatena strings

WHERE X = -1
SELECT 2 * X...
SELECT X + Y...
SELECT

`EMPREGADO`|

NOME_EMP

Operadores lgicos
=

teste igualdade
! =, < >, ^ = testa desigualdade
>, > =
testa maior (ou igual)
<, < =
testa menor (ou igual)

WHERE SAL = 100000


WHERE SAL ! = 100000
WHERE SAL > 100000
WHERE SAL < = 100000

113

VI Expresses e funes
[NOT] IN

teste de incluso ou CARGO IN (`ANALISTA`, VENDEDOR`)


excluso um conjunto

[NOT]
BETWEEN
AND

teste de intervalo

SAL BETWEEN 10000 AND 200000

[ NOT ] LIKE

testa casamento de
padro

WHERE NOME_EMP LIKE `_X%`

IS [ NOT ]
NULL

testa valor nulo

WHERE COM IS NULL

NOT

inverte resusltado
lgico de expresses

WHERE NOR ( SAL = 100000 )

AND

operao lgica e

WHERE SAL < 100000 AND CARGO =


`ANALISTA`

OR

operao lgica ou

WHERE COM IS NULL OR SAL > 100000

ANY

deve casar com


WHERE SAL = ANY (SELECT SAL
qualquer dos valores FROM EMP WHERE N_DEP = 30)
retornados por uma
lista ou consulta

ALL

deve casar com todos WHERE (SAL,COM) > = ALL (


os valores retornados (150000. 30000), (2000000, 0) )
por uma lista ou
consulta

114

VI Expresses e funes

VI.2 Funes numricas


Em geral, funes podem ser usadas em qualquer lugar onde
variveis ou expresses do mesmo tipo so usadas.
Legenda para as prximas tabelas:
- T : tipo retornado pela funo:
o `C`indica caractere
o `D`indica data
o `N`indica nmero
o `R`indica Rowld
o `W`indica raw
- Argumentos para funes:
o `*` : tipo depende do contexto da funo
o m, n : expresses numricas
o c, c1, c2, conj_c, de_c, para_c: expresses que retornam
cadeias de caracteres
o d, d1: expresses que retorna datas
o expr, caso, ret, ret_outro: expresses de qualquer tipo

115

VI Expresses e funes

Funes numricas:
T funo

Descrio/Exemplo

N ABS(n)

valor absoluto de n
ABS(-5) = 5

N CEIL(n)

arredonda para cima


CEIL(5.1) = 6
CEIL(5) = 5

N FOOR(n)

arredonda para baixo


CEIL(5.1) = 5
CEIL(5) = 5

N MOD(m, n)

resto da diviso de m por n


MOD(5,2) = 1

N POWER(m,n)

m elevado a n; n deve ser inteiro


POWER(2,3) = 8

N ROUND(m,[n])

arredonda m para n casas decimais


ROUND(2.3456) = 2.35
ROUND(1989, -3) = 2000

N SIGN(n)

sinal de n
SIGN(-2) = -1
SIGN(0) = 0
SIGN(2) = 1

N SQRT(n)

raiz quadrada de n
SQRT(4) = 2
SQRT(-4) = NULL

N TRUNC(n,[m])

trunca n para m casas decimais


TRUNC(2.3456,2) = 2.34
TRUNC(1989, -3) = 1000

116

VI Expresses e funes

VI.3 Funes de caracteres


T NOME
N ASCII(c)

Descrio/Exemplo
cdigo ASCII do primeiro caractere de
c
ASCII( `gua`) = 65

C CHR(n)

caractere de cdigo ASCII igual a n


CHR(65) = `A`

C INITCAP(c)

retorna c com o primeiro caractere de


cada palavra em maiscula
INITCAP( `SAO PAULO`) = `Sao Paulo`

N INSTR(c1, c2[,m[, n]]) a posio da n-sima ocorrncia de c2

em c1, iniciando a busca na posio m.


O valor 1 assumido para m e n em
caso de omisso
INSTR( `SAO PAULO`, `A`, 1, 2) = 6
N LENGTH(c)

nmero de caracteres em c
LENGTH( `SAO PAULO`) = 9

C LOWER(c)

converte todos os caracteres de c para


minsculas
LOWER( `SAO PAULO` ) = `so paulo`

C LPAD(c1, n[, c2])concatena c2 esquerda de c1, o suficiente

para que c1 atinja o tamanho n.


O caractere `` assumido caso c2 seja
omitido
LPAD( `SP`, 5, `-`) = `-SP`

117

VI Expresses e funes
C LTRIM(c, conj_c)

remove todos os caracteres de c at o


primeiro caractere que no estiver presente
em conj_c
LTRIM(`AGUA`, `AG`) = `UA`

N NLSSORT(c)

valor de c na linguagem nacional


(National Language).
NLSSORT(`Q`) = 5100

C REPLACE(c, de_c
para_c])

troca todas as ocorrncias de de_c em c


para c
R E P L A C E( `X U XU`, `X`, `C H`) =
`CHUCHU`

C RPAD

concatena c2 direita de c1, o suficiente


para que c1 atinja o tamanho n.
O caractere `` assumido caso c2 seja
omitido.
RPAD(`SP`, 5, `-`) = `SP-`

C RTRIM(c, conj_c)

remove todos os caracteres de c, a partir do


ltimo, at encontrar o primeiro caractere
que no estiver presente em conj_c
RTRIM(`AGUA`, `UA`) = `AG`

C SOUNDEX(c)

uma cadeia de caracteres que representa o


som das palavras em c
SOUNDEX( `SAO PAULO`) = `S140`

C SUBSTR(c, m[, n])

a subseqncia de c com incio na posio


m com n caracteres. Caso n seja omitido,
retorna da posio m at o fim
SUBSTR(`So Paulo`, 5 ) = `Paulo`

118

VI Expresses e funes
C TRANSLATE(c,
de_c, para_c)

traduz c e substitui todos caracteres de c


existentes em de_c para o
correspondente em para_c
TRANSLATE( `AGUA`, `AEIO`, `12345`)
= `1G51`

C UPPER(c)

converte todos os caracteres de c_para


maisculas
UPPER( `Sao Paulo`) = `SAO PAULO`

C USERENV(c)

c pode assumir os seguintes valores:


`ENTRYID` = novo identificador para o
propsito de auditoria
`SESSIONID`= identificador da sesso de
auditoria
`TERMINAL` = identificador do terminal
`LANGUAGE`= lngua em uso

119

VI Expresses e funes

VI.4 Funes de grupo


T Nome

Descrio

N AVG([distinct | all] n)

media de n; ignora valores nulos

N COUNT([distinct | all]
expr | *)

nmero de linhas para as quais

N MAX([distinct | all] expr)

maior valor de expr

N MIN([distinct | all] expr)

menor valor de expr

N STDDEV([distinct | all] n)

desvio padro de n; ignora valores


nulos

N SUM([distinct | all] n)

soma dos valores de n

N VARIANCE([distinct|all] n)

varincia de n; ignora valores nulos

expr no nulo. * faz contar todas as


linhas selecionadas

120

VI Expresses e funes

VI.5 Converso entre tipos


T Nome

Descrio

C CHARTOROWID(char)

converte char para um rowid

W HEXTORAW(char)

converte char contendo dgitos


hexadecimais para um valor binrio,
conveniente para ser inserido em uma
coluna do tipo RAW

C RAWTOHEX(raw)

converte raw para a


caracteres
contendo
hexadecimais

C ROWIDTOCHAR(rowid)

converte um rowid para uma cadeia


de 18 caracteres

C TO_CHAR(n[,fmt]) ou
TO_CHAR(d[,fmt])

converte o nmero n ou a data d para


uma cadeia de caracteres, de acordo
com o formato fmt

D TO_DATE(char[,fmt])

converte char para uma data, de


acordo com o formato fmt

N TO_DATE(n[,fmt])

converte char para uma data, de


acordo com o formato fmt; este
formato deve corresponder a um
nmero (J, MM etc.)

N TO_NUMBER(char)

converte char para um nmero; char


deve conter um nmero vlido

cadeia e
nmeros

121

VI Expresses e funes

Converso automtica de tipos:


- 123 > `39` = 132 > to_number(`39`)
- `39` > 123 = `39` < to_char(123)
- `39` + 123 = to_number(`39`) + 123
- 123 | | `39` = to_char(123) | | `39`

Se uma operao pode ser usada com vrios tipos de dados, o


tipo do primeiro operando determina o tipo dominante:
- 123 > `39`

Se uma operao s pode ser usada com um tipo de dados,


esse fica sendo o tipo dominante:
- `39` + 123

122

VI Expresses e funes

a tabela a seguir mostra os principais formatos de datas


existentes (parmetro fmt utilizado nas funes de converso)
aplicados data 13:07:10 de 16/01/91
formato

resultado

descrio

SCC ou CC

20

sculo

SYYYY ou YYYY

1991

ano

YYY, YY e Y

991, 91 e 1

ltimos 3, 2 e 1 dgitos do ano

SYEAR ou YEAR

nineteen-ninety-one ano por extenso

MM

01

ms

MON

jan

nome do ms abreviado

MONTH

january

nome do ms

WW e W

03, 3

semana do ano e do ms

DDD, DD e D

016, 16, 4

dias do ano, ms e semana

DAY

wednesday

nome do dia

2448273

data Juliana

HH ou HH12

01

hora do dia (1-12)

HH24

13

hora do dia (0-23)

MI

07

minutos

SS

10

segundos

SSSSS

42730

segundos aps a meia-noite


(0-83399)

Month, YYYY

January , 1991

os tamanhos so fixos

FmMonth, YYYY

January, 1991

os tamanhos so variveis
(fill-mode)

- OBS: qualquer combinao dos formatos acima pode ser


feita para formar o parmetro fmt (EX: `HH24:MI:SSDD/MON/YYYY`)

123

VI Expresses e funes

VI.6 Funes de datas


T Nome

Descrio

D ADD_MONTHS(d,n)

adiciona n meses data d


ADD_MONTHS( `13-AUG-91`8) =
13-APR-92

D LAST_DAY(d)

data do ltimo dia do ms da data d


LAST_DAY( `13-FEB-92`) =
29-FEB-92

N MONTHS_BEETWEEN(d,e)

o nmero de meses existentes antes


as datas d e e
MONTHS_BETWEEN( sysdate,
`01-JAN-80`) = 133.466529

D NEXT_DAY(d, char)

devolve o primeiro dia da semana


determinado por char (MONDAY,
FRIDY etc.) com data igual ou maior
que d
NEXT_DAY(`13-FEB-91 `,` MONDAY`)
= 18-FEB-91

N TRUNC(d [, fmt])

devolve a data d truncada para o


formato fmt. Se fmt no for
especificado, devolve a data d sem as
horas
TRUNC( to_date(`13-JAN-91 11:34`,
`DD-MONY-YY HH:MI`) ) = 13-JAN-91

N ROUND( d, fmt)

devolve a data d arredondada para o


formato fmt
ROUBD( to_date(`13-jan-91`), `YEAR`)
= 01-JAN-91

124

VI Expresses e funes

VI.7 Outras funes


T Nome

Descrio

* DECODE(expr, s1, r1,


...[padro])

se expr for igual a algum s, ento


devolve o r seguinte; caso contrrio
devolve padro. Caso padro seja
omitido e no haja casamento o
valor NULL retornado

* DUMP(expr[, tipo[,
posinic[, bytes]]])

mostra o valor de uma expresso no


formato interno do Oracle

* GREATEST(expr1, expr2,...)

devolve o maior valor da lista expr1,


expr2, ...

* LEAST(expr1, expr2,...)

devolve o menor valor da lista expr1,


expr2, ...

* NVL(x, expr)

caso x seja nulo, devolva expr; caso


contrrio devolve x.

N VSIZE(expr)

devolve o nmero de bytes de expr


na representao interne do Oracle

Para reduzir as faixas salariais a apenas 3 patamares, 1 para


as atuais A e B, 2 para C e D, e 3 para a faixa E
SQL > select nome_emp, cargo, sal,
2 decode( faixa, `A`, 1, `B`, 1, `C`, 2, `D`, 2, 3 ) NOVA FAIXA
3 from emp, faixa_sal
4 where emp.sal between salmin and salmax
5 order by 5;

125

VI Expresses e funes

VI - Exerccios
1. Consulte o nome e o cargo dos empregados da tabela EMP que

foram contratados entre 01/02/85 e 27/12/85 e que so


comissionados.
2. Descubra os seus identificadores de sesso e terminal.
3. Calcule o desvio padro (DesvPadr) e a mdia (Media) dos

salrios do presidente e diretores presentes na tabela EMP.


4. Faa uma consulta na tabela ALUNO que retorna o nome e a

data de aniversrio dos alunos cadastrados nos formatos


DD/MM (data1) e DD-MON (data2).
5. Faa uma consulta que devolva o nmero de meses completos
existentes entre as datas de admisso do empregado mais novo e dos
mais antigo constantes na tabela EMP.
6. Consulte o nmero, nome, cargo e total de recebimentos (Totreceb),
ou seja, salrio mais comisso, dos empregados da tabela EMP.
7. Faa uma consulta na tabela EMP que retorne o nome e a categoria
do empregado. A categoria do empregado tem valor 1 para
secretrias, 2 para vendedores, 3 para analistas e 4 para outros
cargos.
8. Faa uma consulta na tabela EMP que devolva o nome e o salrio
ideal (Salideal). O salrio ideal o maior valor entre o salrio atual e
a mdia dos salrios do departamento onde o empregado trabalho
(Dica: use a viso DEP_SAL criada no exerccio IV.8).
9. Faa um consulta que retorne somente a primeira letra dos nomes de
todos os empregados, ordenados por data de admisso.

126

VI Expresses e funes

VII Consultas avanadas

127

VII - Contedo

1. Pseudo-colunas

2. Juno externa

3. Auto-Juno

4. Consultas encaixadas

5. Consultas hierrquicas

128

VII Consultas avanadas

VII.1 Pseudo-colunas
Pseudo-colunas so colunas que podem ser consultadas em
qualquer tabela, como uma coluna normal, mas no podem
ser alteradas:
T Nome

Descrio

N nome_seq.CURVAL

valor corrente da seqncia nome_seq

N nome_seq.NEXTVAL

prximo valor da seqncia nome_seq

N LEVEL

usada na comando SELECT ...


CONNECT BY (explicado na seo
VII.5); igual a 1 para o n raiz de uma
rvore, 2 para seus filhos e assim por
diante

_ NULL

valor nulo

R ROWID

identificao interna de uma linha

N ROWNUM

nmero que indica a ordem de seqncia


da linha selecionada em uma consulta

D SYSDATE

data e hora correntes

N UID

nmero que identifica unicamente o


usurio corrente

C USER

nome do usurio corrente

SQL > select sysdate, user, rowid


2 from dual;

SYSDATE
07-JAN-91

USER
CURSO

tabela com uma nica linha


e
uma nica coluna

ROWID
00000984.0001.0001
129

VII Consultas avanadas

VII.2 Juno externa


Para listar o nome de todos departamentos e seus respectivos
empregados:
SQL > select dep.n_dep, nome_dep, n_emp, nome_emp
2 from dep, emp
3 where dep.n_dep = emp.n_dep;

N_DEP
10
10
20
20
20
30
30
30

NOME_DEP
ADMINISTRAO
ADMINISTRAO
PESQUISA
PESQUISA
PESQUISA
VENDAS
VENDAS
VENDAS

N_EMP NOME_EMP
175
230
103
110
276
189
208
201

PAULO
ANA
SAMANTA
UBIRATAN
RENATO
RITA
SILVIO
EVERALDO

PROBLEMA: Departamento 40 no aparece,


Pois no tem empregados

130

VII Consultas avanadas

NOME_EMP

NOME_DEP

EMP.N_DEP

DEP.N_DEP

SAMANTA
UBIRATAN

ADMINISTRAO
ADMINISTRAO

20
20

10
10

UBIRATAN

ADMINISTRAO

20

10

PAULO

ADMINISTRAO

10

10

RITA

ADMINISTRAO

30

10

EVERALDO

ADMINISTRAO

30

10

SILVIO

ADMINISTRAO

30

10

ANA

ADMINISTRAO

10

10

RENATO

ADMINISTRAO

20

10

SAMANTA

PESQUISA

20

20

UBIRATAN

PESQUISA

20

20

PAULO

PESQUISA

10

20

RITA

PESQUISA

30

20

EVERALTO

PESQUISA

30

20

SILVIO

PESQUISA

30

20

ANA

PESQUISA

10

20

RENATO

PESQUISA

20

20

SAMANTA

VENDAS

20

30

UBIRATAN

VENDAS

20

30

PAULO

VENDAS

10

30

RITA

VENDAS

30

30

EVERALDO

VENDAS

30

30

SILVIO

VENDAS

30

30

ANA

VENDAS

10

30

RENATO

VENDAS

20

30

SAMANATA

PRODUO

10

40

PAULO

PRODUO

10

40

RITA

PRODUO

30

40

EVERALDO

PRODUO

30

40

SILVIO

PRODUO

30

40

ANA

PRODUO

10

40

RENATO

PRODUO

20

40

no existem empregados no
departamento
40

131

VII Consultas avanadas

Soluo: fazer de conta que existe uma linha fictcia,


totalmente nula, na tabela de empregados, para que ela seja
associada linha do departamento 40 (juno externa):
SQL > select dep.n_dep, nome_dep, n_emp, nome_emp
2 from dep, emp
3 where dep.n_dep = emp.n_dep ( + );

N_DEP
10
10
20
20
20
30
30
30
40

NOME_DEP
ADMINISTRAO
ADMINISTRAO
PESQUISA
PESQUISA
PESQUISA
VENDAS
VENDAS
VENDAS
PRODUAO

operador especial
para juno externa

N_EMP NOME_EMP
175
230
103
110
276
189
208
201

PAULO
ANA
SAMANTA
UBIRATAN
RENATO
RITA
SILVIO
EVERALDO

Para saber os departamentos sem empregados:


SQL > selct distinct dep.n_dep, nome_dep, local_dep
2 from dpe, emp
3 where dep.n_dep = emp.n_dep ( + ) and n_emp is null;

N_DEP
40

NOME_DEP
PRODUO

LOCAL_DEP
SO BERNARDO

132

VII Consultas avanadas

VII.3 Auto-Juno

As tabelas envolvidas numa juno no precisam ser distintas

Para descobrir quais gerentes esto ganhando menos que o


dobro do salrio de algum de seus subordinados:
pseudnimos para as tabelas

SQL > select ger.nome_emp gerente, ger.sal, max(2*trab.sal )


2 from emp trab, emp ger
3 where trab.chefe = ger.n_emp
4 group by ger.nome_emp, ger.sal
5 having max(2*trab.sal) > ger.sal;

GERENTE
RITA
PAULA

SAL
330000
500000

MAX(2*TRAB.SAL)
400000
660000

133

VII Consultas avanadas

VII.4 Consultas encaixadas


Uma consulta SQL pode fazer parte da condio da clusula
WHERE de outro comando SQL
Para saber quais empregados ganham mais que a mdia dos
salrios:

SQL > select n_emp, nome_emp, sal


2 from emp
3 where sal > (select avg(sal) from emp);

parnteses
delimitam a
sub-consulta

o resultado dessa subconsulta


um nico valor

Para saber os departamentos que no tem empregados:


operador de
excluso
de conjunto

SQL > select n_dep, nome_dep


elimina os valores
2 from dep
duplicados
3 where n_dep not in (select distinct n_dep from emp);

N_DEP
40

NOME_DEP
PRODUAO

esta sub-consulta retorna


um conjunto de valores

134

VII Consultas avanadas

Uma sub-consulta pode fazer referencias a colunas do comando


no qual est encaixada
Para recuperar os empregados que ganham mais que a mdia de
salrio do sei departamento:
SQL > select n_dep, nome_emp, sal
2 from emp x
3 where sal > ( select avg(sal) from emp y
4
where x.n_dep = y.n_dep
5 order by n_dep;

N_DEP
10
20
30

NOME_DEP
PAULO
UBIRATAN
RITA

nesse caso necessrio o


pseudnimo para a tabela

SAL
500000
300000
330000

135

VII Consultas avanadas

Os operadores IN, NOT IN, ANY e ALL tambm podem ser


usados para sub-consultas:
SQL > select nome_emp, sal, cargo, n_dep
2 from emp
3 where sal < all ( select sal from emp
4
where n_dep = 20);

Para saber se o resultado de uma sub-consulta vazio ou no


(equivalente ao IS NOT NULL para colunas):

SQL > select nome_emp, cargo, n_dep


2 from emp x
3 where exists ( select `x` from emp y
4
where x.n_emp = y.chefe )

s importa se uma
linha
existe ou no!

136

VII Consultas avanadas

Consultas encaixadas podem ser combinadas de diversas formas

Para saber todos os empregados que ganham mais que o


empregado mais antigo do departamento, somente para
departamento com trs ou mais empregados:
SQL > select nome_emp, sal
2 from emp e1
3
where sal > (select sal from emp e2
4
where e2.n_dep = e1.n_dep and
5
data_adm = (
6
select min(data_adm)
7
from emp
8
where n_dep = e2.n_dep))
9
and exists (select `x` from emp
10
where n_dep = e1.n_dep
11
having count(*) > = 3);

137

VII Consultas avanadas

Sub-consultas tambm podem ser usadas nos comandos de


manipulao de dados (I,U,D)
Para eliminar os empregados mais novos de cada departamento:
SQL > delete from emp e
2 where data_adm = (select max(data_adm) from emp
3
where n_dep = e.n_dep);

Para que todos empregados mais novos de cada cargo ganhem o


melhor salrio e a media das comisses de seu cargo:
SQL > update emp e
2 set (sal,com) = (select Max(sal), avg(com) from emp
3
where cargo = e.cargo)
4 where date_adm = (select max(data_adm) from emp
5
where cargo = e.cargo);

138

VII Consultas avanadas

VII.5 Consultas hierrquicas


O Oracle permite recuperar informaes estruturas de forma
hierrquica (em arvore):
175 / PRESIDENTE

110 / DIRETOR

103 / ANALISTA

N_EMP
103
110
175
189
201
208
230
276

230 / SECRETARIA

276 / ANALISTA

NOME_EMP
SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

189 / DIRETOR

201 / VENDEDOR

CARGO
ANALISTA
DIRETOR
PRESIDENTE
DIRETOR
VENDEDOR
VENDEDOR
SECRETARIA
ANALISTA

208 / VENDEDOR

CHEFE
110
175
175
189
189
175
110

139

VII Consultas avanadas

Para saber todos os superiores de Everaldo:


SQL > select n_emp, nome_emp, cargo
2 from emp
3 where nome_emp < > `EVERALDO`
4 connect by n_emp = prior cheve
5 start with nome_emp = `EVERALDO`

indica o comeo
da
consulta

especifica a conexo da

N_EMP
189
175

indica o sentido da
consulta:
do empregado para o chefe

NOME_EMP
RITA
PAULO

CARGO
DIRETOR
PRESIDENTE

Para saber o nome do Presidente e de seus subordinados, exceto


aqueles que tambm subordinados de UBIRATAN:
SQL > select n_emp, nome_emp, cargo
2 from emp
3 connect by prior n_emp = chefe and chefe < > 110
4 start with cargo = `PRESIDENTE`;

N_EMP NOME_EMP
175
PAULO
110
UBIRATAN
189
RITA
201
EVERALDO
208
SILVIO
230
ANA

CARGO
PRESIDENTE
DIRETOR
DIRETOR
VENDEDOR
VENDEDOR
SECRETARIA

elimina toda
uma
sub-rvore

140

VII Consultas avanadas

Podemos usar a pseudo-coluna LEVEL para saber o nvel de


cada registro na hierarquia:
SQL > select level, Ipad( ` `, 2*level ) | | nome_emp nome
2 from emp
3 connect by prior n_emp = chefe
4 start with cargo = `PRESIDENTE`;

LEVEL
1
2
3
3
2
3
3
2

NOME
PAULO
UBIRATAN
SAMANTA
RENATO
RITA
EVERALDO
SILVIO
ANA

141

VII Consultas avanadas

VII - Exerccios
1. Consulte seu identificador e nome no sistema, bem como a data
e hora correntes no formato que voc achar mais usualmente
utilizado (ex. 02:50-11/01/91).
2. Consulte o nome dos chefes (NOME_CHEFE) dos funcionrios
(NOME_FUNC)
da
tabela
EMP,
ordenados
por
NOME_CHEFE. Caso algum funcionrio no possua chefe,
mostre a cadeia de caracteres `________`em NOME_CHEFE.
3. Consulte os nomes, salrios e cidades onde trabalham os
empregados que esto na mesma faixa de salrio que
UBIRATAN. Dica: construa antes as seguintes consultas: nome,
salrio e cidade de todos empregados; nome, salrio, cidade e
faixa salarial de todos empregados; e faixa salarial de
UBIRATAN.
4. Aumente o salrio em 20% para os empregados que sejam os
mais antigos de seus departamentos.
5. Remova os empregados que recebem mais que a mdia dos
salrios de seus cargos.
6. Desfaa as duas operaes anteriores.

142

VII Consultas avanadas

VIII Tpicos avanados

143

VIII - Contedo

1. Manuteno de usurios
2. Privilgios de acesso a tabelas
3. Acesso concorrentes a tabelas
4. Criao e uso de ndices
5. Criao e uso de clusters
6. Dicionrio de estruturas de dados

144

VIII Tpicos avanados

VIII.1- Manuteno de usurios

Para criar um novo usurio Oracle:


GRANT privilgio, ... TO usurio, ...
IDENTIFIED BY senha, ...

privilgio

uma das seguintes permisses:

>CONNECT

permite conexo ao ORACLE

>RESOURCE

permite criao de tabelas, vises, ndices,

etc.
>DBA

permite
executar
operaes
privilegiadas, como criar novos usurios

usurio

nome (identificao) do usurio

senha

senha do usurio

- OBS: somente um usurio DBA pode criar ou alterar


privilgios de outro usurio

145

VIII Tpicos avanados

Para alterar sua prpria senha:


GRANT CONNECT TO seu_nome
IDENTIFIED BY nova_senha

OBS: qualquer usurio pode executar esta variao do


comando GRANT

Para retirar privilgios de um usurio:


REVOKE privilegio, privilegio, FROM usuario,

Para remover um usurio do banco de doados:


- remova todos os objetos do usurio
- remova todos seus privilgios

Remover os privilgios de um usurio no implica em remover


seus objetos

146

VIII Tpicos avanados

VIII.2 Privilgios de acesso


Para um usurio fazer acesso a uma tabela de outro usurio,
deve-se prefixar o nome da tabela com o nome de seu criador:
SQL > select *
2 from joo.aluno;

Um usurio pode definir quem pode usar suas tabela e que tipo
de operao podem ser realizadas:
GRANT privilegio, ... ON tabela TO usurio
[WITH GRANT OPTION]

privilgio

uma das seguintes permisses:

>ALTER

permite alterar a estrutura da tabela

>DELETE

permite apagar linhas da tabela

>INSERT

permite inserir linhas na tabela

>INDEX

permite criar ndices para a tabela

>REFERENCES
>SELECT

permite fazer referencia a esta tabela em


uma restrio de tabela ou coluna
permite consultar tabela
147

>UPDATE (col1,
..., coIN
>ALL
usurio

permite atualizar as colunas col1, , coIN


Se nenhuma coluna for especificada, ento
todas podero ser alteradas
permite todas as operaes acima
nome do usurio. Se for especificado o
pseudo-usurio PUBLIC, ento todos os
usurios tero os privilgios em questo

VIII Tpicos avanados


WITH GRANT
OPITON

permite que um usurio com um determinado


privilgio possa transmiti-lo para um terceiro
usurio

Para um usurio permitir que o usurio RITA faa consultas a


sua tabela EMP:
SQL > Grant select on emp to Rita:

Para permitir que todos usurios tenham todos privilgios sobre


a tabela DEP:
SQL > Grant all on dep to public;

Tambm possvel restringir o acesso a tabelas atravs do uso


de vises:
SQL > create view emp_dia
2 as select * from emp
3 where to_number( to_char( sysdate, `HH24`))
4 between 8 and 17;

148

VIII Tpicos avanados

Para facilitar o acesso a tabelas de outros usurios pode-se criar


sinnimos para os nomes das tabelas:
CREATE [PUBLIC] SYNONYM sinnimo FOR tabela

PUBLIC

faz com que o sinnimo fique disponvel


para todos os usurios

sinnimo
tabela

nome do sinnimo a ser criado


nome da tabela, opcionalmente
prefixada pelo nome de seu criador

Para criar um sinnimo para a tabela ALUNO do usurio JOAO:


creat synonym joo_aluno for joo.aluno;

149

VIII Tpicos avanados

VII.3 Acesso concorrente

Quando dois o mu mais usurios esto usando as mesmas


informaes ao mesmo tempo, dizemos que h um acesso
concorrente a estas informaes.

Para garantir que atualizaes concorrentes sejam processadas


corretamente, o Oracle controla o bloqueio (locking) de
tabelas e/ou linhas de tabelas.
Para bloquear uma tabela:
LOCK TABLE tabela, ... IN tipo MODE [NOWAIT]

tabela, ...
tipo
>SHARE

tabelas a serem bloqueadas


tipo do bloqueio (explicaes vlidas na
presena de TPO)
permite que outros usurios recuperem mas
que nenhum deles altere as informaes da
tabela

>ROW SHARE

permite que outros usurios alterem outras


linhas individualmente, mas sem poder
bloquear toda a tabela de forma exclusiva

>SHARE
UPDATE

equivale ao modo ROW SHARE, mantido


para compatibilidade com verses anteriores
do ORACLE.

>ROW

permite outros usurios alterem outras linhas


150

EXCLUSIVE

individualmente, mas sem poder bloquear toda


a tabela de forma alguma (nem em modo
SHARE)

>SHARE ROW
EXCLUSIVE

possibilita que um usurio execute mltiplas


atualizaes sobre a tabela, permitindo que
outros usurios faam consultas a ela mas
proibindo a colocao de bloqueios do tipo
SHARE ou atualizaes de linhas.

VIII Tpicos avanados


>EXCLUSIVE

NOWAIT

permite que outros usurios faam


consultas tabela mas probe qualquer outra
operao sobre ela
especifica se o comando de bloqueios deve
esperar at obter sucesso ou no

Um usurio sempre pode consultar informaes do banco de


dados, independente de qualquer bloqueio.

Todos os bloqueios so liberados no final da transao corrente


(COMMIT ou ROLLBACK)

151

VIII Tpicos avanados

possvel bloquear antecipadamente algumas linhas de uma


tabela em modo EXCLUSIVE, para posterior atualizao:
SQL > select * from emp
2 where n_emp = 110
3 for update of sal;
bloqueia somente as linhas
recuperadas em modo exclusive

Neste caso, a tabela EMP implicitamente bloqueada em modo


ROW SHARE e as linhas selecionadas em modo EXCLUSIVE.
De forma semelhante, os comandos INSERT, UPDATE e
DELETE bloqueiam automaticamente as linhas afetadas em
modo EXCLUSIVE e a tabela em modo ROW EXCLUSIVE:
SQL > update emp
2 set sal = 1.2 * sal
3 where n_emp = 110;
SQL > commit;

152

VIII Tpicos avanados

Deadlock uma situao onde um usurio A espera pela


liberao de uma tabela bloqueada por um usurio B, o qual est
esperando a liberao de outra tabela bloqueada pelo usurio A:

USURIO A
SQL > lock table emp
2
in exclusive mode;
Table(s) Locked.
SQL >
SQL >
SQL >
SQL >
SQL > lock table dep
2
in exclusive mode;

tempo que o usurio A


esperou pela liberao
da tabela dep

USURIO B
SQL >
SQL >
SQL >
SQL >
SQL >
SQL > lock table dep
2
in exclusive mode;
Table(s) Locked.
SQL >
SQL >
SQL >
SQL >
SQL >
SQL > lock table emp
2
in exclusive mode;
lock table in exclusive mode
*
ERROR at line: ORA-0060:
deadlock delected, transaction
backed out

Table(s) Locked.
O Oracle detecta a
ocorrncia
de um deadlock

153

VIII Tpicos avanados

VII.4 - ndice
ndices permitem que o Oracle recupere informaes do banco
de dados de forma mais eficiente.
Para criar um ndice:
CREATE [UNIQUE] INDEX ndice ON
tabela [col1 ASC | DESC, )

UNIQUE

garante que a tabela nunca ir conter dois


registros com os mesmos valores em todas as
colunas do ndice

ndice

nome do ndice a ser criado; deve ser nico


para cada usurio

tabela

nome da tabela a ser indexada

col1, ..., coIN

colunas que participam do ndice

>ASC

ordem ascendente (padro)

>DESC

ordem descendente

154

VIII Tpicos avanados

Para remover um ndice:


DROP INDEX ndice [ON tabela]

ndice
ON tabela

nome do ndice a ser removido


causa verificao do nome da tabela

Uma tabela pode ter vrios ndices associados a quaisquer


colunas:
SQL > creat unique index emp_num on emp( n_emp)
SQL > creat index emp_nome on emp( nome_emp );

ou
SQL > creat unique index emp_nome_num
2 on emp( nome_inp, n_emp);

Para usar um ndice qualquer no necessrio especific-lo o


Oracle decide automaticamente como e quando utilizar um
ndice.
SQL > select * from emp
2 where n_emp = 110;
155

o Oracle utilizar
o
ndice emp_num

VIII Tpicos avanados

ndices tambm podem ser usados para impedir duplicao de


registros:
SQL > insert into emp values ( 110, `JOAO`, `DIRETOR`, 175,
2 `20-Dec-90`, 350000, , 30 );
insert into emp values ( 110, `JOAO`, `DIRETOR`, 175, `20-DEC-90`,
*
ERROR at line 1: ORA-0001: duplicate value in index

Todos os ndices do banco


automaticamente pelo Oracle.

de

dados

so

mantidos

Deve-se criar ndices:


- se uma tabela possui mais que algumas centenas de linhas
- em colunas freqentemente usadas para recuperao de
dados
no aconselhvel criar muitos ndices para uma tabela, pois os
ndices podem prejudicar o desempenho dos comandos INSERT,
UPDATE e DELETE

156

VIII Tpicos avanados

O Oracle no aproveita ndices para colunas envolvidas em


expresses aritmticas:

SQL > select nome_emp from emp


2 where n_emp = 110;

usa ndice

SQL > select nome_emp from emp


2 where n_emp 110 = 0;

no usa ndice

Para evitar que um ndice seja usado, basta fazer uma operao
sem efeito na primeiro coluna associada ao ndice:
SQL > select nome_emp
2 from emp
3 where cargo | | = `DIRETOR` and n_emp = 110;

no usaria ndice em cargo,


caso
existisse algum

157

VIII Tpicos avanados

VIII.5 - Clusters
Cluster uma caracterstica que permite que vrias tabelas
relacionadas sejam agrupadas fisicamente no banco de dados
Emp
N_EMP

NOME_EMP

103
110
175
189
201
208
230
276

SAMANTA
UIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

o departamento e seus
empregados esto
fisicamente agrupados

Dep

...N_DEP
...20
...20
...10
...30
...30
...30
...10
...20

N_DEP

NOME_DEP

10
20
30
40

ADMINISTRAO
PESQUISA
VENDAS
PRODUO

Cluster Emp_Dep
10
175
230

ADMINISTRAO
PAULO
PRESIDENTE
ANA
SECRETARIA

SAO PAULO
27-FEB-86
175
01-MAY-89

...
...

20
103
110
276

PESQUISA
SAMANTA
UBIRATAN
RENATO

ANALISTA
DIRETOR
ANALISTA

CAMPINAS
110
17-MAR-85
175
20-APR-85
110
30-APR-86

...
...
...

30
189
201
208

VENDAS
RITA
EVERALDO
SILVIO

DIRETOR
VENDEDOR
VENDEDOR

BRASILIA
175
25-DEC-85
189
28-SEP-86
189
30-OCT-86

...
...
...

40

PRODUO

SAO BERNARDO

158

VIII Tpicos avanados

Um cluster pode envolver vrias tabelas, mas uma tabela pode


participar no mximo de um cluster.

Assim como ocorre com ndices, o Oracle tira proveito de


clusters automaticamente; no necessrio (nem possvel)
indicar o uso de um cluster.

Um cluster agrupa tabela fisicamente por um conjunto de


colunas comuns a estas tabelas (como acontece logicamente em
uma juno).
Cada valor distinto existente nas colunas de um cluster
armazenado uma nica vez no banco de dados.

159

VIII Tpicos avanados

Para criar um cluster:


CREATE CLUSTER cluster (col1 tipo1, ...)

cluster
col1 tipo1, ...

nome do cluster a ser criado


colunas (e respectivos tipos) usadas para
agrupar as tabelas

SQL > create cluster


2 proj_dep ( n_dep number(2) );

Logo aps a criao e um cluster, nenhuma tabela est


associada a este cluster.
Depois que um cluster criado, preciso criar um ndice no
cluster para que ele possa ser usado:
SQL > create index imd_prod_dep on cluster proj_dep;

160

VIII Tpicos avanados

Para criar uma nova tabela dentro de um cluster j existente:


SQL > create table proj (
2 n_proj
number( 5 ) not null,
3 nome_proj
char( 20 ),
4 n_dep
number( 2 ) not null
5 ) cluster proj_dep( n_dep );

Para associar uma tabela j existente a um cluster:


SQL > create table tmp
2 cluster proj_dep( n_dep )
3 as select * from dep;
Table created
SQL > drop table dep;
Table dropped.
SQL > rename tmp to dep;
Table renamed.

161

VIII Tpicos avanados

Para remover um cluster, pode-se antes remover suas tabelas:


SQL > drop table dep;
SQL > drop table proj;
SQL > drop cluster proj_dep;

Ou ento remover o cluster e seu contedo de uma s vez:


SQL > drop cluster proj_dep including tables;

Em geral clusters:
- aumentando o desempenho para junes naturais
- economizam espao na banco de dados
- diminuem o desempenho para consultas simples s tabelas
separadamente

162

VIII Tpicos avanados

VIII.6 Dicionrio de dados


O dicionrio de dados do Oracle um grupo de tabelas e vises
que contem informaes sobre o prprio banco de dados
A tabela DICTIONARY descreve as tabelas que compem o
dicionrio de dados; as principais tabelas e vises so
ALL_CATALOG

todas as tabelas, sinnimos, seqncias e


vises que o usurio tem acesso, incluindo o
dicionrio de dados

ALL_COL_COMENTS

comentrios sobre colunas das tabelas que o


usurio tem acesso

ALL_INDEXES

todos ndices das tabelas que o usurio tem


acesso

ALL_IND_COLUM
NS

colunas que possuem ndices em todas as


tabelas acessveis

ALL_SYNONYMS

sinnimos privados e pblicos

ALL_TABLES

descrio das tabelas acessveis ou usurio

ALL_TAB_COLUM
NS

especificao das colunas de todas tabelas que


o usurio tem acesso, incluindo o dicionrio de
dados

163

ALL_TAB_COMENTS comentrios sobre tabelas e vises acessveis


ao usurio
ALL_TAB_GRAN
TS_RECD

listas de permisses de acesso recebidas pelo


usurio (GRANT)

ALL_USERS

lista dos usurios Oracle

ALL_VIEWS

lista das vises que o usurio tem acesso

VIII Tpicos avanados


DICTIONARY

descries de tabelas e vises do dicionrio de


dados do Oracle

USER_CATALOG

tabelas, sinnimos, seqncia e vises que o


usurio tem aceso (excluindo o dicionrio de
dados)

USER_CLUSTERS

clusters e tabelas associadas (o usurio deve


ter acesso a ambos)

USER_FREE_SPACE

extenses livres em tabelas acessveis pelo


usurio

USER_INDEXES

ndices criados pelo usurio

USER_SYNONYMS

sinnimos criados pelo usurio

USER_TAB_COLUMNS especificaes das colunas das tabelas criadas


pelo usurio
USER_TABLES

descrio das tabelas do usurio

USER_VIEWS

comandos SQL que definem as vises criadas


pelo usurio

164

VIII Tpicos avanados

Para saber quais so suas tabelas, vises, sinnimos e clusters:

SQL > select table_name, table_type

TABLE_NAME
DEP
DEP_SAL
EMP
EMP_DEP
EMP_DIA
FAIXA_DIA
JOAO_ALU
PROJ
PROJ_DEP
SAL_MEDIO

TABLE_TYPE
TABLE
VIEW
TABLE
VIEW
VIEW
TABLE
SYNONYM
TABLE
CLUSTER
TABLE

165

VIII Tpicos avanados

Para saber todos as tabelas, sinnimos, seqncias e vises s


quais voc tem acesso:
SQL > select table_name, owner, table_typefrom all_catalog;

TABLE_NAME
ALUNO
DEP
DEP_SAL
EMP
EMP_DEP
EMP_DIA
FAIXA_SAL
FRANQUIAS
ITEM_PED
PEDIDO
PRODUTO
PROJ
SAL_MEDIO
...

OWNER
JOAO
CURSO
CURSO
CURSO
CURSO
CURSO
CURSO
JOAQUIM
JOAO
JOAO
JOAO
CURSO
CURSO

TABLE_TYPE
TABLE
TABLE
VIEW
TABLE
VIEW
VIEW
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE

Para saber todos os ndices da tabela EMP:


SQL > select i.index_name, i.table_name, column_name
2 from user_indexes i, user_ind_columns c
3 where i.index_name = c.index_name and
4 i.table_name = `EMP`;
INDEX_NAME
EMP_NUM
EMP_NOME

TABLE_NAME
EMP
EMP

COLUMN_NAME
N_EMP
NOME_EMP

166

VIII Tpicos avanados

Para saber seus privilgios em tabelas de outros usurios:


SQL > select grantor doador, table_name tab, alter_priv a,
2
delete_priv d,
3
index_priv n, insert_priv i, select_priv s, update_priv u,
4
references_priv r
5 from all_tab_grants_recd
6 where grantee = user and grantor ! = user;

DOADOR
JOAO
JOAO
JOAQUIM
JOAO
JOAO

TAB
A D N I
PRODUTO Y Y Y Y
ALUNO
Y
FRANQUIAS
PEDIDO
Y
Y
ITEM_PED Y
Y

S
Y
Y
Y
Y
Y

U R
Y Y
Y Y
Y
Y Y
Y Y

167

VIII Tpicos avanados

possvel armazenar comentrios sobre tabelas e colunas no


dicionrio de dados:

SQL > comment on table emp is `Empregados da Software Design`;


Comment created
SQL > comment on column emp.nome_emp is `Nome do empregado;
Comment created.
SQL > comment on column emp.chefe is `codigo do chefe desta pessoa`;
Comment created.
SQL > select table_name, comments
2 from user_tab_comments
3 where table_name = EMP`;
TABLE_NAME
EMP

COMMENTS
Empregados da Software Desing

SQL > select column_name comments


2 from user_col_comments
3 where table_name = `EMP and comments is not null;
COLUMN_NAME
NOME:EMP
CHEFE

COMMENTS
Nome do empregado
cdigo do chefe desta pessoa

168

VIII Tpicos avanados

VIII - Exerccios
1. Conceda privilegio de consulta a insero em sua tabela
ALUNO para seu companheiro mais prximo.
2. Crie i sinnimo ALUNO0 para a tabela ALUNO do instrutor
(usurio ora0).
3. Bloqueia a tabela ALUNO0 em modo exclusivo e insira os seus
dados nela (dica: utilize a segunda forma do comando INSERT).
Efetive a operao.
4. Crie um ndice na coluna NOME da sua tabela ALUNO.
5. Revogue as permisses de acesso a sua tabela ALUNO para seu
companheiro, concedidas no exerccio n 1.
6. Consulte os ndices existentes para a sua tabela ALUNO. Dica:
veja a pgina 165.
7. Consulte seus privilgios de acesso tabela ALUNO do
instrutor. Dica: veja pagina 166.

169

VIII Tpicos avanados

AP. A Tabelas utilizadas

170

Tabelas:
SQL > DESCRIBE emp
Name
N_ EMP
NOME_EMP
CARGO
CHEFE
DATA_ADM
SAL
COM
N_DEP

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

Contedo:
N_EMP NOME_EMP

CARGO

CHEFE DATA_ADM

SAL

103
110
175
189
201
208
230
276

ANALISTA
DIRETOR
PRESIDENTE
DIRETOR
VENDEDOR
VENDEDOR
SECRETARIA
ANALISTA

110
175

150000
300000
500000
330000
200000
150000
120000
100000

SAMANTA
UBIRATAN
PAULO
RITA
EVERALDO
SILVIO
ANA
RENATO

175
189
189
175
110

17-MAR-85
20-APR-85
27-FEB-86
25-DEC-85
28-SEP-86
30-OCT-86
01-MAY-89
30-APR-86

COM

5000
3000
9000
1000

N_DEP
20
20
10
30
30
30
10
20

171

Ap. A Tabelas utilizadas


SQL > DESCRIBE dep
Name
Null?
N_DEP
NOT NULL
NOME_DEP
NOT NULL
LOCAL_DEP

Type
NUMBER(2)
CHAR(14)
CHAR(13)

Contedo:
N_EMP

NOME_DEP

LOCAL_DEP

10
20
30
40

ADMINISTRAO
PESQUISA
VENDAS
PRODUO

SAO PAULO
CAMPINAS
BRASILIA
SAO BERNARDO

SQL > DESCRIBE faixa_sal


Name

Null?

Type

SALMIX
SALMAX
FAIXA

NOT NULL
NOT NULL
NOT NULL

NUMBER(11,2)
NUMBER(11,2)
CHAR(1)

172

Contedo:
SALMIN
1
100000
150000
200000
400000

SALMAX
99999
149999
199999
399999
800000

F
A
B
C
D
E

Ap. A Tabelas utilizadas


SQL > DESCRIBE proj
Name
NOME
ENDER
CIDADE
ESTADO
CEP
ANIVERSARIO

Null?
NOR NULL

Type
CHAR(30)
CHAR(50)
CHAR(35)
CHAR(2)
NUMBER(5)
DATE

SQL > DESCRIBE sal_mdio


Name
NOME_DEP
Number_Salario

Null?
NOT NULL

Type
CHAR(14)
NUMBER

Null?
NOT NULL

Type.
NUMBER(5)
CHAR(20)
NUMBER(2)

SQL > DESCRIBE proj


Name
N_PROJ
NOME_PROJ
N_DEP

NOT_NULL

173

Ap. A Tabelas utilizadas

Vises:
SQL > DESCREBE dep_sal
Name

Null?

Type

NOME_DEP
NUM_FUNC
SAL_MIN
SAL_MED
SAL_MAX

NOT NULL CHAR(14)


NUMBER
NUMBER
NUMBER
NUMBER

SQL > DESCRIBE emp_dep


Name

Null?

Type

NOME
NUM
NUM_DEPTO
NOME_DEPTO

NOT NULL
NOT NULL
NOT NULL
NOT NULL

CHAR(10)
NUMBER(4)
NUMBER(2)
CHAR(14)

SQL > DESCRIBE emp_dia


Name
N_EMP
NOME_EMP
CARGO
CHEFE
DATA_ADM
SAL
COM
N_DEP

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

174

Ap. A Tabelas utilizadas

Ap. B Sumrio dos Comandos

175

Principais comandos SQL:


ALTER TABLE

adicione ou redefine uma colina em uma tabela


existente

COMMENT

insere um comentrio sobre uma tabela ou


coluna no dicionrio de dados

COMMIT

efetiva as mudanas realizadas no banco de


dados desde a ltima ativao dos comandos
COMMIT ou ROLLBACK

CREATE
CLUSTER

cria um cluster que pode conter uma ou mais


tabela

CREATE INDEX

cria um ndice para uma tabela

cria uma seqncia


automaticamente

CREATE
SEQUENCE

numrica

gerada

CREATE
SYNONYM

cria um sinnimo para uma tabela ou viso

CREATE TABLE

cria uma tabela e define as caractersticas de


suas colunas

CREATE VIEW

cria uma viso sobre uma ou mais tabelas ou


vises

DELETE

remove linhas de uma tabela

remove um cluster, tabela, viso, etc. do


banco de dados

DROP objeto

GRANT

cria usurios,
atribui senhas, e fornece
privilgios de acesso a tabelas e vises
176

INSERT

insere novas linhas em uma tabela ou viso

LOCK TABLE

bloqueia uma tabela

RENAME

muda o nome de uma tabela, viso ou


sinnimo

REVOKE

revoga acesso ao banco de dados ou a tabelas e


vises

ROLLBACK

descarta as alteraes feitas no banco de dados


desde a ultima ativao dos comandos
COMMIT ou ROLLBCK.

Ap. B Sumrio dos Comandos


SAVEPOINT

determina um ponto de
intermedirio para a transao

SELECT

realiza uma consulta

SET
TRANSACTION

determina um ponto
salvamento de transaes

UPDATE

altera valores de campos de uma tabela

salvamento

intermedirio

de

Comandos SQL*Plus:
@, START

executa um arquivo de comandos

finaliza uma seqncia de linhas de comentrio


inicializada por um comando DOCUMENT

!, HOST

excuta um comando do sistema operacional


sem deixar o SQL*Plus

ACCEPT

l um valor entrado pelo usurio e o atribui


uma varivel

APPEND, A

adiciona texto no fim da linha corrente

BREAK

especifica que eventos casaro uma quebra, e


que ao deve ser tomada em cada quebra

BTITLE

especifica um ttulo a ser mostrado no rodap


de cada pagina de um relatorio

CHANGE

altera o contedo da linha corrente no buffer


177

CLEAR

apaga as definies dos comandos BREAK,


COMPUTE, COLUMN, etc.

COLUMN

especifica como uma coluna e seu nome devem


ser mostrados em um relatrio

COMPUTE

realiza clculos em um conjunto de linhas


selecionadas. Funciona em conjunto com o
comando BREAK

CONNECT

termina a sesso corrente e se


novamente ao ORACLE

DEFINE

define uma varivel e atribui um valor a ela

conecta

Ap. B Sumrio dos Comandos


DEL, D
remove a linha corrente do buffer
DESCRIBE, DEC

mostra a descrio de uma tabela

DISCONNECT

efetiva as transaes pendentes e desconecta do


Oracle

DOCUMENT

inicia um bloco de documentao no arquivo


corrente

EDIT, ED

invoca um editor do sistema operacional

EXIT, QUIT

termina a execuo do SQL*Plus

GET

carrega um arquivo no buffer corrente

HELP

fornece ajuda
SQL*Plus

INPUT, I

adiciona novas linhas aps a linha corrente do


buffer

LIST, L

mostra as linhas presentes no buffer corrente

PAUSE

mostra uma mensagem e espera o usurio


teclar algo

PROMPT

mostra uma mensagem na tela

REMARK, REM

inicia um comentrio em um arquivo de


comandos

RUM

mostra e executa o contedo do buffer corrente

RUMFORM

executa um formulrio previamente gerado

sobre

comandos

SQL e

178

SAVE

salva o contedo do buffer corrente em um


arquivo

SET

atribui um valor a um parmetro do SQL*Plus

SHOW

mostra as definies atuais dos parmetros do


SQL*Plus

SPOOL

controla a copia de sada dos comandos em


arquivos ou na impressora do sistema

TTITLE

especifica um titulo a ser mostrado no topo de


cada pgina de um relatrio

UNDEFINE

remove a definio de uma varivel

WHENEVER

controla o fluxo de execuo do SQL*Plus


quando ocorrem erros em comandos SQL

Ap. B Sumrio dos Comandos

AP. C Resposta dos exerccios

179

II.1:
create table aluno (
nome char( 30 ) not null,
ender char( 50 ),
cidade char( 25 ),
estado char( 2 ),
cep number( 5 ),
aniversario date );

II.2:
insert intoaluno
values ( `Joao da Silva Neto`, `Rua Brasincas, 145`, `Sao Paulo`,
`SP`, 01250, `12-JAN-11`);
insert into aluno
values ( `Joao da Silva Junior`, `Rua Tiradentes, 897`, `Bauru`,
`SP`, 12450, `24-APR-11`);
insert into aluno
values ( `Matias da Silva Salgado`, `Rua Rui Barbosa, 145`,
`Sao Paulo`, `SP`, 01124, `13-AUG-11`);
insert into aluno
values ( `Ana Rosa da Silva Salgado`, `Rua Brs Cubas, 789`,
`Curitiba`, `PR`, 80530, `01-OCT-11`);
180

II.3:
column niver format a5
select nome Aluno, to_char( aniversario, `DD/MM` ) Niver
from aluno;

Ap. C Resposta dos exerccios

II.4:
select ender, cidade, estado, cep
from aluno
where nome = `Joo da Silva Neto;

II.5:
save ex24
exit
sqlplus ora1/senha1
start ex24

III.1:
select nome_emp, cargo, sal / 160
from emp;

III.2:
select nome_emp, sal + com
from emp
where cargo = `VENDEDOR`

181

III.3:
select nome_emp, cargo, sal / 160
from emp
order by 3 desc;

III.4:
select min(sal)
from emp;

Ap. C Resposta dos exerccios

III.5:
select n_dep, min(sal) Menor Salario, max(sal) Maior Salario,
avg(sal) Salario Mdio
from emp
group by n_dep
having count(*) > 1;

III.6:
select nome_emp, nome_dep
from emp, dep
where emp.n_dep = dep.n_dep and
local_dep in ( `SAO PAULO`, `CAMPINAS` );

IV.1:
creat table empreg as
select n_emp, nome_emp, sal
from emp;

182

IV.2:
rename empreg to temp;
drop table temp;

IV.3a:
alter table aluno
modify ( cidade char( 35 ) );

IV.3b:
alter table aluno
add ( sal_desejado mnber( 11, 2 ) );

Ap. C Resposta dos exerccios

IV.4:
insert into aluno ( nome, aniversario, sal_desejado )
values ( `Joaquim Alfredo Guimares`, `13-JUL-11`, 350000 );

IV.5:
update aluno
set sal_desejado = 400000
where nome = `Joo da Silva Neto`;
update aluno
set ender = `Rua Pindamonnhangaba, 123`,
cidade = `Taubat`, estado = `SP`, cep = 14500
where nome = `Joaquim Alfredo Guimares`;

IV.6:
create table tmp as
select nome, ender, cidade, estado, cep, aniversario
from aluno;
drop table aluno;
rename tmp to aluno;
183

IV.7:
delete from aluno
where nome = `Joaquim Alfredo Guimares`;
commit;

Ap. C Resposta dos exerccios

IV.8:
create view dep_sal as
select nme_dep, count( * ) num_func, min( sal ) sal_min,
avg( sal ) sal_med, max( sal ) sal_max
from emp, dep
where emp.n_dep = dep.n_dep
group by nome_dep;

IV.9:
describe dep_sal
select * from dep_sal;

IV.10:
update emp
set sal = 300000
where nome_emp = `SAMANTA`;
select * from dep_sal;

184

IV.11:
rollback;

Ap. C Resposta dos exerccios

V.1:
get ex31
del
1
a Sal/hora
ttitle center Salario por hora skip 1 center dos Empregados skip1
column Sal/hora format 9999.99
column cargo justify right
column
/

V.2:
set echo off
set feedback off
set linesize 50
set pagasize 40
ttitle center Relatorio de Empregados skip 2
break on Departamento skip 1
compute avg sum of Salario on Departamento
select nome_dep Departamento, nome_emp Nome, cargo
Cargo, sal Salario
from emp, dep
where emp.n_dep = dep.n_dep
order by nome_dep;

185

Ap. C Resposta dos exerccios

V.3:
set echo off
set verify off
set feedback off
set pause off
set linrsize 50
set pagasize 40
clumn aux noprint
ttitle center Relatorio de empregados skip 2
break on aux skip 1
compute avg sum of Salario on aux
accept MaiorSalario number prompt `Maior Salario: `
spool ex.53.lst
select nome_dep aux, nome_dep Departamento,
nome_emp Nome, cargo Cargo, sal Salrio
from emp, dep
where emp.n_dep = dep.n_dep and
sal > = &1 and sal < = &MaiorSalario
order by nome_dep;
spool off

VI.1:
select nome_emp, cargo
from emp
where to_char( data_adm, `DD/MM/YY` ) between
`01/02/85`and `27/12/85` and
com is not null;

186

VI.2:
select userenv( `sessionid`), userenv( `terminal`)
from dual;

Ap. C Resposta dos exerccios

VI.3:
Select stddev( sal ) DesvPadr, avg( sal ) Media
From emp
Where cargo in ( `DIRETOR`, `PRESIDENTE`);

VI.4:
column data 1 format a6
column data 2 format a6
select nome, to_char( aniversario, `DD/MM`) data1,
to_char( aniversario, `DD-MON`) data2
from aluno;

VI.5:
select trunc( to_number(
months_between( max( data_adm ), min( data_adm ))
)) MESES
from emp;

187

VI.6:
select n_emp, nome_emp, cargo, sal + nvl( com, 0 ) TotSalario
from emp;

VI.7:
select nome_emp,
decode( cargo, `SECRETARIA`, 1, `VENDEDOR`, 2,
`ANALISTA`, 3, 4 ) Categoria
from emp;

Ap. C Resposta dos exerccios

VI.8:
select emp.nome_emp, greatest( emp.sal, dep_sal.sal_md ) Saladeal
from emp, dep, dep_sal
where emp.n_dep = dep.n_dep and
dep.nome_dep = dep_sal.nome_dep;

VI.9:
select substr( nome_emp, 1, 1)
from emp
order by data_adm;

VII.1:
column data_hora format a15
select uld, user, to_char( sysdate, `HH24:MI-DD/MM/YY` )
DATA HORA
from dual;
188

VII.2:
select nvl( chefe.nome_emp, `-------` ) NOME_CHEFE,
func.nome_emp NOME_FUNC
from emp func, emp chefe
where func.chefe = chefe.n_emp (+)
order by 1;

Ap. C Resposta dos exerccios

VII.3:
select nome_emp, sal, local_dep
from emp x, dep, faixa_sal
where x.n_dep = dep.n_dep and
x.sal between salmin and salmax and
faixa = ( select faixa
from faixa_sal, emp y
where y.nome_emp = `UBIRATAN`and
y.sal between salmin and salmax );

VII.4:
update emp x
set sal = 1.2 * sal
where data_adm = ( select min( data_adm ) from emp y
where y.n_dep = x.n_dep);

VII.5:
delete from emp x
where x.sal > ( select avg( y.sal )
from emp y
where y.cargo = x.cargo );

189

VII.6:
rollback;

VIII.1:
grant select, insert on aluno to ora

Ap. C Resposta dos exerccios

VIII.2:
create synonym aluno0 for ora0.aluno;

VIII.3:
lock table aluno0 in exclusive mode;
insert into aluno0
select *
from aluno
where nome = `Joao da Silva Neto`;
commit;

VIII.4:
create index alu_nome on aluno( nome );

VIII.5:
revoke select, insert on aluno from ora2;

190

VIII.6:
select ui.index_name, ui.table_name, column_name
from user_indexes ui, user_ind_columns unid
where ui.index_name = uind.index_name
and ui.table_name = `ALUNO`;

VIII.7:
select grantor doador, table_name tab, alter_priv a, delete_priv d,
index_priv n, insert_priv i, select_priv s, update_priv u,
references_priv r
from all_tab_grants_recd
where table_name = `ALUNO` and grantor = `ORA`;

Ap. C Resposta dos exerccios

191