You are on page 1of 189

ndice

Contedo 3
I Introduo
- 4
1.1 Objetivos do curso
- 5
1.2 O que SQL*Plus- 6
II Comandos SQL e SQL*Plus
- 7
II-Contedo 8
11.1 Ativao do SQL*Plus - 9
11.2 Criao de tabelas - 10
11.3 Manipulao de tabelas - 12
11.4 Formatao de relatrios
- 16
11.5 Edio de comandos - 17
11.6 Outros comandos - 22
II Exerccios
- 23
III Consultas bsicas
- 24
111-Contedo 25
111.1 Seleo de colunas - 26
111.2- Uso de expresses 27
111.3 Seleo de linhas - 29
111.4 Ordenao de resultados - 31
111.5 Agrupamento - 33
111.6 Operaes de conjunto - 35
111.7 Juno de tabelas - 39
III Exerccios - 44
IV- Criao e uso de tabelas 45
1V-Contedo 46
1V.1 -CREATETABLE 47
IV.2 Tipos de colunas - 51
IV.3 Alterao de uma tabela- 52
lV.4 O comando INSERT - 54
lV.5 O comando DELETE - 56
IV.6 O comando UPDATE - 57
IV.7 Controle de transaes - 59
lV.8 Manipulao de vises - 67
IV.9 Criao de seqncias - 72
IV Exerccios - 73
V -Gerao de Relatrios 75
V Contedo - 76
V.1 - Formatao de colunas 77
V.2 - Formatao de ttulos 80
V.3 - BREAK e COMPUTE 84
V.4 - Parmetros de controle 89
V.5 - Utilizao de variveis 93
V.6 - Relatrios avanados 98

1
V Exerccios
- 107
VI Expresses e funes
- 110
VI- Contedo 111
VI.1 Operadores - 112
Vl.2 Funes numricas
- 114
VI.3 Funes de caracteres
- 116
VI.4 Funes de grupo
- 119
VI.5 Converso entre tipos
- 120
VI.6 Funes de datas
- 123
Vl.7 Outras funes - 124
VI Exerccios
125
VII Consultas avanadas
- 126
VII-Contedo 127
VII.1 Pseudo-colunas - 128
VII.2 Juno externa - 129
VII.3 Auto-Juno - 132
VII.4 Consultas encaixadas - 133
VII.5 Consultas hierrquicas- 138
VII Exerccios - 141
VIII Tpicos avanados
- 142
VIII Contedo - 143
VIII.1 Manuteno de usurios - 144
VllI.2 Privilgios de acesso - 146
VIII.3 Acesso concorrente - 149
VIII.4 lndices - 153
VIII.5 Clusters - 157
VIII.6 Dicionrio de dados - 162
VIII Exerccios - 168
Ap. A- Tabelas utilizadas 169
Ap. B- Sumrio dos Comandos 174
Ap. C- Resposta dos exerccios 178

2
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

3
I Introduo

4
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

O SQL +
comando
SQL*PLUS
Parmetros de
SQL
BD
do controle Controle de
ORACLE
formatao

Caractersticas principais:

- interpretador de comando SQL

- possui extenses para formatao de relatrios

I Introduo

6
II Comandos SQL e SQL*Plus

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

a senha exibida
ou

$ 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 Linha (ou registro)

N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP


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 01-MAY-89 120000 10
276 RENATO ANALISTA 110 30-APR-86 100000 20

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, . Separa as definies
das colunas
3 nome_emp char (10),
4 cargo char (10)
5 chefe number (4),
6 data_adm date,
. Executa o comando
7 sal number (10,2),
8 com number (10,2),
9 n_dep number (2) );

Indica a continuao do comando


Somente o cabealho

N_EMP NOME_EMP 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,
3 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 CHEFE DATA_ADM SAL COM N_DEP


103 SAMANTA ANALISTA 110 17-MAR-85 150000 20
110 UBIRATAN DIRETOR 175 20-APR-85 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 CHEFE DATA_ADM SAL COM N_DEP

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 110 30-APR-86 100000 20

Para recuperar apenas o nome dos empregados que so


analistas:

Nome da coluna

SQL > select nome_emp


2 from emp Condio a ser satisfeita

