Você está na página 1de 189

Índice

Conteúdo 3
I Introdução
- 4
1.1 Objetivos do curso
- 5
1.2 O que é SQL*Plus- 6
II Comandos SQL e SQL*Plus
- 7
II-Conteúdo 8
11.1 Ativação do SQL*Plus - 9
11.2 Criação de tabelas - 10
11.3 Manipulação de tabelas - 12
11.4 Formatação de relatórios
- 16
11.5 Edição de comandos - 17
11.6 Outros comandos - 22
II Exercícios
- 23
III Consultas básicas
- 24
111-Conteúdo 25
111.1 Seleção de colunas - 26
111.2- Uso de expressões 27
111.3 Seleção de linhas - 29
111.4 Ordenação de resultados - 31
111.5 Agrupamento - 33
111.6 Operações de conjunto - 35
111.7 Junção de tabelas - 39
III Exercícios - 44
IV- Criação e uso de tabelas 45
1V-Conteúdo 46
1V.1 -CREATETABLE 47
IV.2 Tipos de colunas - 51
IV.3 Alteração 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 transações - 59
lV.8 Manipulação de visões - 67
IV.9 Criação de seqüências - 72
IV Exercícios - 73
V -Geração de Relatórios 75
V Conteúdo - 76
V.1 - Formatação de colunas 77
V.2 - Formatação de títulos 80
V.3 - BREAK e COMPUTE 84
V.4 - Parâmetros de controle 89
V.5 - Utilização de variáveis 93
V.6 - Relatórios avançados 98

1
V Exercícios
- 107
VI Expressões e funções
- 110
VI- Conteúdo 111
VI.1 Operadores - 112
Vl.2 Funções numéricas
- 114
VI.3 Funções de caracteres
- 116
VI.4 Funções de grupo
- 119
VI.5 Conversão entre tipos
- 120
VI.6 Funções de datas
- 123
Vl.7 Outras funções - 124
VI Exercícios
– 125
VII Consultas avançadas
- 126
VII-Conteúdo 127
VII.1 Pseudo-colunas - 128
VII.2 Junção externa - 129
VII.3 Auto-Junção - 132
VII.4 Consultas encaixadas - 133
VII.5 Consultas hierárquicas- 138
VII Exercícios - 141
VIII Tópicos avançados
- 142
VIII Conteúdo - 143
VIII.1 Manutenção de usuários - 144
VllI.2 Privilégios de acesso - 146
VIII.3 Acesso concorrente - 149
VIII.4 lndices - 153
VIII.5 Clusters - 157
VIII.6 Dicionário de dados - 162
VIII Exercícios - 168
Ap. A- Tabelas utilizadas 169
Ap. B- Sumário dos Comandos 174
Ap. C- Resposta dos exercícios 178

2
Conteúdo

I – Introdução

II – Comando SQL e SQL*Plus

III – Consultas básicas

IV – Criação e uso de tabelas

V – Geração de relatórios

VI – Expressão e Funções

VII – Consultas avançadas

VIII – Tópicos avançados

Apêndice A – Tabelas utilizadas

Apêndice B – Sumário dos comandos

3
I – Introdução

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 informações de um


banco de dados

- Gerar relatórios a partir de consultas

- Gerenciar a segurança e o desempenho de um banco de


dados

I – Introdução

5
I.2 – O que é SQL*Plus

• É a interface básica para manipulações genéticas de um banco


de dados ORACLE

O SQL +
comando
SQL*PLUS
Parâmetros de
SQL
BD
do controle Controle de
ORACLE
formatação

• Características principais:

- interpretador de comando SQL

- possui extensões para formatação de relatórios

I – Introdução

6
II – Comandos SQL e SQL*Plus

7
II - Conteúdo

1. Ativação do SQL*Plus

2. Criação de tabelas

3. Manipulação de tabelas

4. Formatação de relatórios

5. Edição de comandos

6. Outros comandos

II – Comandos SQL e SQL*Plus

8
II.1 – Ativação 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 não é 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 – Criação 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 definições
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 continuação do comando

Somente o cabeçalho

N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP

II – Comandos SQL e SQL*Plus

11
II.3 Manipulação de tabelas

• Para inserir informações 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 informações 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 são


analistas:

Nome da coluna

SQL > select nome_emp


2 from emp Condição a ser satisfeita