3 where cargo = ANALISTA`;

NOME_EMP
Maisculas e minsculas somente
SAMANTA fazem diferena
RENATO entre ``(aspas simples)

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


110 UBIRATAN 300000

SQL > update emp


2 set sal = 350000
3 where n_emp= 110;

N_EMP NOME_EMP ... SAL ...


110 UBIRATAN 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


Comandos SQL*Plus no
SQL > column nome_emp heading NOME Precisam de ;
SQL > column sal format 999999.99
> heading SALARIO Para continuar um comando,
Use o caractere _

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

II Comandos SQL e SQL*Plus

16
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 Qualquer em desses comando
Poder ser utilizado
SQL > I
1 select
2 n_emp, nome_emp
3 from emp
4* where n_emp =110

* indica a linha corrente

Para apagar a linha corrente:

SQL > del


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

II Comandos SQL e SQL*Plus

17
Para inserir linha aps a linha corrente:

SQL > list 2


2* n_emp, nome_emp
SQL > input
ou
SQL > I
Deixe uma linha em branco
3 cargo, Para terminar a insero
4 sal
5
SQL > list
1 select
2 n_emp, nome_emp
3 cargo,
4 sal
5* from emp

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

II Comandos SQL e SQL*Plus

18
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 > /

II Comandos SQL e SQL*Plus

19
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

II Comandos SQL e SQL*Plus

20
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

II Comandos SQL e SQL*Plus

21
II.6 Outros comandos

Para executar um comando qualquer do sistema operacional:

SQL > host


ou
SQl > !
total 20
drwxr-xr-x 2 curso oracle 128 Jan 3 18:02 .
drwxr-xr-x 3 curso oracle 1024 Jan 3 17:59 ..
-rw-r-r- 1 curso oracle 800 Jan 3 17:59 ex21.sql
-rw-r-r- 1 curso oracle 838 Jan 3 17:59 ex22.sql
-rw-r-r- 1 curso oracle 1152 Jan 3 18:01 ex23.sql
-rw-r-r- 1 curso oracle 1616 Jan 3 18:01 ex24.sql
-rw-r-r- 1 curso oracle 1796 Jan 3 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

II Comandos SQL e SQL*Plus

22
II - Exerccios

1. Crie uma tabela chamada ALUNO com as seguintes colunas:

NOME CHAR( 30 ) NOT NULL


ENDER CHAR( 50 )
CIDADE CHAR( 25 )
ESTADO CHAR( 2 )
CEP NUMBER( 5 )
ANIVERSARIO 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

II Comandos SQL e SQL*Plus

23
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 SAMANTA
110 UBIRATAN
175 PAULO
189 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 103
UBIRATAN 110
PAULO 175
RITA 189

III Consultas bsicas

26
III.2 Uso de expresses

Para saber o salrio anual dos empregados

NOME_EMP CARGO SAL


SAMANTA ANALISTA 150000
UBIRATAN DIRETOR 300000
PAULO PRESIDENTE 500000
RITA DIRETOR 330000
EVERALDO VENDEDOR 200000
SILVIO VENDEDOR 150000
ANA SECRETARIA 120000
RENATO ANALISTA 100000

SQL > select nome_emp, 12* sal from emp;

NOME_EMP 12*SAL
SAMANTA 1800000
UBIRATAN 3600000
PAULO 6000000
RITA 3960000
EVERALDO 2400000
SILVIO 1800000
ANA 1440000
RENATO 1200000

III Consultas bsicas

27
Para saber o n total de caracteres nas colunas NOME_EMP E
CARGO

NOME_EMP CARGO SAL


SAMANTA ANALISTA 150000
UBIRATAN DIRETOR 300000
PAULO PRESIDENTE 500000
RITA DIRETOR 330000
EVERALDO VENDEDOR 200000
SILVIO VENDEDOR 150000
ANA SECRETARIA 120000
RENATO ANALISTA 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 CARGO ... N_DEP


103 SAMANTA ANALISTA ... 20
110 UBIRATAN DIRETOR ... 20
175 PAULO PRESIDENTE ... 10
189 RITA DIRETOR ... 30
201 EVERALDO VENDEDOR ... 30
208 SILVIO VENDEDOR ... 30
230 ANA SECRETARIA ... 10
276 RENATO ANALISTA ... 20

SQL > select nome_emp


3 from emp
4 where n_dep = 20;

NOME_EMP
SAMANTA
UBIRATAN
RENATO

III Consultas bsicas

29
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 MESES
SILVIO 48.689726

III Consultas bsicas

30
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 SAL


ANA SECRETARIA 120000
EVERALDO VENDEDOR 200000
PAULO PRESIDENTE 500000
RENATO ANALISTA 100000
RITA DIRETOR 330000
SAMANTA ANALISTA 150000
SILVIO VENDEDOR 150000
UBIRATAN DIRETOR 300000

III Consultas bsicas

31
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 SAL


SAMANTA ANALISTA 150000
RENATO ANALISTA 100000
RITA DIRETOR 330000
UBIRATAN DIRETOR 300000
ANA SECRETARIA 120000
EVERALDO VENDEDOR 200000
SILVIO VENDEDOR 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)

III Consultas bsicas

32
III.5 - Agrupamento
Para saber quantos funcionrios trabalham em cada
departamento:

N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP


230 ANA SECRETARIA 175 01-MAY-89 120000 10
Para saber quantos funcionrios trabalham em500000
cada 2
175 PAULO PRESIDENTE 27-FEB-86 10
103
departamento:
SAMANTA ANALISTA 110 17-MAR-85 150000 20
276 RENATO ANALISTA 110 30-APR-86 100000 20
22222222222jhglkjhgflkgjhfdlghfg ,lhdlfgn v
110 UBIRATAN DIRETOR 175 20-APR-85 300000 20 3
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 3

coluna do agrupamento todas as linhas

SQL > select n_dep, count(*)


2 from emp Funo de grupo
3 group by n_dep;

critrio de agrupamento
N_DEP COUNT(*)
10 2
20 3
30 3

Nota: omitir a clusula GROUP BY significa agrupar toda a


tabela

III Consultas bsicas

33
Para saber a soma dos salrios para os cargos onde a mdia de
salrios maio que 150000:

N_EMP NOME_EMP CARGO ... SAL ...


103 SAMANTA ANALISTA ... 150000 ...
276 RENATO ANALISTA ... 100000 ... AVG = 125000

110 UBIRATAN DIRETOR ... 300000 ...


189 RITA DIRETOR ... 330000 ... AVG = 315000
175 PAULO PRESIDENTE ... 500000 ...

230 ANA SECRETARIA ... 120000 ... AVG = 120000

201 EVERALDO VENDEDOR ... 200000 ...


AVG = 175000
208 SILVIO VENDEDOR ... 150000 ...

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


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

seleciona os grupos funo de grupo


(where de grupo)

CARGO SUM(SAL) MAS(SAL)


DIRETOR 630000 330000
PRESIDENTE 500000 500000
VENDEDOR 350000 200000

III Consultas bsicas

34
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 (A, 1)
elementos
B 1 (B, 1) do
D 2 (D, 2) conjunto

Tabela Conjunto

Existem trs operaes bsicas de conjunto em SQL:

- unio (UNION)

- interseco (INTERSECT)

- diferena (MINUS)

III Consultas bsicas

35
Unio:

TABELAS CONJUNTOS

TAB1 TAB2 Cj1 Cj2


Col. 1 Col. 2 Col. 1 Col. 2
A 1 (A, 1) (A, 2)
A 2
(B, 1) (B, 1)
B 1 B 1 (E, 2)
D 2 E 2 (D, 2) (D, 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, 1)
A 2 (A, 2)
B 1 (B, 1)
D 2 (D, 2)
E 2 (E, 2)

III Consultas bsicas

36
Interseco:

TABELAS CONJUNTOS

TAB1 TAB2 Cj1 Cj2


Col. 1 Col. 2 Col. 1 Col. 2
A 1 A 2 (A, 1) (A, 2)
(B, 1) (B, 1)
B 1 B 1 (E, 2)
D 2 E 2 (D, 2) (D, 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 (B, 1)
D 2 (D, 2)

III Consultas bsicas

37
Diferena:

TABELAS CONJUNTOS

TAB1 TAB2 Cj1 Cj2


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

colunas com tipo igual

select col1, col2 from tab1


Cj1 - Cj2
minus

select col1, col2 from tab2

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

III Consultas bsicas

38
III.7 Juno de tabelas

A juno de tabelas corresponde operao de produtos


cartesiano entre conjuntos:

A,
B, C X 1, 2

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


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

tab1 tab2
col1 col2 col3 col4 col5
A 3 B 2 E

select col1, col2, col3, col4, col5


from tab1, tab2;

Col1 col2 col3 col4 col5


A 3 B 2 E

III Consultas bsicas

39
Para saber o nome do departamento onde cada empregado
trabalha:

SQL > select nome_emp, nome_dep produto cartesiano


2 from emp, dep
3 where emp.n dep = dep.n_dep; critrio de seleo da juno

para diferenciar coluna de


mesmo nome usa-se o no-
me da tabela como prefixo

NOME_EMP NOME_DEP
PAULO ADMINISTRAO
ANA ADMINISTRAO
SAMANTA PESQUISA
UBIRITAN PESQUISA
RENATO PESQUISA
RITA VENDAS
SILVIO VENDAS
EVERALDO VENDAS

III Consultas bsicas

40
NOME_EMP NOME_DEP EMP.N_DEP DEP.N_DEP
SAMANTA ADMINISTRAO 20 10
UBIRATAN ADMINISTRAO 20 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

III Consultas bsicas

41
Dada a tabela FAIXA_SAL, que classifica faixas de salrios:

SALMIN SALMAX F
1 99999 A
100000 149999 B
150000 199999 C
200000 399999 D
400000 800000 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;

especifica um tipo
NOME_EMP SAL F de juno
ANA 120000 B
RENATO 100000 B
SAMANTA 150000 C
SILVIO 150000 C
UBIRATAN 300000 D
RITA 300000 D
EVERALDO 200000 D
PAULO 500000 E

III Consultas bsicas

42
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 F COUNT(*)
ADMINISTRAO E 1
PESQUISA C 1
PESQUISA D 1
VENDAS D 2
VENDAS C 1

III Consultas bsicas

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

III Consultas bsicas

44
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

IV Criao e uso de tabelas

46
IV.1 CREATE TABLE

O comando CREATE TABLE usado para criar novas tabelas


no banco de dados
especificao do tamanho
entre parnteses
- Forma 1:

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

>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

47
>REFERENCES indica que o valor desta coluna, se
existir,
/ FOREINGN deve existir tambm na coluna col da
tabela
KEY tab (col) primria tab. As colunas referenciadas
na tabela primria devem ser
PRIMARY KEY ou UNIQUE.

>CHECK determina que o valor desta coluna deve


condio obedecer condio lgica especificada

>CONSTRAINT determina que o valor desta coluna deve


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

 Exemplo:

SQL > CREATE TABLE emp


2 ( n_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) );

IV Criao e uso de tabelas

48
- 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 Media_Salrio
ADMINISTRAO 310000
PESQUISA 183333.333
VENDAS 226666.667

IV Criao e uso de tabelas

49
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;

IV Criao e uso de tabelas

50
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

 DOBLE PRECISION

 LONG

 RAW (tamanho), LONG RAW

IV Criao e uso de tabelas

51
IV.3 Alterao de uma tabela

SQL > desc dep


Name Null? Type
N_DEP NOT NULL NUMBER(2)
NOME_DEP CHAR(14)
LOCAL_DEP CHAR(13)

Para acrescentar uma coluna tabela DEP:

SQL > alter table dep


tabela a ser modificada
2 add ( diretor number( 4 ) );

nome da coluna Tipo da coluna

Para aumenta o tamanho da coluna NOME_DEP:

coluna a ser modificada


SQL > alter table dep
2 modify ( nome_dep char( 30 ) );

novo tipo

SQL > desc dep


Name Null? Type
N_DEP NOT NULL NUMBER(2)
NOME_DEP CHAR(30)
LOCAL_DEP CHAR(13)
DIRETOR NUMBER(4)

IV Criao e uso de tabelas

52
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 deve-
se 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;

IV Criao e uso de tabelas

53
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

- Exemplo:

SQL > Insert into emp


2 (nome_emp, n_emp, cargo, chefe, data_adm, sal, n_dep)
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);

IV Criao e uso de tabelas

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

IV Criao e uso de tabelas

55
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 condio que especifica as linhas a serem removidas.


Opcional.

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;

- Para remover todos os empregados:


SQL > delete from emp;

IV Criao e uso de tabelas

56
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

condio especifica as linha que sero atualizadas

IV Criao e uso de tabelas

57
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;

IV Criao e uso de tabelas

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

IV Criao e uso de tabelas

59
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 ROLLBACK; nenhuma


modificao efetivada

- execuo de comando de definio de dados (CREATE,


ALTER, ...); equivale ao comando COMMIT

- trmino da sesso corrente: equivale ao comando


COMMIT

- quando uma transao interrompida por fatores externos


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

IV Criao e uso de tabelas

60
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
inibe algumas mensagens de
SQL > set feedback off aviso
SQL > select n_dep, nome_dep from dep;

N_DEP NOME_DEP
10 ADMINISTRAO
20 PESQUISA
30 VENDAS Incio de uma transao
40 PRODUO

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 NOME_DEP O prprio usurio v os dados, mas


eles ainda no foram efetivados
10 ADMINISTRAO
20 PESQUISA
30 VENDAS
40 PRODUO
50 MARKETING fim da transao, com
60 INFORMATICA efetivao dos dados

SQL > commit;


Commit complete.

IV Criao e usa de tabelas

61
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 fim da transao; as


COMERCIAL atualizaes foram
descartadas

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; Produzem o


SQL > insert into emp values Mesmo efeito
2 ( 103, `SAMANTA`, `DIRETOR`, 175, `17-MAR-85`,
3 200000, NULL, 20);
SQL > commit;
Commit complete.
SQL > update emp set cargo = `DIRETOR`, chefe = 175, sal = 200000
2 where n_emp =103;
SQL > commit; inicio da ultima
Commit complete. transao
SQL > delete from emp
2 where n_dep = 10; Fim da ultima transao
SQL > exit Com COMMIT implcito

IV Criao e usa de tabelas

62
Observaes

- Uma transao ou executada totalmente ou no


executada; no existe transao parcialmente executada,
por definio.

- As modificaes efetuadas no decorrer de uma transao


por um usurio s so visveis a outros usurios aps a
efetivao da transao (COMMIT).

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

SAL SAL
330000 330000

SQL > update emp SQL >


2 set sal = 400000
3 where n_emp = 189;

SQL > select sal from emp SQL > select sal from emp
2 where n_emp = 189; 2 where n_emp = 189;

SAL SAL
400000 330000

SQL > commit; SQL >


Commit coplete.

SQL > select sal from emp SQL > select sal from emp
2 where n_emp = 189; 2 where n_emp = 189;

SAL SAL
400000 400000

IV Criao e usa de tabelas

63
O comando SET AUTOCOMMIT ON do SQL*Plus faz com
que o commit seja executado automaticamente a cada
comando de manipulao de dados:

SQL > set feedback on


SQL > set autocommit on
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.

IV Criao e usa de tabelas

64
possvel determinar pontos de salvamento intermedirios
em transaes:

SQL > update conta


2 set saldo = saldo 10 determina um ponto de
3 where codigo = 1; salvamento

SQL > savepoint ja_tirou;

SQL > update conta


desfaz as modificaes feitas aps
2 set saldo = saldo + 10 o ponto de salvamento j_tirou
3 where codigo = 2;

SQL > rollback to ja_tirou;

IV Criao e usa de tabelas

65
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

os resultados sero
SQL > sempre iguais
SQL > select sal
2 from emp
3 where n_emp = 110;

SAL
300000

IV Criao e usa de tabelas

66
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 SAMANTA ... 20 Viso Emp_10


110 UBIRATAN ...20
175 PAULO ...10
N_EMP NOME_EMP ...N_DEP
189 RITA ...30
201 EVERALDO ...30 175 PAULO ... 10
208 SILVIO ...30 230 ANA ...10
230 ANA ...10
276 RENATO ...20

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

67
- convenincia: consultas complexas podem ser simplificadas
com a criao de vises

Emp
N_EMP NOME_EMP ...N_DEP Dep
103 SAMANTA ...20 N_DEP NOME_DEP
110 UIRATAN ...20
175 PAULO ...10 10 ADMINISTRAO
189 RITA ...30 20 PESQUISA
201 EVERALDO ...30 30 VENDAS
208 SILVIO ...30 40 PRODUO
230 ANA ...10
276 RENATO ...20 indicaes para o
dep. 20 apenas,
por motivos de
clareza

NOME NUM NUM_DEPTO NOME_DEPTO


Emp_Dep SAMANTA 103 20 PESQUISA
UBIRATAN 110 20 PESQUISA
PAULO 175 10 ADMINISTRAO
RITA 189 30 VENDAS
EVERALDO 201 30 VENDAS
SILVIO 208 30 VENDAS
ANA 230 10 ADMINISTRAO
RENATO 276 20 PESQUISA

o nome das colunas pode ser modificado

SQL > create view emp_dep ( nome, num, num_epto, nome_depto )


2 as select nome_emp, n_emp, dep.n_dep, nome_dep
3 from emp, dep
4 where emp.n_dep = dep.n_dep;

IV Criao e usa de tabelas

68
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? Type
NOME CHAR(10)
NUM NOT NULL NUMBER(4)
NUM_DEPTO NOT NULL NUMBER(2)
NOME_DEP CHAR(14)

Para consultar uma viso:


SQL > select * from emp_dep;

NOME NUM NUM_DEPTO NOME_DEPTO


SAMANTA 103 20 PESQUISA
UBIRATAN 110 20 PESQUISA
PAULO 175 10 ADMINISTRAO
RITA 189 30 VENDAS
EVERALDO 201 30 VENDAS
SILVIO 208 30 VENDAS
ANA 230 10 ADMINISTRAO
RENATO 276 20 PESQUISA

IV Criao e usa de tabelas

69
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 nome_dep
SAMANTA PESQUISA
UBIRATAN PESQUISA
PAULO ADMINISTRAO
RITA VENDAS
...

IV Criao e usa de tabelas

70
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

Para remover uma viso:

SQL > drop view emp_dep;

IV Criao e usa de tabelas

71
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;

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

IV Criao e usa de tabelas

72
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
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

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

11. Desfaa a ltima atualizao realizada.

IV Criao e usa de tabelas

74
V Gerao de Relatrios

75
V Contedo

1. Formatao de colunas

2. Formatao de ttulos

3. BREAK e COMPUTE

4. Parmetros de controle

5. Utilizao de variveis

6. Relatrios avanados

V Gerao de Relatrios

76
V.1 Formatao de colunas

Os comandos de formatao de colunas (formatao em geral)


do SQL*Plus so acumulativos

Sintaxe do comando COLUMN:


COLUMN coluna
ALIAS sinnimo
CLEAR
DEFAULT
FOLD_A[FTER]
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

V Gerao de Relatrios

77
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)

V Gerao de Relatrios

78
Exemplos de formatos disponveis para o comando COLUMN:

Formato Valor Resultado Observao


A20 Empregado Empregado
A5 Empregado Empre corta o resto
999.99 56.478 56.48 arredonda
999V99 56.478 5648 alinha pelo V
9,999 8410 8,410
99999 607 607
09999 607 00607
999 -5609 -5609
9999MI -5609 5609-
9999PR -5609 <5609>
B999 564
B999 0 brancos imprime brancos quando zero
99.99 124.98 # #.# # estouro
DATE 2441453 12/23/80 valor = data Juliana
EDATE 2441453 23/12/80

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

79
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 associadas
SQL > select nome_dep, nome_emp, 12*sal,com coluna 12*sal
2 from emp, dep
3 where emp.n_dep = dep.n_dep

salrio comisso
Departamento Empreg. anual adicional
ADMINISTRAO PAULO 6000000.00
ADMINISTRAO ANA 1440000.00
PESQUISA SAMANTA 1800000.00
PESQUISA UBIRATAN 3600000.00
PESQUISA RENATO 1200000.00
VENDAS RITA 3960000.00 5000.00
VENDAS SILVIO 1800000.00 9000.00
VENDAS EVERALDO 2400000.00 3000.00

V Gerao de Relatrios

80
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)

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

81
- TTITLE (BTITLE) param1 param2 ...

o paramN:

texto texto livre que aparecer no cabealho


&varivel imprime o valor de uma varivel no cabealho
COLn faz o prximo caracter na coluna n
SKIPn pula n linhas
LEFT alinha o texto seguinte esquerda
CENTER centraliza o texto seguinte
RIGHT alinha direita o texto seguinte
SQL.PNO imprime o nmero da pgina corrente
SQL.LNO imprime o nmero da linha corrente

V Gerao de Relatrios

82
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 RITA 330000
201 EVERALDO 200000
208 SILVIO 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`

V Gerao de Relatrios

83
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 repetio


grupo nome de uma coluna, expresso, ROW ou
REPORT

ao SKIP n, onde n um nmero de linhas a serem


puladas, SKIP PAGE ou PAGE; este
parmetro pode ser omitido

repetio NODUPLICATES (padro) ou


DUPLICATES: controla se os valores de grupo
duplicados so exibidos ou no

V Gerao de Relatrios

84
Exemplo:

SQL > break on nome_dep page on cargo skip 1


SQL > select nome_dep, cargo, nome_emp
2 from dep, emp
importante ordenar o resultado de
3 where dep.n_dep = emp.n_dep
acordo com os grupos formados!
4 order by nome_dep, cargo;

NOME_DEP CARGO NOME_EMP


ADMINISTRAO PRESIDENTE PAULO

SECRETARIA ANA
mudana
de pgina
NOME_DEP CARGO NOME_EMP
PESQUISA ANALISTA SAMANTA
REANATO

DIRETOR UBIRATAN

NOME_DEP CARGO NOME_EMP


VENDAS DIRETOR RITA

VENDEDOR SILVIO
EVERALDO

V Gerao de Relatrios

85
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

O comando BREAK no acumulativo co o comando


COLUMN

V Gerao de Relatrios

86
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


SQL > compute sum of sal on nome_dep
SQL > select dep.n_dep, nome_dep, nome_emp, sal
2 from dep, emp
3 where dep.n_dep = emp.n_dep
4 oeder by dep.n_dep;