3 where cargo = ´ANALISTA`;

NOME_EMP
Maiúsculas e minúsculas somente
SAMANTA fazem diferença
RENATO entre ``(aspas simples)

II – Comandos SQL e SQL*Plus

13
• Para remover o empregado de número 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 salário do funcionário 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 Formatação de relatórios

• Comandos SQL x Comandos SQL*Plus

- SQL – acesso ao banco de dados

- SQL*Plus – formato de apresentação dos resultados,


basicamente.

• Para produzir um relatório com o nº, nome e salário de todos os


funcionários:

SQL > column n_emp heading NUMERO


Comandos SQL*Plus não
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 – Edição de comandos

• O ultimo comando SQL (não SQL*Plus) fica armazenado no


buffer de edição do SQL*Plus

• Para listar o conteúdo do buffer:

SQL > list


Qualquer em desses comando
ou
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 após 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 inserção
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 utilização de outros buffers além 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 conteúdo do buffer corrente com um editor


externo:
SQL > edit

• O editor externo pode ser especificado pelo usuário 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 extensão .sql é


acrescentada automaticamente

• Para recuperar um comando SQL armazenado num arquivo:


SQL > get arquivo

• Para executar um seqüência 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 extensão “.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 disponíveis:

SQL > help commands

II – Comandos SQL e SQL*Plus

22
II - Exercícios

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 página 11

2. Insira dados sobre você e algum membro da sua família na tabela


ALUNO
(dica: exemplos na página 12)

3. Consulte o nome e a data de aniversário das pessoas cadastradas


(dica: exemplo na página 13)

4. Consulte o seu (e somente o seu ) endereço 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 básicas

24
III - Conteúdo

1. Seleção de colunas

2. Uso de expressões

3. Seleção de linhas

4. Ordenação de resultados

5. Agrupamento

6. Operação de conjunto

7. Junção de tabelas

III – Consultas básicas

25
III.1 – Seleção 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 são especificadas muda a


apresentação 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 básicas

26
III.2 – Uso de expressões

• Para saber o salário 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 básicas

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 básicas

28
III.3 – Seleção 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 básicas

29
• Para saber o tempo de serviço dos funcionários cuja comissão é
maior que 5% do salário:

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 básicas

30
III.4 – Ordenação de resultados

• Para listar os funcionários em ordem alfabética:

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 básicas

31
• Para listar os empregados em ordem decrescente de salário, 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 expressões ou referencias à posição de expressões


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ª expressão do
SELECT, que é
“length(cargo)”

III – Consultas básicas

32
III.5 - Agrupamento
• Para saber quantos funcionários 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 funcionários trabalham em cada 2
175 PAULO PRESIDENTE 27-FEB-86 500000 10
departamento:
103 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 Função de grupo
3 group by n_dep;

critério de agrupamento
N_DEP COUNT(*)
10 2
20 3
30 3

• Nota: omitir a cláusula “GROUP BY” significa agrupar toda a


tabela

III – Consultas básicas

33
• Para saber a soma dos salários para os cargos onde a média de
salários é 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 função de grupo


(“where” de grupo)

CARGO SUM(SAL) MAS(SAL)


DIRETOR 630000 330000
PRESIDENTE 500000 500000
VENDEDOR 350000 200000

III – Consultas básicas

34
III.6 – Operações de conjunto
• Uma tabela pode ser encerada como um conjunto

• Os elementos do conjunto são 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 três operações básicas de conjunto em SQL:

- união (UNION)

- intersecção (INTERSECT)

- diferença (MINUS)

III – Consultas básicas

35
• União:

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 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 básicas

36
• Intersecção:

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 básicas

37
• Diferença:

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

select col1, col2 from tab2

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

III – Consultas básicas

38
III.7 – Junção de tabelas

• A junção de tabelas corresponde à operação 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 básicas

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; critério de seleção da junção

para diferenciar coluna de


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

NOME_EMP NOME_DEP
PAULO ADMINISTRAÇÃO
ANA ADMINISTRAÇÃO
SAMANTA PESQUISA
UBIRITAN PESQUISA
RENATO PESQUISA
RITA VENDAS
SILVIO VENDAS
EVERALDO VENDAS

III – Consultas básicas

40
NOME_EMP NOME_DEP EMP.N_DEP DEP.N_DEP
SAMANTA ADMINISTRAÇÃO 20 10
UBIRATAN ADMINISTRAÇÃO 20 10
UBIRATAN ADMINISTRAÇÃO 20 10
PAULO ADMINISTRAÇÃO 10 10
RITA ADMINISTRAÇÃO 30 10
EVERALDO ADMINISTRAÇÃO 30 10
SILVIO ADMINISTRAÇÃO 30 10

ANA ADMINISTRAÇÃO 10 10
RENATO ADMINISTRAÇÃO 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 PRODUÇÃO 10 40
PAULO PRODUÇÃO 10 40
RITA PRODUÇÃO 30 40
EVERALDO PRODUÇÃO 30 40
SILVIO PRODUÇÃO 30 40
ANA PRODUÇÃO 10 40
RENATO PRODUÇÃO 20 40

III – Consultas básicas

41
• Dada a tabela FAIXA_SAL, que classifica faixas de salários:

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 junção
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 básicas

42
• Pode-se combinar diversas opções 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(*)
ADMINISTRAÇÃO E 1
PESQUISA C 1
PESQUISA D 1
VENDAS D 2
VENDAS C 1

III – Consultas básicas

43
III - Exercícios

1. Consulte o cargo, o nome e o salário por hora (assumindo 160


horas/mês) de todos os funcionários da tabela EMP; salve seu
exercício no arquivo “ex31.sql”.

2. Consulte o nome e o total mensal (salário mais comissão)


recebido pelos vendedores da tabela EMP.

3. Carregue o conteúdo do arquivo “ex31.sql” no buffer corrente e


modifique-o de forma a ordenar o resultado em ordem
decrescente do salário por hora; salve seu exercício novamente,
no mesmo arquivo.

4. Descubra o menor salário de todos os empregados. Dica: vela a


nora da página 33.

5. Descubra o menor, o maior e a média dos salários de cada


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

6. Consulte o nome e o departamento de todos os empregados que


trabalham em São Paulo ou Campinas; salve sei exercícios no
arquivo “ex36.sql”. Dica: faça uma junção da tabela EMP com a
tabela DEP (página 42), e recupere somente as linhas onde a
localidade do departamento é São Paulo ou Campinas.

III – Consultas básicas

44
IV – Criação e uso de tabelas

45
IV – Conteúdo

1. CREATE TABLE

2. Tipos de colunas

3. Alteração de uma tabela

4. O comando INSERT

5. O comando DELETE

6. O comando UPDATE

7. Controle de transações

8. Manipulação de visões

9. Criação de seqüências

IV – Criação e uso de tabelas

46
IV.1 – CREATE TABLE

• O comando CREATE TABLE é usado para criar novas tabelas


no banco de dados
especificação do tamanho
entre parênteses
- Forma 1:

CREATE TABLE nome_da_tabela


Definição das
(
colunas separadas
coluna_1 tipo1, por “,”
coluna_2 tipo2( tamanho ),
coluna_3 tipo3 restrições,
coluna_4 tipo4( tamanho ) restrições
restrições
);

» 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
» restrições uma combinação de zero ou mais de:
>NULL ou NOT indica que a coluna pode conter
valores nulos (opção “default”) ou não

>DEFAULT expr determina o valor “default” da coluna


como sendo expr

>UNIQUE indica que não podem existir valores


duplicados para esta coluna. Não pose
ser usado com PRIMARY KEY

>PRIMARY KEY indica que esta coluna é chave primaria.


Não pode ser usado com UNIQUE.

IV – Criação e uso de tabelas

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

>CHECK determina que o valor desta coluna deve


condição obedecer á condição lógica especificada

>CONSTRAINT determina que o valor desta coluna deve


nome_restr obedecer à restrições nome_restr

 OBS: Embora todas as restrições acima possam ser definidas, o


RDBMS ORACLE versão 6 só garante a primeira: NULL ou
NOT NULL. Entretanto, o SQL*Forms 3.0 é capaz de gerar
código automaticamente para vários tipos de restrições.

 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 – Criação 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_médio 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_médio;

NOME_DEP Media_Salário
ADMINISTRAÇÃO 310000
PESQUISA 183333.333
VENDAS 226666.667

IV – Criação 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 – Criação e uso de tabelas

50
IV.2 – Tipos de colunas

• O Oracle suporta os seguintes tipos:

 CHAR [(tamanho)]

 VARCHAR [(tamanho)] (sinônimo de CHAR)

 CHARACTER [(tamanho)] (sinônimo de CHAR)

 DATE

 NUMBER [(tamanho [, decimais] )]

 DECIMAL [(tamanho [, decimais] )]

 INTEGER, INT (sinônimos de NUMBER)

 NUMERIC, DEC (sinônimo de DECIAMAL)

 FLOAT [(tamanho)]

 REAL

 DOBLE PRECISION

 LONG

 RAW (tamanho), LONG RAW

IV – Criação e uso de tabelas

51
IV.3 – Alteração 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 – Criação e uso de tabelas

52
• Restrições para a alteração da estrutura de uma tabela:

- Não se pode adicionar colunas não nulas (NOT NULL)


em tabelas que já possuem linhas.

- Só é possível diminuir o tamanho de uma coluna, ou


mudar seu tipo, se todos os valores desta coluna forem
nulos.

- Só é possível alterar o tipo de uma coluna para “NOT


NULL” se nenhum dos seus valores for nulo.

- Não é possível 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 – Criação 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 serão inseridos

»col1, col2, ... coln lista de colunas nas quais serão inseridos os
valores. Será inserido o valor NULL nas colunas não
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 – Criação 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 expressões 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 – Criação e uso de tabelas

55
IV.5 – Comando DELETE

• O comando DELETE é usado para remover linhas de uma


tabela:

DELETE FROM tabela WHERE condição

»tabela nome da tabela de onde serão removidas as linhas

»condição condição 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 – Criação 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 condição

ou

UPDATE tabela
SET ( col1 [, col2 ...] ) = ( consulta )
WHERE condição

»tabela nome da tabela a ser atualizada

»col1, col2, ... coln colunas cujos valores serão alterados

»exp1, exp2, ... expn expressões cujos resultados serão atribuídos às


colunas col1, ... coln respectivamente

»consulta consultas que deve retornar o mesmo número de


colunas especificas na cláusula SET

»condição especifica as linha que serão atualizadas

IV – Criação e uso de tabelas

57
• Exemplos

- Para colocar 1000 de comissão para o funcionário de número


208:

SQL > update emp


2 set com = 1000
3 where n_emp = 208;

- Para dobrar o salário 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 salário do funcionário 208 como sendo o


salário 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 – Criação e uso de tabelas

58
IV.7 – Controle de transações

• Uma transação é uma seqüência “indivisível” de comandos SQL


que modifica o conteúdo 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 operação acima seja segura, ou os dois passos são


executados ou nenhum deles pode ocorrer.

IV – Criação e uso de tabelas

59
• O início de uma transação é determinado pelo primeiro
comando de manipulação de dados (INSERT, UPDATE,
DELETE) desde o fim da última transação ou inicio da seção
corrente.

• O fim de uma transação é determinada de uma das seguintes


formas:

- execução do comando COMMIT, todas as modificações


são efetivadas no banco de dados

- execução do comando ROLLBACK; nenhuma


modificação é efetivada

- execução de comando de definição de dados (CREATE,


ALTER, ...); equivale ao comando COMMIT

- término da sessão corrente: equivale ao comando


COMMIT

- quando uma transação é interrompida por fatores externos


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

IV – Criação 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 ADMINISTRAÇÃO
20 PESQUISA
30 VENDAS Início de uma transação
40 PRODUÇÃO

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 próprio usuário vê os dados, mas


eles ainda não foram efetivados
10 ADMINISTRAÇÃO
20 PESQUISA
30 VENDAS
40 PRODUÇÃO
50 MARKETING fim da transação, com
60 INFORMATICA efetivação dos dados

SQL > commit;


Commit complete.

IV – Criação 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; Início de outra
transação

NOME_DEP fim da transação; as


COMERCIAL atualizações 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. transação
SQL > delete from emp
2 where n_dep = 10; Fim da ultima transação
SQL > exit Com COMMIT implícito

IV – Criação e usa de tabelas

62
• Observações

- Uma transação ou é executada totalmente ou não é


executada; não existe transação parcialmente executada,
por definição.

- As modificações efetuadas no decorrer de uma transação


por um usuário só são visíveis a outros usuários após a
efetivação da transação (COMMIT).

USUÁRIO 1 USUÁRIO 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 – Criação 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 manipulação 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 – Criação e usa de tabelas

64
• É possível determinar pontos de salvamento intermediários
em transações:

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 modificações feitas após
2 set saldo = saldo + 10 o ponto de salvamento “ já_tirou”
3 where codigo = 2;

SQL > rollback to ja_tirou;

IV – Criação e usa de tabelas

65
• Para garantir que vários comandos SELECT recuperem
sempre os mesmo dados, independentemente de transações
concorrentes:

SQL > set transction read only;


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

SAL
300000

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

SAL
300000

IV – Criação e usa de tabelas

66
IV.8 – Manipulação de visões

• Uma visão é como uma janela que permite visualizar ao


modificar seletivamente informações armazenadas em
tabelas.

• Visões são utilizadas por:

- segurança: pode-se restringir o acesso a informações


contidas em tabelas

Tabela Emp
N_EMP NOME_EMP ...N_DEP

103 SAMANTA ... 20 Visão 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 definição) são


herdadas da tabela origem

SQL > create view emp_10 as


2 select * from emp
3 where n_dep = 10;

IV – Criação e usa de tabelas

67
- conveniência: consultas complexas podem ser simplificadas
com a criação de visões

Emp
N_EMP NOME_EMP ...N_DEP Dep
103 SAMANTA ...20 N_DEP NOME_DEP
110 UIRATAN ...20
175 PAULO ...10 10 ADMINISTRAÇÃO
189 RITA ...30 20 PESQUISA
201 EVERALDO ...30 30 VENDAS
208 SILVIO ...30 40 PRODUÇÃO
230 ANA ...10
276 RENATO ...20 indicações para o
dep. 20 apenas,
por motivos de
clareza

Emp_Dep NOME NUM NUM_DEPTO NOME_DEPTO


SAMANTA 103 20 PESQUISA
UBIRATAN 110 20 PESQUISA
PAULO 175 10 ADMINISTRAÇÃO
RITA 189 30 VENDAS
EVERALDO 201 30 VENDAS
SILVIO 208 30 VENDAS
ANA 230 10 ADMINISTRAÇÃO
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 – Criação e usa de tabelas

68
• Uma visão é considerada uma tabela virtual, isto é, funciona
como uma tabela mas não contem dados. Os dados de uma visão
são calculados a partir de outras tabelas (ou visões!).

• Para descrever a estrutura de uma visão:

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 visão:

SQL > select * from emp_dep;

NOME NUM NUM_DEPTO NOME_DEPTO


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

IV – Criação e usa de tabelas

69
• Uma visão pode ser criada em temo de execução:
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 ADMINISTRAÇÃO
RITA VENDAS
...

IV – Criação e usa de tabelas

70
• Somente é possível atualizar (INSERT, DELERE, UPDATE)
informações em visões que:

- estão baseadas em uma única tabela

- fazem referência a todas as colunas não nulas (NOT


NULL) da tabela

- recuperam todas as colunas diretamente, sem nenhuma


expressão

• A visão EMP_10 pode ser atualizada, ao contrário da visão


EMP_DEP, que é baseada em duas tabelas

• Para visualizar a consulta que define uma visão:


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 visão:

SQL > drop view emp_dep;

IV – Criação e usa de tabelas

71
IV.9 – Criação de seqüências

• É possível definir seqüências numéricas 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 seqüência 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 – Criação e usa de tabelas

72
IV - Exercícios

1. Crie uma tabela EMPREG que contém os dados das colunas


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

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


remova.

3. altere a estrutura da tabela ALUNO criada no exercício 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


numérico de 9 dígitos na parte inteira e 2 casas decimais.
Dica: lembre-se que o tamanho de um numero é dado pela
soma dos dígitos na parte inteira com os dígitos 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 salário desejado e o endereço completo da pessoa


cadastrada no exercício anterior.

6. Remova o atributo SAL_DESEJADO da tabela ALUNO. Dica:


veja a página 54.

7. Remova os dados da pessoa cadastrada no exercício 4 e efetive


sua transação.

IV – Criação e usa de tabelas

73
8. Crie uma visão chamada DEP_SAL baseada nas tabelas EMP e
DEP, contendo as seguintes informações:

- Nome do departamento (NOME_DEP)


- Numero de funcionários (NUM_FUNC)
- Salário mínimo (SAL_MIN)
- salário médio (SAL_MED)
- salário Maximo (SAL_MAX)

dica: primeiro faça uma consulta que retorna os dados acima,


para depois criar uma visão baseada nessa consulta

9. Verifique a estrutura da visão DEP_SAL com o comando


DESCRIBE e depois consulte todos os seus dados.

10. Atualize o salário de SAMANTA para 300000 e consulte


a visão DEP_SAL novamente.

11. Desfaça a última atualização realizada.

IV – Criação e usa de tabelas

74
V – Geração de Relatórios

75
V – Conteúdo

1. Formatação de colunas

2. Formatação de títulos

3. BREAK e COMPUTE

4. Parâmetros de controle

5. Utilização de variáveis

6. Relatórios avançados

V – Geração de Relatórios

76
V.1 – Formatação de colunas

• Os comandos de formatação de colunas (formatação em geral)


do SQL*Plus são acumulativos

• Sintaxe do comando COLUMN:


COLUMN coluna
ALIAS sinônimo
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 – Geração de Relatórios

77
»coluna nome de uma coluna ou expressão especificada no
comando SELECT, tal qual aparece no cabeçalho do
resultado do comando.

»sinônimo nome de uma outra coluna da qual serão copiadas as


especificações de formatação

»formato formato de apresentação do conteúdo de uma coluna

»texto texto a ser apresentado como cabeçalho de uma


coluna

»nulo texto a ser exibido quando o conteúdo de uma coluna


for nulo

»var nome de uma variável (será explicado adiante)

V – Geração de Relatórios

78
• Exemplos de formatos disponíveis para o comando COLUMN:

Formato Valor Resultado Observação


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 definições daquela coluna (ou de todas as
coluna)

• O comando CLEAR COLUMN elimina todas as definições de


uma coluna

V – Geração de Relatórios

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 `comissão | adicional`format 9999-99
SQL > column 12*sal g~heading `salario| anual`
definições acumulativas
SQl > column 12*sal
column 12*sal ON
Pula uma linha
heading `salario | anual`headsep `|`
format 999999999.99
exibe as definições 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

salário comissão
Departamento Empreg. anual adicional
ADMINISTRAÇÃO PAULO 6000000.00
ADMINISTRAÇÃO 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 – Geração de Relatórios

80
V.2 – Formatação de títulos

• É possível definir o cabeçalho (TTITLE) e o rodapé (BTITLE)


das páginas de uma consulta:

- TTITLE (BTITLE) “texto”

o define o texto como cabeçalho (rodapé), podendo


conter “|” para pular linhas
o este formato acrescenta data e numeração de página
automaticamente
o só existe para manter compatibilidade com versões
antigas

- TTITLE (BTITLE)

o mostra a definições corrente

- TTITLE (BTITLE) OFF

o desabilita a exibição do cabeçalho (rodapé)

- TTIBLE (BTITLE) ON

o habilita a exibição do cabeçalho (rodapé)

V – Geração de Relatórios

81
- TTITLE (BTITLE) param1 param2 ...

o paramN:

» “texto” texto livre que aparecerá no cabeçalho


»&variável imprime o valor de uma variável no cabeçalho
»COLn faz o próximo 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 número da página corrente
»SQL.LNO imprime o número da linha corrente

V – Geração de Relatórios

82
• Exemplo:

SQL > ttitle center `25 de dezemvro de 1990`skip col 6 –


> `Relatório 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
Relatório 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 –
`Relatório de Empregados – Departamento de Pessoal`