N_DEP NOME_DEP NOME_EP SAL


10 ADMINISTRAO PAULO 500000.00
ANA 120000.00
****************

sum 620000.00

20 PESQUISA SAMANTA 150000.00


RENATO 100000.00
UBIRATAN 300000.00
***************
sum 550000.00

30 VENDAS RITA 330000.00


EVERALDO 200000.00
SILVIO 150000.00
***************
sum 680000.00

V Gerao de Relatrios

87
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

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

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

SQL > set pagesize 25


SQL > show pagesize
pagesize 25

V Gerao de Relatrios

89
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

COMPATIBILITY V5 | V6 fora compatibilidade com o RDMS


ORACLE V5 ou V6

CONCAT c | `.` | ON | OFF caractere de concatenao para


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

90
FEEDBACK n | 6 | ON | OFF nmero mnimo de linhas que precisam
ser selecionadas para haver impresso
do total de linhas

HEADING ON | OFF permite ou no a impresso de


cabealho de colunas

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

MAXDATE n 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

NUMFORMAT 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

SCAN ON | OFF liga ou desliga p procedimento de


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

91
SQLNUMBER 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

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 para


sublinhas o cabealho de colunas

VERIFY ON | OFF exibe ou no comandos SQL antes e


depois da substituio de variveis