V – Geração de Relatórios

83
V.3 – BREAK e COMPUTE

• O comando BREAK permite organizar grupos de linhas de um


relatório
• É possível definir ações a serem executadas no fim de cada
grupo controlado pelo comando BREAK:
BREAK ON controle1 ON controle2 ... ON controleN

»controleN grupo ação repetição


»grupo nome de uma coluna, expressão, ROW ou
REPORT

»ação SKIP n, onde n é um número de linhas a serem


puladas, SKIP PAGE ou PAGE; este
parâmetro pode ser omitido

»repetição NODUPLICATES (padrão) ou


DUPLICATES: controla se os valores de grupo
duplicados são exibidos ou não

V – Geração de Relatórios

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


ADMINISTRAÇÃO PRESIDENTE PAULO

SECRETARIA ANA
mudança
de página
NOME_DEP CARGO NOME_EMP
PESQUISA ANALISTA SAMANTA
REANATO

DIRETOR UBIRATAN

NOME_DEP CARGO NOME_EMP


VENDAS DIRETOR RITA

VENDEDOR SILVIO
EVERALDO

V – Geração de Relatórios

85
• Para mostrar as definições correntes:

SQL > brek


break on nome_dep page 1 nodup
on cargo skip 1 nodup

• Para eliminar as definições de grupo:

SQL > clear break

• O comando BREAK não é acumulativo côo o comando


COLUMN

V – Geração de Relatórios

86
• O comando COMPUTE permite realizar cálculos 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 ADMINISTRAÇÃO 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 – Geração de Relatórios

87
• Sintaxe do comando:

COMPUTE operação1 ... OF operando1 ... ON


evento_break

»opearaçãoN uma das seguintes operações: COUNT, SUM, AVG,


MIN, MAX,STD, NUM, VAR

»operaçãoN coluna, expressão entre aspas ou sinônimo, sobre o


qual as operações serão 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, expressão
entre aspas, sinônimo, ROW ou REPORT

V – Geração de Relatórios

88
V.4 – Parâmetros de controle

• O SQL*Plus possui uma série de parâmetros para controle de


formatação.

• O comando SET é usado para alterar o valor de um parâmetro.

• O comando SHOW é usado para visualizar o valor atual de um


parâmetro.

SQL > set pagesize 25


SQL > show pagesize
pagesize 25

V – Geração de Relatórios

89
• Os comandos SET e SHOW podem ser aplicados aos seguintes
parâmetros:

ARRAYSIZE n | 20 número de linhas recuperadas


simultaneamente do banco de dados

AUTOCOMMIT ON | OFF faz com que cada alteração feita na base


de dados seja efetivada imediatamente

BUFFER buffer | SQL torna buffer o buffer de edição corrente

CMDSEP c | `;` | ON | OFF caractere de separação entre vários


comandos SQL digitados em uma
mesma linha

COMPATIBILITY V5 | V6 força compatibilidade com o RDMS


ORACLE V5 ou V6

CONCAT c | `.` | ON | OFF caractere de concatenação para


utilização de variáveis

COPYCOMMIT n|0 tamanho do lote de registros que deve


ser processado pelo comando COPY
antes da execução de um COMMIT

CRT crt define o crt padrão para o comando


RUNFORM

DCLSEP c | `! ` caractere de separação de comandos do


sistema operacional

DEFINE c | `&` | ON | OFF caractere que precede a utilização de


variáveis

DOCUMENT ON | OFF interpreta ou não o texto dentro do


comando DOCUMENT

ECHO ON | OFF exibe ou não os comandos SQL*Plus


quando são executados de um arquivo
de comandos

EMBEDDED ON | OFF força ou não que todo relatório comece


em uma nova página

ESCAPE c | ON | OFF caractere de “escape” para permitir a


inserção de caracteres especiais

V – Geração de Relatórios

90
FEEDBACK n | 6 | ON | OFF número mínimo de linhas que precisam
ser selecionadas para haver impressão
do total de linhas

HEADING ON | OFF permite ou não a impressão de


cabeçalho de colunas

HEADSEP c | `I`| ON | OFF caractere para pular linha em cabeçalhos


(formato antigo)

LINESIZE n | 80 número de caractere por linha


LONG n | 80 número máximo de caracteres
visualizados para valores do tipo LONG

MAXDATE n tamanho máximo de uma linha que o


SQL*Plus pode processar

NEWPGE n|1 número de linhas brancas a serem


impressas a cada página nova (0 indica a
impressão de um “pulo de página”)

NULL texto texto a ser exibido quando um valor é


nulo

NUMFORMAT formato formato padrão para exibição de número


(formato numérico do comando
COLUMN)

NUMWIDTH n | 10 largura padrão para exibição de números

PAGESIZE n | 14 número de linhas por página


PAUSE texto | ON | OFF antes de começar cada página, exibe o
texto e espera (ou não) que o usuário
tecle ENTER

SCAN ON | OFF liga ou desliga p procedimento de


substituição de variáveis

SHOWMODE ON | OFF exibe ou não os valores antigo e atual de


parâmetros modificados com o comando
SET

SPACE n|1 número de espaço entre colunas


SQLCONTINUE c | “>” caractere exibido quando da continuação
de um comando SQL*Plus

V – Geração de Relatórios

91
SQLNUMBER ON | OFF liga ou desliga a numeração de linhas
quando da continuação de comandos
SQL

SQLPREFIX c | `#` caractere de prefixo para a execução de


comandos SQL durante a edição de um
outro comando

SQLPROMPT texto | “SQL>” texto exibido no início de cada linha de


edição

SQLTERMINATOR c |`;`| ON | OFF caractere que indica o término de um


comando SQL

SUFFIX texto | “SQL” texto que será usado como sufixo para
execução e edição de arquivos

TAB ON | OFF permite ou não a utilização de caracteres


TAB na impressão de brancos

TERMOUT ON | OFF permite ou não a exibição de comando


sendo executados

TIME ON | OFF exibe ou não a hora antes de cada linha


de edição

TIMING ON | OFF exibe ou não estatísticas de tempo para


cada comando executado

TRIMOUT ON | OFF inibe ou não impressão de brancos no


final de cada linha

TRUNCATE ON | OFF permite ou não o “corte” de uma linha


se ela for muito grande

UNDERLINE c|`-`| ON | OFF caractere que será utilizado para


sublinhas o cabeçalho de colunas

VERIFY ON | OFF exibe ou não comandos SQL antes e


depois da substituição de variáveis

WRAP ON | OFF é o inverso do comando TRUNCATE

• O comando SHOW ALL mostra o valor de todos ps parâmetros

V – Geração de Relatórios

92
V.5 – Utilização de variáveis

• O SQL*Plus permite a definição e uso de variáveis genéricas:

SQL > define v_dep = 20


SQL > define v_nomerel = “relatorio de utilidades”

• Para recuperar o valor de uma variável em uma comando SQL,


deve-se escrever o nome da variável precedido de `&`:

SQL > define v_dep = 20


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

V – Geração de Relatórios

93
• O SQL*Plus requisita o valor de uma variável se esta não 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

• após a utilização de uma variável não previamente definida, seu


valor (fornecido pelo usuário) é descartado

V – Geração de Relatórios

94
• Para manter o valor fornecido pelo usuário para futuras
utilizações, deve-se substituir o `&`por `&&`:

SQL > select nome_emp, sal


interação para ler o
2 from emp
valor da variável
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 Não há interação: a variável
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 – Geração de Relatórios

95
• O comando ACCEPT possibilita iniciar variáveis valores
fornecidos pelo usuário:

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 variável; 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 informações na tela:

SQL > prompt Relatorio de Empregados


Relatórios de Empregados
SQL >

V – Geração de Relatórios

96
• Pode-se também especificar parãmentros para a ativação de um
arquivo de comandos SQL*Plus através do comando START:

SQL > start listaemp 10 100000

nome do arquivo
de comandos Parâmetros posicionais

• Onde o arquivo LISTAEMP.SQL contém os seguintes


comandos:

rem O primeiro parametro determina o departamento onde os


rem empregados selecionados trabalham
rem O segundo parametro determina o menor salário 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; parâmetro

V – Geração de Relatórios

97
V.6 – Relatórios avançados

• Os relatórios produzidos até aqui foram sempre apresentados


na tela; é possível imprimi-los e armazena-los em arquivo do
sistema operacional:

inicia armazenamento do resultado


SQL > apool relat1
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 parâmetro determina o salário 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 – Geração de Relatórios

98
• Se o comando SPOOL OUT for substituído por SPOOL OFF, o
arquivo de saída não será impresso.

• Para evitar que os próprios comandos e mensagens do


SQL*Plus sejam enviadas para o arquivo juntamente com o
relatório.

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 – Geração de Relatórios

99
• No caso do comando COMPUTE, para eliminar os textos “sum”
e “******” que aparecem como indicadores do cálculo
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 ADMINISTRAÇÃP 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 – Geração de Relatórios

100
• As opções 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 expressão 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 – Geração de Relatórios

101
• vamos agora considerar o seguinte relatório:

data de hoje
número da página

23/11/90 Relatorio de Empregados Pág. 3


Departamento: VENDAS

Num Nome Empregado Salário Comissão 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 página

V – Geração de Relatórios

102
• Para produzir o relatório da página 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) comissão,


(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 variáveis que armazenarão 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 – Geração de Relatórios

103
5. Definir uma variáve 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 títulos:

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 página:

set pagasize 20
set linesize 75
set newpage 0

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


retornando o código do erro:

Wherenever sqlerror exit SQL.SQLCODE;

V – Geração de Relatórios

104
• Os comandos necessários à geração do relatório 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) comissão,
(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 – Geração de Relatórios

105
• Dessa forma, o comando:

$ sqlplus –s ora 1/senha1 @relatorio

- teria como efeito gerar o relatório na impressora do


sistema

V – Geração de Relatórios

106
V - Exercícios

1. Recupere o comando contido no arquivo “ex31.sql” e formate


seu resultado da seguinte forma:

a) mude o cabeçalho da coluna que indica o salário por hora


para “Sal/hora”

b) coloque um titulo centralizado indicando “Salário por hora


dos Empregados”

c) mude o formato da coluna “Sal/hora” para um número


com quatro casas inteiras e duas decimais.

d) Alinhe o cabeçalho da coluna CARGO pela direita

e) Verifique as definições de coluna existentes

V – Geração de Relatórios

107
2. Faça um arquivo de comando SQL*Plus chamado “ex52.sql” de
forma que sua execução exiba o seguinte resultado:

Relatorio de Empregados

Departamento Nome Cargo Salário


ADMINISTRAÇÃO 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 definições da


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

V – Geração de Relatórios

108
3. Altere o arquivo “ex52.sql” de forma que:

a) O menor salário a ser considerado na consulta seja


passado como parâmetro (veja página 99)

b) O maior salário a ser considerado na consulta seja entrado


pelo usuário através de um comando ACCEPT

c) Somente o resultado da consulta seja armazenado no


arquivo “ex.53.lst”

d) Desapareçam os textos “sum”, “avg” e *********”


exibidos pelo SQL`Plus (veja página 102)

V – Geração de Relatórios

109
VI – Expressões e funções

110
VI - Conteúdo

1. Operadores

2. Funções numéricas

3. Funções de caracteres

4. Funções de grupo

5. Conversão entre tipos

6. Funções de datas

7. Outras funções

VI – Expressões e funções

111
VI.1 - Operadores

• Operadores de valor:

+,- indicador de sinal WHERE X = -1


*,/ multiplicação e divisão SELECT 2 * X...
+,- soma e subtração SELECT X + Y...
|| concatena “strings” SELECT `EMPREGADO`| | NOME_EMP

• Operadores lógicos

= 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 – Expressões e funções

112
[NOT] IN teste de inclusão ou CARGO IN (`ANALISTA`, VENDEDOR`)
exclusão um conjunto

[NOT] teste de intervalo SAL BETWEEN 10000 AND 200000


BETWEEN …
AND

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


padrão

IS [ NOT ] testa valor nulo WHERE COM IS NULL


NULL

NOT inverte resusltado WHERE NOR ( SAL = 100000 )


lógico de expressões

AND operação lógica e WHERE SAL < 100000 AND CARGO =


`ANALISTA`

OR operação lógica 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 – Expressões e funções

113
VI.2 – Funções numéricas

• Em geral, funções podem ser usadas em qualquer lugar onde


variáveis ou expressões do mesmo tipo são usadas.

• Legenda para as próximas tabelas:

- T : tipo retornado pela função:


o `C`indica caractere
o `D`indica data
o `N`indica número

o `R`indica Rowld
o `W`indica “raw”

- Argumentos para funções:

o `*` : tipo depende do contexto da função


o m, n : expressões numéricas
o c, c1, c2, conj_c, de_c, para_c: expressões que retornam
cadeias de caracteres
o d, d1: expressões que retorna datas
o expr, caso, ret, ret_outro: expressões de qualquer tipo

VI – Expressões e funções

114
• Funções numéricas:

T função Descrição/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 divisão 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 – Expressões e funções

115
VI.3 – Funções de caracteres

T NOME Descrição/Exemplo
N ASCII(c) código ASCII do primeiro caractere de
c
ASCII( `Água`) = 65

C CHR(n) caractere de código ASCII igual a n


CHR(65) = `A`

C INITCAP(c) retorna c com o primeiro caractere de cada


palavra em maiúscula
INITCAP( `SAO PAULO`) = `Sao Paulo`

N INSTR(c1, c2[,m[, n]]) a posição da n-ésima ocorrência de c2


em c1, iniciando a busca na posição m.
O valor 1 é assumido para m e n em
caso de omissão
INSTR( `SAO PAULO`, `A`, 1, 2) = 6

N LENGTH(c) número de caracteres em c


LENGTH( `SAO PAULO`) = 9

C LOWER(c) converte todos os caracteres de c para