WRAP ON | OFF o inverso do comando TRUNCATE

O comando SHOW ALL mostra o valor de todos ps parmetros

V Gerao de Relatrios

92
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

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

93
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 NOME_EMP
110 UBIRATAN
175 PAULO
189 RITA

aps a utilizao de uma varivel no previamente definida, seu


valor (fornecido pelo usurio) descartado

V Gerao de Relatrios

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

SQL > select nome_emp, sal


interao para ler o
2 from emp
valor da varivel
3 where n_dep = &&v_dep
Enter value for v_dep: 30
old 3: where n_dep = &&v_dep
new 3: where n_dep = 30

NOME_EMP SAL
RITA 330000
EVERALDO 200000
SILVIO 150000

SQL > run


1 select nome_emp, sal No h interao: a varivel
2 from emp Est permanentemente
3 where n_dep = &&v_dep definida
old 3: where n_dep = &&v_dep
new 3: where n_dep = 30

NOME_EMP SAL
RITA 330000
EVERALDO 200000
SILVIO 150000

V Gerao de Relatrios

95
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
3 where n_dep = &v_dep; especifica o tipo da varivel; podendo
oldo 3: where n_emp = &v_dep ser NUMBER ou CHAR
new 3: where n_emp = 30

NOME_EMP SAL
RITA 330000
EVERALDO 200000
SILVIO 150000

O comando PROMPT permite exibir informaes na tela:

SQL > prompt Relatorio de Empregados


Relatrios de Empregados
SQL >

V Gerao de Relatrios

96
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

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 segundo
sal > = &2; parmetro

V Gerao de Relatrios

97
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:

SQL > apool relat1 inicia armazenamento do resultado


no arquivo relat1.lst
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 NOME_EMP
175 PAULO
230 ANA

2 records selected.
termina o armazenamento e
imprime o resultado

SQL > spool out

V Gerao de Relatrios

98
Se o comando SPOOL OUT for substitudo por SPOOL OFF, o
arquivo de sada no ser impresso.

Para evitar que os prprios comandos e mensagens do


SQL*Plus sejam enviadas para o arquivo juntamente com o
relatrio.

SQL > set echo off


SQL > set verify off
SQL > set feedback off
SQL > spool relat1
SQL > start listaemp 10 10000

N_EMP NOME_EMP
175 PAULO
230 ANA
SQL > spool out

V Gerao de Relatrios

99
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;

N_EMP NOME_DEP NOME_EMP SAL


10 ADMINISTRAP PAULO $500,000.00
ANA $120,000.00

$620,000.00

20 PESQUISA SAMANTA $150,000.00


RENATO $100,000.00
UBIRATAN $300,000.00

$550,000.00

30 VENDAS RITA $330,000.00


EVERALDO $200,000.00
SILVIO $150,000.00

$680,000.00

V Gerao de Relatrios

100
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:

SQL > set echo off


SQL > set verify off
SQL > set feedback off
SQL > column PROCENT format 999.99
SQL > column sum(sal) new_value soma
SQL > rem calcula o valor de soma
SQL > select sum(sal) from emp;
SQL > rem calcula porcentagens dos salarios utilizando soma
SQL > select nome_emp, sal, 100 * sal / &soma PORCENT
2 from emp Indica a terceira expresso do
3 order by 3 desc; SELECT

SUM
1850000

NOME_EMP SAL PORCENT


PAULO 500000 27.03
RITA 330000 17.84
UBIRATAN 300000 16.22
EVERALDO 200000 10.81
SAMANTA 150000 8.11
SILVIO 150000 8.11
ANA 120000 6.49
RENATO 100000 5.41

V Gerao de Relatrios

101
vamos agora considerar o seguinte relatrio:

data de hoje
nmero da pgina

23/11/90 Relatorio de Empregados Pg. 3


Departamento: VENDAS

Num Nome Empregado Salrio Comisso Porc.


208 SILVIO $150,000.00 $9,000.00 5.66
189 RITA $330,000.00 $5,000.00 1.49
201 EVERALDO $200,000.00 $5,000.00 1.48

Departamento: VENDAS

departamento dos empregados