minúsculas
LOWER( `SAO PAULO` ) = `são 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 – Expressões e funções

116
C LTRIM(c, conj_c) remove todos os caracteres de c até o
primeiro caractere que não 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 ocorrências 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 não 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 subseqüência de c com início na posição


m com n caracteres. Caso n seja omitido,
retorna da posição m até o fim
SUBSTR(`São Paulo`, 5 ) = `Paulo`

VI – Expressões e funções

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


maiúsculas
UPPER( `Sao Paulo`) = `SAO PAULO`

C USERENV(c) c pode assumir os seguintes valores:


`ENTRYID` = novo identificador para o
propósito de auditoria
`SESSIONID`= identificador da sessão de
auditoria
`TERMINAL` = identificador do terminal
`LANGUAGE`= língua em uso

VI – Expressões e funções

118
VI.4 – Funções de grupo

T Nome Descrição

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

N COUNT([distinct | all] número de linhas para as quais


expr | *) expr não é 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 padrão de n; ignora valores


nulos

N SUM([distinct | all] n) soma dos valores de n

N VARIANCE([distinct|all] n) variância de n; ignora valores nulos

VI – Expressões e funções

119
VI.5 – Conversão entre tipos

T Nome Descrição

C CHARTOROWID(char) converte char para um “rowid”

W HEXTORAW(char) converte char contendo dígitos


hexadecimais para um valor binário,
conveniente para ser inserido em uma
coluna do tipo RAW

C RAWTOHEX(raw) converte raw para a cadeia e


caracteres contendo números
hexadecimais

C ROWIDTOCHAR(rowid) converte um rowid para uma cadeia


de 18 caracteres

C TO_CHAR(n[,fmt]) ou converte o número 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
número (J, MM etc.)

N TO_NUMBER(char) converte char para um número; char


deve conter um número válido

VI – Expressões e funções

120
• Conversão automática 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 operação pode ser usada com vários tipos de dados, o


tipo do primeiro operando determina o tipo dominante:

- 123 > `39`

• Se uma operação só pode ser usada com um tipo de dados,


esse fica sendo o tipo dominante:

- `39` + 123

VI – Expressões e funções

121
• a tabela a seguir mostra os principais formatos de datas
existentes (parâmetro fmt utilizado nas funções de conversão)
aplicados à data 13:07:10 de 16/01/91

formato resultado descrição


SCC ou CC 20 século
SYYYY ou YYYY 1991 ano
YYY, YY e Y 991, 91 e 1 últimos 3, 2 e 1 dígitos do ano
SYEAR ou YEAR nineteen-ninety-one ano por extenso
MM 01 mês
MON jan nome do mês abreviado
MONTH january nome do mês
WW e W 03, 3 semana do ano e do mês
DDD, DD e D 016, 16, 4 dias do ano, mês 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 após a meia-noite
(0-83399)

Month, YYYY January , 1991 os tamanhos são fixos


FmMonth, YYYY January, 1991 os tamanhos são variáveis
(“fill-mode”)

- OBS: qualquer combinação dos formatos acima pode ser


feita para formar o parâmetro fmt (EX: `HH24:MI:SS-
DD/MON/YYYY`)

VI – Expressões e funções

122
VI.6 – Funções de datas

T Nome Descrição

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 mês da data d


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

N MONTHS_BEETWEEN(d,e) o número 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 não 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 – Expressões e funções

123
VI.7 – Outras funções

T Nome Descrição

* DECODE(expr, s1, r1, se expr for igual a algum s, então


...[padrão]) devolve o r seguinte; caso contrário
devolve padrão. Caso padrão seja
omitido e não haja “casamento” o
valor NULL é retornado

* DUMP(expr[, tipo[, mostra o valor de uma expressão 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


contrário devolve x.

N VSIZE(expr) devolve o número de bytes de expr


na representação 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 – Expressões e funções

124
VI - Exercícios
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 são
comissionados.

2. Descubra os seus identificadores de sessão e terminal.

3. Calcule o desvio padrão (DesvPadr) e a média (Media) dos


salários do presidente e diretores presentes na tabela EMP.

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


data de aniversário dos alunos cadastrados nos formatos
DD/MM (data1) e DD-MON (data2).

5. Faça uma consulta que devolva o número de meses completos


existentes entre as datas de admissão do empregado mais novo e dos
mais antigo constantes na tabela EMP.

6. Consulte o número, nome, cargo e total de recebimentos (Totreceb),


ou seja, salário mais comissão, dos empregados da tabela EMP.

7. Faça uma consulta na tabela EMP que retorne o nome e a categoria


do empregado. A categoria do empregado tem valor 1 para
secretárias, 2 para vendedores, 3 para analistas e 4 para outros
cargos.

8. Faça uma consulta na tabela EMP que devolva o nome e o salário


ideal (Salideal). O salário ideal é o maior valor entre o salário atual e
a média dos salários do departamento onde o empregado trabalho
(Dica: use a visão DEP_SAL criada no exercício IV.8).

9. Faça um consulta que retorne somente a primeira letra dos nomes de


todos os empregados, ordenados por data de admissão.

VI – Expressões e funções

125
VII – Consultas avançadas

126
VII - Conteúdo

1. Pseudo-colunas

2. Junção externa

3. Auto-Junção

4. Consultas encaixadas

5. Consultas hierárquicas

VII – Consultas avançadas

127
VII.1 – Pseudo-colunas

• Pseudo-colunas são colunas que podem ser consultadas em


qualquer tabela, como uma coluna normal, mas não podem
ser alteradas:

T Nome Descrição

N nome_seq.CURVAL valor corrente da seqüência nome_seq

N nome_seq.NEXTVAL próximo valor da seqüência nome_seq

N LEVEL usada na comando SELECT ...


CONNECT BY (explicado na seção
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 identificação interna de uma linha

N ROWNUM número que indica a ordem de seqüência


da linha selecionada em uma consulta

D SYSDATE data e hora correntes

N UID número que identifica unicamente o


usuário corrente

C USER nome do usuário 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 avançadas

128
VII.2 – Junção 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 ADMINISTRAÇÃO 175 PAULO
10 ADMINISTRAÇÃO 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 não aparece,


Pois não tem empregados

VII – Consultas avançadas

129
NOME_EMP NOME_DEP EMP.N_DEP DEP.N_DEP
SAMANTA ADMINISTRAÇÃO 20 10
UBIRATAN ADMINISTRAÇÃO 20 10
UBIRATAN ADMINISTRAÇÃO 20 10
PAULO ADMINISTRAÇÃO 10 10
RITA ADMINISTRAÇÃO 30 10
EVERALDO ADMINISTRAÇÃO 30 10
SILVIO ADMINISTRAÇÃO 30 10

ANA ADMINISTRAÇÃO 10 10
RENATO ADMINISTRAÇÃO 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 PRODUÇÃO 10 40
PAULO PRODUÇÃO 10 40
RITA PRODUÇÃO 30 40
EVERALDO PRODUÇÃO 30 40
SILVIO PRODUÇÃO 30 40
ANA PRODUÇÃO 10 40
RENATO PRODUÇÃO 20 40

não existem empregados no departamento


40

VII – Consultas avançadas

130
• Solução: fazer de conta que existe uma linha fictícia,
totalmente nula, na tabela de empregados, para que ela seja
associada à linha do departamento 40 (junção 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 ( + ); junção externa

N_DEP NOME_DEP N_EMP NOME_EMP


10 ADMINISTRAÇÃO 175 PAULO
10 ADMINISTRAÇÃO 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 PRODUÇAO

• 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 PRODUÇÃO SÃO BERNARDO

VII – Consultas avançadas

131
VII.3 – Auto-Junção

• As tabelas envolvidas numa junção não precisam ser distintas

• Para descobrir quais gerentes estão ganhando menos que o


dobro do salário de algum de seus subordinados:
pseudônimos 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 avançadas

132
VII.4 – Consultas encaixadas

• Uma consulta SQL pode fazer parte da condição da cláusula


WHERE de outro comando SQL

• Para saber quais empregados ganham mais que a média dos


salários:

parênteses 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 não tem empregados:


operador de exclusão
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 PRODUÇAO esta sub-consulta retorna
um conjunto de valores

VII – Consultas avançadas

133
• Uma sub-consulta pode fazer referencias a colunas do comando
no qual está encaixada

• Para recuperar os empregados que ganham mais que a média de


salário do sei departamento:

SQL > select n_dep, nome_emp, sal


nesse caso é necessário o
2 from emp x
pseudônimo 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 avançadas

134
• Os operadores IN, NOT IN, ANY e ALL também 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 não


(equivalente ao IS NOT NULL para colunas):

SQL > select nome_emp, cargo, n_dep só importa se uma linha


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

VII – Consultas avançadas

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 três 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 avançadas

136
• Sub-consultas também podem ser usadas nos comandos de
manipulação 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 salário e a media das comissões 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 avançadas

137
VII.5 – Consultas hierárquicas

• O Oracle permite recuperar informações estruturas de forma


hierárquica (“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 avançadas

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 começo da
consulta
especifica a conexão 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 também 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 avançadas

139
• Podemos usar a pseudo-coluna LEVEL para saber o nível 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 avançadas

140
VII - Exercícios

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 funcionários


(NOME_FUNC) da tabela EMP, ordenados por
NOME_CHEFE. Caso algum funcionário não possua chefe,
mostre a cadeia de caracteres `________`em NOME_CHEFE.

3. Consulte os nomes, salários e cidades onde trabalham os


empregados que estão na mesma faixa de salário que
UBIRATAN. Dica: construa antes as seguintes consultas: nome,
salário e cidade de todos empregados; nome, salário, cidade e
faixa salarial de todos empregados; e faixa salarial de
UBIRATAN.

4. Aumente o salário em 20% para os empregados que sejam os


mais antigos de seus departamentos.

5. Remova os empregados que recebem mais que a média dos


salários de seus cargos.

6. Desfaça as duas operações anteriores.

VII – Consultas avançadas

141
VIII – Tópicos avançados

142
VIII - Conteúdo

1. Manutenção de usuários

2. Privilégios de acesso a tabelas

3. Acesso concorrentes a tabelas

4. Criação e uso de índices

5. Criação e uso de clusters

6. Dicionário de estruturas de dados

VIII – Tópicos avançados

143
VIII.1- Manutenção de usuários

• Para criar um novo usuário Oracle:

GRANT privilégio, ... TO usuário, ...


IDENTIFIED BY senha, ...

»privilégio é uma das seguintes permissões:

>CONNECT permite conexão ao ORACLE


>RESOURCE permite criação de tabelas, visões, índices, etc.
>DBA permite executar operações privilegiadas, como
criar novos usuários
»usuário nome (identificação) do usuário

»senha senha do usuário

- OBS: somente um usuário DBA pode criar ou alterar


privilégios de outro usuário

VIII – Tópicos avançados

144
• Para alterar sua própria senha:

GRANT CONNECT TO seu_nome


IDENTIFIED BY nova_senha

- OBS: qualquer usuário pode executar esta variação do


comando GRANT

• Para retirar privilégios de um usuário:

REVOKE privilegio, privilegio, … FROM usuario, …

• Para remover um usuário do banco de doados:

- remova todos os objetos do usuário

- remova todos seus privilégios

• Remover os privilégios de um usuário não implica em remover


seus objetos

VIII – Tópicos avançados

145
VIII.2 – Privilégios de acesso

• Para um usuário fazer acesso a uma tabela de outro usuário,


deve-se prefixar o nome da tabela com o nome de seu criador:

SQL > select *


2 from joão.aluno;

• Um usuário pode definir quem pode usar suas tabela e que tipo
de operação podem ser realizadas:

GRANT privilegio, ... ON tabela TO usuário


[WITH GRANT OPTION]

»privilégio uma das seguintes permissões:

>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


restrição de tabela ou coluna

>SELECT permite consultar tabela

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


..., coIN Se nenhuma coluna for especificada, então
todas poderão ser alteradas

>ALL permite todas as operações acima


»usuário nome do usuário. Se for especificado o pseudo-
usuário PUBLIC, então todos os usuários terão
os privilégios em questão

VIII – Tópicos avançados

146
»WITH GRANT permite que um usuário com um determinado
OPITON privilégio possa transmiti-lo para um terceiro
usuário

• Para um usuário permitir que o usuário RITA faça consultas a


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

• Para permitir que todos usuários tenham todos privilégios sobre


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

• Também é possível restringir o acesso a tabelas através do uso


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

VIII – Tópicos avançados

147
• Para facilitar o acesso a tabelas de outros usuários pode-se criar
sinônimos para os nomes das tabelas:

CREATE [PUBLIC] SYNONYM sinônimo FOR tabela

»PUBLIC faz com que o sinônimo fique disponível para


todos os usuários

»sinônimo nome do sinônimo a ser criado

»tabela nome da tabela, opcionalmente prefixada pelo


nome de seu criador

• Para criar um sinônimo para a tabela ALUNO do usuário JOAO:


creat synonym joão_aluno for joão.aluno;

VIII – Tópicos avançados

148
VII.3 – Acesso concorrente

• Quando dois o mu mais usuários estão usando as mesmas


informações ao mesmo tempo, dizemos que há um acesso
concorrente a estas informações.

• Para garantir que atualizações 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 (explicações válidas na


presença de TPO)

>SHARE permite que outros usuários recuperem mas


que nenhum deles altere as informações da
tabela

>ROW SHARE permite que outros usuários 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 versões anteriores
do ORACLE.

>ROW permite outros usuários alterem outras linhas


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

>SHARE ROW possibilita que um usuário execute múltiplas


EXCLUSIVE atualizações sobre a tabela, permitindo que
outros usuários façam consultas a ela mas
proibindo a colocação de bloqueios do tipo
SHARE ou atualizações de linhas.

VIII – Tópicos avançados

149
>EXCLUSIVE permite que outros usuários façam consultas à
tabela mas proíbe qualquer outra operação
sobre ela

»NOWAIT especifica se o comando de bloqueios deve


esperar até obter sucesso ou não

• Um usuário sempre pode consultar informações do banco de


dados, independente de qualquer bloqueio.

• Todos os bloqueios são liberados no final da transação corrente


(COMMIT ou ROLLBACK)

VIII – Tópicos avançados

150
• É possível bloquear antecipadamente algumas linhas de uma
tabela em modo EXCLUSIVE, para posterior atualização:

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 – Tópicos avançados

151
• “Deadlock” é uma situação onde um usuário A espera pela
liberação de uma tabela bloqueada por um usuário B, o qual está
esperando a liberação de outra tabela bloqueada pelo usuário A:

USUÁRIO A USUÁRIO 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 usuário A 2 in exclusive mode;
esperou pela liberação 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 ocorrência


de um deadlock

VIII – Tópicos avançados

152
VII.4 - Índice

• Índices permitem que o Oracle recupere informações 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 usuário

»tabela nome da tabela a ser indexada

»col1, ..., coIN colunas que participam do índice

>ASC ordem ascendente (padrão)

>DESC ordem descendente

VIII – Tópicos avançados

153
• Para remover um índice:

DROP INDEX índice [ON tabela]

» índice nome do índice a ser removido

»ON tabela causa verificação do nome da tabela

• Uma tabela pode ter vários í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 não é necessário 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 – Tópicos avançados

154
• Índices também podem ser usados para impedir duplicação 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 são mantidos


automaticamente pelo Oracle.

• Deve-se criar índices:

- se uma tabela possui mais que algumas centenas de linhas

- em colunas freqüentemente usadas para recuperação de


dados

• não é aconselhável criar muitos índices para uma tabela, pois os


índices podem prejudicar o desempenho dos comandos
INSERT, UPDATE e DELETE

VIII – Tópicos avançados

155
• O Oracle não aproveita índices para colunas envolvidas em
expressões aritméticas:

SQL > select nome_emp from emp


usa índice
2 where n_emp = 110;

SQL > select nome_emp from emp não usa índice


2 where n_emp – 110 = 0;

• Para evitar que um índice seja usado, basta fazer uma operação
sem efeito na primeiro coluna associada ao índice:

SQL > select nome_emp


2 from emp
3 where cargo | | ” = `DIRETOR` and n_emp = 110;

não usaria índice em cargo, caso


existisse algum

VIII – Tópicos avançados

156
VIII.5 - Clusters

• “Cluster” é uma característica que permite que várias 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 ADMINISTRAÇÃO
189 RITA ...30 20 PESQUISA
201 EVERALDO ...30 30 VENDAS
208 SILVIO ...30 40 PRODUÇÃO
230 ANA ...10
276 RENATO ...20

o departamento e seus
empregados estão
fisicamente agrupados
Cluster Emp_Dep
10 ADMINISTRAÇÃO 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 PRODUÇÃO SAO BERNARDO

VIII – Tópicos avançados

157
• Um cluster pode envolver várias tabelas, mas uma tabela pode
participar no máximo de um cluster.

• Assim como ocorre com índices, o Oracle tira proveito de


clusters automaticamente; não é necessário (nem possível)
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 junção).

• Cada valor distinto existente nas colunas de um cluster é


armazenado uma única vez no banco de dados.

VIII – Tópicos avançados

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 após a criação 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 – Tópicos avançados

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 – Tópicos avançados

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 então remover o cluster e seu conteúdo de uma só vez:

SQL > drop cluster proj_dep including tables;

• Em geral clusters:

- aumentando o desempenho para junções naturais

- economizam espaço na banco de dados

- diminuem o desempenho para consultas simples ás tabelas


separadamente

VIII – Tópicos avançados

161
VIII.6 – Dicionário de dados

• O dicionário de dados do Oracle é um grupo de tabelas e visões


que contem informações sobre o próprio banco de dados

• A tabela DICTIONARY descreve as tabelas que compõem o


dicionário de dados; as principais tabelas e visões são

• ALL_CATALOG todas as tabelas, sinônimos, seqüências e


visões que o usuário tem acesso, incluindo o
dicionário de dados

• ALL_COL_COMENTS comentários sobre colunas das tabelas que o


usuário tem acesso

• ALL_INDEXES todos índices das tabelas que o usuário tem


acesso

• ALL_IND_COLUM colunas que possuem índices em todas as


NS tabelas acessíveis

• ALL_SYNONYMS sinônimos privados e públicos

• ALL_TABLES descrição das tabelas acessíveis ou usuário

• ALL_TAB_COLUM especificação das colunas de todas tabelas que


NS o usuário tem acesso, incluindo o dicionário de
dados

• ALL_TAB_COMENTS comentários sobre tabelas e visões acessíveis


ao usuário

• ALL_TAB_GRAN listas de permissões de acesso recebidas pelo


TS_RECD usuário (GRANT)

• ALL_USERS lista dos usuários Oracle

• ALL_VIEWS lista das visões que o usuário tem acesso

VIII – Tópicos avançados

162
• DICTIONARY descrições de tabelas e visões do dicionário de
dados do Oracle

• USER_CATALOG tabelas, sinônimos, seqüência e visões que o


usuário tem aceso (excluindo o dicionário de
dados)

• USER_CLUSTERS “clusters” e tabelas associadas (o usuário deve


ter acesso a ambos)

• USER_FREE_SPACE extensões livres em tabelas acessíveis pelo


usuário

• USER_INDEXES índices criados pelo usuário

• USER_SYNONYMS sinônimos criados pelo usuário

• USER_TAB_COLUMNS especificações das colunas das tabelas criadas


pelo usuário

• USER_TABLES descrição das tabelas do usuário

• USER_VIEWS comandos SQL que definem as visões criadas


pelo usuário

VIII – Tópicos avançados

163
• Para saber quais são suas tabelas, visões, sinônimos 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 – Tópicos avançados

164
• Para saber todos as tabelas, sinônimos, seqüências e visões à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 – Tópicos avançados

165
• Para saber seus privilégios em tabelas de outros usuários:

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 – Tópicos avançados

166
• é possível armazenar comentários sobre tabelas e colunas no
dicionário 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 código do chefe desta pessoa

VIII – Tópicos avançados

167
VIII - Exercícios

1. Conceda privilegio de consulta a inserção em sua tabela


ALUNO para seu companheiro mais próximo.

2. Crie i sinônimo ALUNO0 para a tabela ALUNO do instrutor


(usuário 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 operação.

4. Crie um índice na coluna NOME da sua tabela ALUNO.

5. Revogue as permissões de acesso a sua tabela ALUNO para seu


companheiro, concedidas no exercício nº 1.

6. Consulte os índices existentes para a sua tabela ALUNO. Dica:


veja a página 165.

7. Consulte seus privilégios de acesso à tabela ALUNO do


instrutor. Dica: veja pagina 166.

VIII – Tópicos avançados

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)

• Conteúdo:
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)

• Conteúdo:

N_EMP NOME_DEP LOCAL_DEP


10 ADMINISTRAÇÃO SAO PAULO
20 PESQUISA CAMPINAS
30 VENDAS BRASILIA
40 PRODUÇÃO 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)

• Conteúdo:

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_médio

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
• Visões:

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 – Sumário dos Comandos

174
• Principais comandos SQL:

• ALTER TABLE adicione ou redefine uma colina em uma tabela


existente
• COMMENT insere um comentário sobre uma tabela ou
coluna no dicionário de dados
• COMMIT efetiva as mudanças realizadas no banco de
dados desde a última ativação 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 seqüência numérica gerada
SEQUENCE automaticamente
• CREATE cria um sinônimo para uma tabela ou visão
SYNONYM
• CREATE TABLE cria uma tabela e define as características de
suas colunas
• CREATE VIEW cria uma visão sobre uma ou mais tabelas ou
visões
• DELETE remove linhas de uma tabela
• DROP objeto remove um “cluster”, tabela, visão, etc. do
banco de dados
• GRANT cria usuários, atribui senhas, e fornece
privilégios de acesso a tabelas e visões
• INSERT insere novas linhas em uma tabela ou visão
• LOCK TABLE bloqueia uma tabela
• RENAME muda o nome de uma tabela, visão ou
sinônimo

• REVOKE revoga acesso ao banco de dados ou a tabelas e


visões

• ROLLBACK descarta as alterações feitas no banco de dados


desde a ultima ativação dos comandos
COMMIT ou ROLLBCK.

Ap. B – Sumário dos Comandos

175
• SAVEPOINT determina um ponto de salvamento
intermediário para a transação
• SELECT realiza uma consulta
• SET determina um ponto intermediário de
TRANSACTION salvamento de transações
• UPDATE altera valores de campos de uma tabela

• Comandos SQL*Plus:

• @, START executa um arquivo de comandos


• # finaliza uma seqüência de linhas de comentário
inicializada por um comando DOCUMENT
• !, HOST excuta um comando do sistema operacional
sem deixar o SQL*Plus
• ACCEPT lê um valor entrado pelo usuário e o atribui à
uma variável
• APPEND, A adiciona texto no fim da linha corrente
• BREAK especifica que eventos casarão uma quebra, e
que ação deve ser tomada em cada quebra
• BTITLE especifica um título a ser mostrado no rodapé
de cada pagina de um relatorio
• CHANGE altera o conteúdo da linha corrente no buffer
• CLEAR apaga as definições dos comandos BREAK,
COMPUTE, COLUMN, etc.
• COLUMN especifica como uma coluna e seu nome devem
ser mostrados em um relatório
• COMPUTE realiza cálculos em um conjunto de linhas
selecionadas. Funciona em conjunto com o
comando BREAK
• CONNECT termina a sessão corrente e se conecta
novamente ao ORACLE
• DEFINE define uma variável e atribui um valor a ela

Ap. B – Sumário dos Comandos

176
• DEL, D remove a linha corrente do buffer
• DESCRIBE, DEC mostra a descrição de uma tabela
• DISCONNECT efetiva as transações pendentes e desconecta do
Oracle
• DOCUMENT inicia um “bloco” de documentação no arquivo
corrente
• EDIT, ED invoca um editor do sistema operacional
• EXIT, QUIT termina a execução do SQL*Plus
• GET carrega um arquivo no buffer corrente
• HELP fornece ajuda sobre comandos SQL e
SQL*Plus
• INPUT, I adiciona novas linhas após a linha corrente do
buffer
• LIST, L mostra as linhas presentes no buffer corrente
• PAUSE mostra uma mensagem e espera o usuário
teclar algo
• PROMPT mostra uma mensagem na tela
• REMARK, REM inicia um comentário em um arquivo de
comandos
• RUM mostra e executa o conteúdo do buffer corrente
• RUMFORM executa um formulário previamente gerado
• SAVE salva o conteúdo do buffer corrente em um
arquivo
• SET atribui um valor a um parâmetro do SQL*Plus
• SHOW mostra as definições atuais dos parâmetros do
SQL*Plus
• SPOOL controla a copia de saída dos comandos em
arquivos ou na impressora do sistema
• TTITLE especifica um titulo a ser mostrado no topo de
cada página de um relatório
• UNDEFINE remove a definição de uma variável
• WHENEVER controla o fluxo de execução do SQL*Plus
quando ocorrem erros em comandos SQL

Ap. B – Sumário dos Comandos

177
AP. C – Resposta dos exercícios

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 Brás 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 exercícios

179
II.4:
select ender, cidade, estado, cep
from aluno
where nome = `João 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 exercícios

180
III.5:

select n_dep, min(sal) “Menor Salario”, max(sal) “Maior Salario”,


avg(sal) “Salario Médio”
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 exercícios

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

IV.5:
update aluno
set sal_desejado = 400000
where nome = `João da Silva Neto`;
update aluno
set ender = `Rua Pindamonnhangaba, 123`,
cidade = `Taubaté`, estado = `SP`, cep = 14500
where nome = `Joaquim Alfredo Guimarães`;

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 Guimarães`;
commit;

Ap. C – Resposta dos exercícios

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 exercícios

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 exercícios

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 “Salário”
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 exercícios

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 exercícios

186
VI.8:
select emp.nome_emp, greatest( emp.sal, dep_sal.sal_méd ) 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 exercícios

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 exercícios

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 exercícios

189

Você também pode gostar