apresentados nesta pgina

V Gerao de Relatrios

102
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;

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

103
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

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;

V Gerao de Relatrios

104
Os comandos necessrios gerao do relatrio sendo
especificado poderiam (ou deveriam) estar armazenadas em um
arquivo do sistema operacional, RELATORIO.SQL:

set echo off


set pagasize 20
set linesize 75
set newpage 0
whenever sqlerror exit sql.sqlcode;
column n_emp format A 15 heading `Nome empregado`
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
break on nome_dep skip page
column nome_dep old_value vardep_ant new_value vardep_novo
column data new_value varhoje noprint
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

V Gerao de Relatrios

105
Dessa forma, o comando:

$ sqlplus s ora 1/senha1 @relatorio

- teria como efeito gerar o relatrio na impressora do


sistema

V Gerao de Relatrios

106
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

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

V Gerao de Relatrios

107
2. Faa um arquivo de comando SQL*Plus chamado ex52.sql de
forma que sua execuo exiba o seguinte resultado:

Relatorio de Empregados

Departamento Nome Cargo Salrio


ADMINISTRAO PAULO PRESIDENTE 500000
ANA SECRETARIA 120000
***************

avg 310000
sum 620000

PESQUISA SAMANTA ANALISTA 150000


UBIRATAN DIRETOR 300000
RENATO ANALISTA 100000
**************

avg 183333.333
sum 550000

VENDAS RITA DIRETOR 330000


SILVIO VENDEDOR 150000
EVERALDO VENDEDOR 200000
**************

avg 226666.667
sum 680000

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

108
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

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

109
VI Expresses e funes

110
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

111
VI.1 - Operadores

Operadores de valor:

+,- indicador de sinal WHERE X = -1


*,/ multiplicao e diviso SELECT 2 * X...
+,- soma e subtrao SELECT X + Y...
|| concatena strings SELECT `EMPREGADO`| | NOME_EMP

Operadores lgicos

= teste igualdade WHERE SAL = 100000


! =, < >, ^ = testa desigualdade WHERE SAL ! = 100000
>, > = testa maior (ou igual) WHERE SAL > 100000
<, < = testa menor (ou igual) WHERE SAL < = 100000

VI Expresses e funes

112
[NOT] IN teste de incluso ou CARGO IN (`ANALISTA`, VENDEDOR`)
excluso um conjunto

[NOT] teste de intervalo SAL BETWEEN 10000 AND 200000


BETWEEN
AND

[ NOT ] LIKE testa casamento de WHERE NOME_EMP LIKE `_X%`


padro

IS [ NOT ] testa valor nulo WHERE COM IS NULL


NULL

NOT inverte resusltado WHERE NOR ( SAL = 100000 )


lgico de expresses

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

VI Expresses e funes

113
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

VI Expresses e funes

114
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

VI Expresses e funes

115
VI.3 Funes de caracteres

T NOME Descrio/Exemplo
N ASCII(c) 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`

VI Expresses e funes

116
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 troca todas as ocorrncias de de_c em c


para_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`

VI Expresses e funes

117
C TRANSLATE(c, traduz c e substitui todos caracteres de c
de_c, para_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

VI Expresses e funes

118
VI.4 Funes de grupo

T Nome Descrio

N AVG([distinct | all] n) media de n; ignora valores nulos

N COUNT([distinct | all] nmero de linhas para as quais


expr | *) expr no nulo. * faz contar todas as
linhas selecionadas

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

VI Expresses e funes

119
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 cadeia e


caracteres contendo nmeros
hexadecimais

C ROWIDTOCHAR(rowid) converte um rowid para uma cadeia


de 18 caracteres

C TO_CHAR(n[,fmt]) ou converte o nmero n ou a data d para


TO_CHAR(d[,fmt]) 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

VI Expresses e funes

120
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

VI Expresses e funes

121
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
J 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:SS-
DD/MON/YYYY`)

VI Expresses e funes

122
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

VI Expresses e funes

123
VI.7 Outras funes

T Nome Descrio

* DECODE(expr, s1, r1, se expr for igual a algum s, ento


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

* DUMP(expr[, tipo[, mostra o valor de uma expresso no


posinic[, bytes]]]) 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;

VI Expresses e funes

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

VI Expresses e funes

125
VII Consultas avanadas

126
VII - Contedo

1. Pseudo-colunas

2. Juno externa

3. Auto-Juno

4. Consultas encaixadas

5. Consultas hierrquicas

VII Consultas avanadas

127
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


tabela com uma nica linha e
2 from dual;
uma nica coluna

SYSDATE USER ROWID


07-JAN-91 CURSO 00000984.0001.0001

VII Consultas avanadas

128
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 NOME_DEP N_EMP NOME_EMP


10 ADMINISTRAO 175 PAULO
10 ADMINISTRAO 230 ANA
20 PESQUISA 103 SAMANTA
20 PESQUISA 110 UBIRATAN
20 PESQUISA 276 RENATO
30 VENDAS 189 RITA
30 VENDAS 208 SILVIO
30 VENDAS 201 EVERALDO

PROBLEMA: Departamento 40 no aparece,


Pois no tem empregados

VII Consultas avanadas

129
NOME_EMP NOME_DEP EMP.N_DEP DEP.N_DEP
SAMANTA ADMINISTRAO 20 10
UBIRATAN ADMINISTRAO 20 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

VII Consultas avanadas

130
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 operador especial para
3 where dep.n_dep = emp.n_dep ( + ); juno externa

N_DEP NOME_DEP N_EMP NOME_EMP


10 ADMINISTRAO 175 PAULO
10 ADMINISTRAO 230 ANA
20 PESQUISA 103 SAMANTA
20 PESQUISA 110 UBIRATAN
20 PESQUISA 276 RENATO
30 VENDAS 189 RITA
30 VENDAS 208 SILVIO
30 VENDAS 201 EVERALDO
40 PRODUAO

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 NOME_DEP LOCAL_DEP


40 PRODUO SO BERNARDO

VII Consultas avanadas

131
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 SAL MAX(2*TRAB.SAL)


RITA 330000 400000
PAULA 500000 660000

VII Consultas avanadas

132
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:

parnteses delimitam a
SQL > select n_emp, nome_emp, sal
sub-consulta
2 from emp
3 where sal > (select avg(sal) from emp);

o resultado dessa sub-consulta


um nico valor

Para saber os departamentos que no tem empregados:


operador de excluso
de conjunto

SQL > select n_dep, nome_dep


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

N_DEP NOME_DEP
40 PRODUAO esta sub-consulta retorna
um conjunto de valores

VII Consultas avanadas

133
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


nesse caso necessrio o
2 from emp x
pseudnimo para a tabela
3 where sal > ( select avg(sal) from emp y
4 where x.n_dep = y.n_dep
5 order by n_dep;

N_DEP NOME_DEP SAL


10 PAULO 500000
20 UBIRATAN 300000
30 RITA 330000

VII Consultas avanadas

134
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 s importa se uma linha


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

VII Consultas avanadas

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

VII Consultas avanadas

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

VII Consultas avanadas

137
VII.5 Consultas hierrquicas

O Oracle permite recuperar informaes estruturas de forma


hierrquica (em arvore):

175 / PRESIDENTE

110 / DIRETOR 230 / SECRETARIA 189 / DIRETOR

103 / ANALISTA 276 / ANALISTA 201 / VENDEDOR 208 / VENDEDOR

N_EMP NOME_EMP CARGO CHEFE


103 SAMANTA ANALISTA 110
110 UBIRATAN DIRETOR 175
175 PAULO PRESIDENTE
189 RITA DIRETOR 175
201 EVERALDO VENDEDOR 189
208 SILVIO VENDEDOR 189
230 ANA SECRETARIA 175
276 RENATO ANALISTA 110

VII Consultas avanadas

138
Para saber todos os superiores de Everaldo:

SQL > select n_emp, nome_emp, cargo


indica o sentido da consulta:
2 from emp
do empregado para o chefe
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 NOME_EMP CARGO


189 RITA DIRETOR
175 PAULO 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 CARGO elimina toda uma


175 PAULO PRESIDENTE sub-rvore
110 UBIRATAN DIRETOR
189 RITA DIRETOR
201 EVERALDO VENDEDOR
208 SILVIO VENDEDOR
230 ANA SECRETARIA

VII Consultas avanadas

139
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 NOME
1 PAULO
2 UBIRATAN
3 SAMANTA
3 RENATO
2 RITA
3 EVERALDO
3 SILVIO
2 ANA

VII Consultas avanadas

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

VII Consultas avanadas

141
VIII Tpicos avanados

142
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

VIII Tpicos avanados

143
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

VIII Tpicos avanados

144
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

VIII Tpicos avanados

145
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 permite fazer referencia a esta tabela em uma


restrio de tabela ou coluna

>SELECT permite consultar tabela

>UPDATE (col1, permite atualizar as colunas col1, , coIN


..., coIN Se nenhuma coluna for especificada, ento
todas podero ser alteradas

>ALL permite todas as operaes acima


usurio nome do usurio. Se for especificado o pseudo-
usurio PUBLIC, ento todos os usurios tero
os privilgios em questo

VIII Tpicos avanados

146
WITH GRANT permite que um usurio com um determinado
OPITON 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;

VIII Tpicos avanados

147
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 nome do sinnimo a ser criado

tabela 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;

VIII Tpicos avanados

148
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, ... tabelas a serem bloqueadas

tipo tipo do bloqueio (explicaes vlidas na


presena de TPO)

>SHARE 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 equivale ao modo ROW SHARE, mantido


UPDATE para compatibilidade com verses anteriores
do ORACLE.

>ROW permite outros usurios alterem outras linhas


EXCLUSIVE individualmente, mas sem poder bloquear toda
a tabela de forma alguma (nem em modo
SHARE)

>SHARE ROW possibilita que um usurio execute mltiplas


EXCLUSIVE 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

149
>EXCLUSIVE permite que outros usurios faam consultas
tabela mas probe qualquer outra operao
sobre ela

NOWAIT 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)

VIII Tpicos avanados

150
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;

VIII Tpicos avanados

151
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 USURIO B

SQL > lock table emp SQL >


2 in exclusive mode; SQL >
SQL >
Table(s) Locked. SQL >
SQL >
SQL > SQL > lock table dep
SQL > 2 in exclusive mode;
SQL > Table(s) Locked.
SQL >
SQL > lock table dep SQL >
2 in exclusive mode; SQL >
SQL >
SQL >
SQL >
SQL > lock table emp
tempo que o usurio A 2 in exclusive mode;
esperou pela liberao da
tabela dep 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

VIII Tpicos avanados

152
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

VIII Tpicos avanados

153
Para remover um ndice:

DROP INDEX ndice [ON tabela]

ndice nome do ndice a ser removido

ON tabela 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;

o Oracle utilizar o
ndice emp_num

VIII Tpicos avanados

154
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 de dados so mantidos


automaticamente pelo Oracle.

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

VIII Tpicos avanados

155
O Oracle no aproveita ndices para colunas envolvidas em
expresses aritmticas:

SQL > select nome_emp from emp


usa ndice
2 where n_emp = 110;

SQL > select nome_emp from emp no usa ndice


2 where n_emp 110 = 0;

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

VIII Tpicos avanados

156
VIII.5 - Clusters

Cluster uma caracterstica que permite que vrias tabelas


relacionadas sejam agrupadas fisicamente no banco de dados

Emp
N_EMP NOME_EMP ...N_DEP Dep
103 SAMANTA ...20 N_DEP NOME_DEP
110 UIRATAN ...20
175 PAULO ...10 10 ADMINISTRAO
189 RITA ...30 20 PESQUISA
201 EVERALDO ...30 30 VENDAS
208 SILVIO ...30 40 PRODUO
230 ANA ...10
276 RENATO ...20

o departamento e seus
empregados esto
fisicamente agrupados
Cluster Emp_Dep
10 ADMINISTRAO SAO PAULO
175 PAULO PRESIDENTE - 27-FEB-86 ...
230 ANA SECRETARIA 175 01-MAY-89 ...

20 PESQUISA CAMPINAS
103 SAMANTA ANALISTA 110 17-MAR-85 ...
110 UBIRATAN DIRETOR 175 20-APR-85 ...
276 RENATO ANALISTA 110 30-APR-86 ...

30 VENDAS BRASILIA
189 RITA DIRETOR 175 25-DEC-85 ...
201 EVERALDO VENDEDOR 189 28-SEP-86 ...
208 SILVIO VENDEDOR 189 30-OCT-86 ...

40 PRODUO SAO BERNARDO

VIII Tpicos avanados

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

VIII Tpicos avanados

158
Para criar um cluster:

CREATE CLUSTER cluster (col1 tipo1, ...)

cluster nome do cluster a ser criado


col1 tipo1, ... 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;

VIII Tpicos avanados

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

VIII Tpicos avanados

160
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

VIII Tpicos avanados

161
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 colunas que possuem ndices em todas as


NS tabelas acessveis

ALL_SYNONYMS sinnimos privados e pblicos

ALL_TABLES descrio das tabelas acessveis ou usurio

ALL_TAB_COLUM especificao das colunas de todas tabelas que


NS o usurio tem acesso, incluindo o dicionrio de
dados

ALL_TAB_COMENTS comentrios sobre tabelas e vises acessveis


ao usurio

ALL_TAB_GRAN listas de permisses de acesso recebidas pelo


TS_RECD usurio (GRANT)

ALL_USERS lista dos usurios Oracle

ALL_VIEWS lista das vises que o usurio tem acesso

VIII Tpicos avanados

162
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

VIII Tpicos avanados

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

SQL > select table_name, table_type

TABLE_NAME TABLE_TYPE
DEP TABLE
DEP_SAL VIEW
EMP TABLE
EMP_DEP VIEW
EMP_DIA VIEW
FAIXA_DIA TABLE
JOAO_ALU SYNONYM
PROJ TABLE
PROJ_DEP CLUSTER
SAL_MEDIO TABLE

VIII Tpicos avanados

164
Para saber todos as tabelas, sinnimos, seqncias e vises s
quais voc tem acesso:

SQL > select table_name, owner, table_type from all_catalog;

TABLE_NAME OWNER TABLE_TYPE


ALUNO JOAO TABLE
DEP CURSO TABLE
DEP_SAL CURSO VIEW
EMP CURSO TABLE
EMP_DEP CURSO VIEW
EMP_DIA CURSO VIEW
FAIXA_SAL CURSO TABLE
FRANQUIAS JOAQUIM TABLE
ITEM_PED JOAO TABLE
PEDIDO JOAO TABLE
PRODUTO JOAO TABLE
PROJ CURSO TABLE
SAL_MEDIO CURSO 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 TABLE_NAME COLUMN_NAME


EMP_NUM EMP N_EMP
EMP_NOME EMP NOME_EMP

VIII Tpicos avanados

165
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 TAB A D N I S U R
JOAO PRODUTO Y Y Y Y Y Y Y
JOAO ALUNO Y Y Y Y
JOAQUIM FRANQUIAS Y Y
JOAO PEDIDO Y Y Y Y Y
JOAO ITEM_PED Y Y Y Y Y

VIII Tpicos avanados

166
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 COMMENTS
EMP 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 COMMENTS
NOME:EMP Nome do empregado
CHEFE cdigo do chefe desta pessoa

VIII Tpicos avanados

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

VIII Tpicos avanados

168
AP. A Tabelas utilizadas

169
Tabelas:

SQL > DESCRIBE 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)

Contedo:
N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP
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 01-MAY-89 120000 10
276 RENATO ANALISTA 110 30-APR-86 100000 1000 20

Ap. A Tabelas utilizadas

170
SQL > DESCRIBE dep
Name Null? Type
N_DEP NOT NULL NUMBER(2)
NOME_DEP NOT NULL CHAR(14)
LOCAL_DEP CHAR(13)

Contedo:

N_EMP NOME_DEP LOCAL_DEP


10 ADMINISTRAO SAO PAULO
20 PESQUISA CAMPINAS
30 VENDAS BRASILIA
40 PRODUO SAO BERNARDO

SQL > DESCRIBE faixa_sal

Name Null? Type


SALMIX NOT NULL NUMBER(11,2)
SALMAX NOT NULL NUMBER(11,2)
FAIXA NOT NULL CHAR(1)

Contedo:

SALMIN SALMAX F
1 99999 A
100000 149999 B
150000 199999 C
200000 399999 D
400000 800000 E

Ap. A Tabelas utilizadas

171
SQL > DESCRIBE proj

Name Null? Type


NOME NOR NULL CHAR(30)
ENDER CHAR(50)
CIDADE CHAR(35)
ESTADO CHAR(2)
CEP NUMBER(5)
ANIVERSARIO DATE

SQL > DESCRIBE sal_mdio

Name Null? Type


NOME_DEP NOT NULL CHAR(14)
Number_Salario NUMBER

SQL > DESCRIBE proj

Name Null? Type.


N_PROJ NOT NULL NUMBER(5)
NOME_PROJ CHAR(20)
N_DEP NOT_NULL NUMBER(2)

Ap. A Tabelas utilizadas

172
Vises:

SQL > DESCREBE dep_sal

Name Null? Type


NOME_DEP NOT NULL CHAR(14)
NUM_FUNC NUMBER
SAL_MIN NUMBER
SAL_MED NUMBER
SAL_MAX NUMBER

SQL > DESCRIBE emp_dep

Name Null? Type


NOME NOT NULL CHAR(10)
NUM NOT NULL NUMBER(4)
NUM_DEPTO NOT NULL NUMBER(2)
NOME_DEPTO NOT NULL CHAR(14)

SQL > DESCRIBE emp_dia

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)

Ap. A Tabelas utilizadas

173
Ap. B Sumrio dos Comandos

174
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 cria um cluster que pode conter uma ou mais
CLUSTER tabela
CREATE INDEX cria um ndice para uma tabela
CREATE cria uma seqncia numrica gerada
SEQUENCE automaticamente
CREATE cria um sinnimo para uma tabela ou viso
SYNONYM
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
DROP objeto remove um cluster, tabela, viso, etc. do
banco de dados
GRANT cria usurios, atribui senhas, e fornece
privilgios de acesso a tabelas e vises
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

175
SAVEPOINT determina um ponto de salvamento
intermedirio para a transao
SELECT realiza uma consulta
SET determina um ponto intermedirio de
TRANSACTION salvamento de transaes
UPDATE altera valores de campos de uma tabela

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
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 conecta
novamente ao ORACLE
DEFINE define uma varivel e atribui um valor a ela

Ap. B Sumrio dos Comandos

176
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 sobre comandos SQL e
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
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

177
AP. C Resposta dos exerccios

178
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`);

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

Ap. C Resposta dos exerccios

179
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`

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

180
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;

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

181
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;

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

Ap. C Resposta dos exerccios

182
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;

IV.11:
rollback;

Ap. C Resposta dos exerccios

183
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;

Ap. C Resposta dos exerccios

184
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;

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

Ap. C Resposta dos exerccios

185
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;

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

186
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;

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

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

VII.6:

rollback;

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

Ap. C Resposta dos exerccios

188
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;

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

189

You might also like