Você está na página 1de 191

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


“.” Separa as
2 n_emp number (4) not null,
definições
3 nome_emp char (10), das colunas

4 cargo char (10)


5 chefe number (4),
6 data_adm date,
“.” Executa o
7 sal number (10,2), comando

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
SAMANTA somente
RENATO fazem diferença

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

16
II – Comandos SQL e SQL*Plus

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

17
II – Comandos SQL e SQL*Plus

• 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

18
II – Comandos SQL e SQL*Plus

• Para substituir caracteres da linha corrente:

SQL > list 2


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

• Para executar o comando existente no buffer:

SQL > run


ou
SQL > r
ou
SQL > /

19
II – Comandos SQL e SQL*Plus

• O SQL*Plus permite a 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

20
II – Comandos SQL e SQL*Plus

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

21
II – Comandos SQL e SQL*Plus

II.6 – Outros comandos

• Para executar um comando qualquer do sistema operacional:

SQL > host


ou
SQl > !
total 20
drwxr-xr-x 2 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

22
II – Comandos SQL e SQL*Plus

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

23
II – Comandos SQL e SQL*Plus

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

29
III – Consultas básicas

• 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

30
III – Consultas básicas

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

31
III – Consultas básicas

• 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)”

32
III – Consultas básicas

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

33
III – Consultas básicas

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

função de grupo
seleciona os
grupos
(“where” de

CARGO SUM(SAL) MAS(SAL)


DIRETOR 630000 330000
PRESIDENTE 500000 500000
VENDEDOR 350000 200000

34
III – Consultas básicas

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 conjunto
(D, 2)

Tabela Conjunto

• Existem três operações básicas de conjunto em SQL:

- união (UNION)

- intersecção (INTERSECT)

- diferença (MINUS)

35
III – Consultas básicas

• União:

TABELAS CONJUNTOS

TAB1 TAB2 Cj1 Cj2


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

colunas com tipo igual

select col1, col2 from tab1


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

36
III – Consultas básicas

• Intersecção:

TABELAS CONJUNTOS

TAB1 TAB2 Cj1 Cj2


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

colunas com tipo igual

select col1, col2 from tab1


Cj1 inter Cj2
intersect

select col1, col2 from tab2

Col. 1 Col. 2
B 1 (B, 1)
D 2 (D, 2)
37
III – Consultas básicas

• Diferença:

TABELAS CONJUNTOS

TAB1 TAB2 Cj1 Cj2


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

colunas com tipo igual

select col1, col2 from tab1


Cj1 - Cj2
minus

select col1, col2 from tab2

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

III – Consultas básicas

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

39
select col1, col2, col3, col4, col5
from tab1, tab2;

Col1 col2 col3 col4 col5


A 3 B 2 E

III – Consultas básicas

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

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

40
III – Consultas básicas

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
41
ANA PRODUÇÃO 10 40

RENATO PRODUÇÃO 20 40
III – Consultas básicas

• 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

42
III – Consultas básicas

• 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

43
III – Consultas básicas

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.

44
III – Consultas básicas

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

46
IV – Criação e uso de tabelas

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

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

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

SQL > CREATE TABLE emp


 Exemplo:
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), 48
10 n_dep number(2) REFERENCES dep(n_dep) );
IV – Criação e uso de tabelas

- Forma 2:

CREATE TABLE tabelas AS


SELECT col1, col2, ... coln
FROM ...

- Cria uma tabela igual ao resultado da consulta executada


com o comando “SELECT”

- Exemplo:

SQL > create table sal_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

49
IV – Criação e uso de tabelas

• Para verificar a estrutura de uma tabela

SQL > describe emp


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

• Para remover uma tabela:

SQL > drop table faixa_sal;

• Para mudar o nome de uma tabela:

SQL > rename dep to departamento;

50
IV – Criação e uso de tabelas

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

51
 DOBLE PRECISION

 LONG

 RAW (tamanho), LONG RAW

IV – Criação e uso de tabelas

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
SQL >
> alter table dep
desc dep
2
Name modify ( nome_dep
Null? char( 30 )Type
);
N_DEP NOT NULL NUMBER(2)
NOME_DEP novo tipo
CHAR(30) 52
LOCAL_DEP CHAR(13)
DIRETOR NUMBER(4)
IV – Criação e uso de tabelas

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

53
IV – Criação e uso de tabelas

IV.4 – O comando INSERT

• O comando INSERT é usado para inserir linhas com uma tabela.

- Forma 1:
INSERT INTO tabela [( cil1, col2, ... coln)]
VALUES ( val1, val2, ... valn)

» tabela nome da tabela onde os dados 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
SQL > Insert into emp
2 (nome_emp, n_emp, cargo, chefe, data_adm, sal, n_dep)
3 - Exemplo:
values ( ´SAMANTA`, 103, `ANALISTA`, 110, sysdate-30,
4 150000, 20);
ou
SQL > Insert into emp
2 values ( 103, `SAMANTA`, `ANALISTA`, 110, sysdate-30
3 150000, NULL, 20);
54
IV – Criação e uso de tabelas

- Forma 2:

INSERT INTO tabela ( col, col2, ... coln )


SELECT exp1, exp2, ... expn
FROM ...

- Insere todas as linhas retornadas pela consulta executada pelo


comando SELEC

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

55
IV – Criação e uso de tabelas

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;

56
- Para remover todos os empregados:
SQL > delete from emp;

IV – Criação e uso de tabelas

IV.6 – O comando UPDATE


• O comando UPDATE é usado para alterar valores já
armazenados em tabelas:

UPDATE tabela
SET col1 = exp1, col2, = exp2, ... coln = expn
WHERE 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

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

IV – Criação e uso de tabelas

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

58
IV – Criação e uso de tabelas

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.

59
IV – Criação e uso de tabelas

• 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

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

• Exemplo:
$ sqlplus ora 1/senha 1
SQL*Plus: version 3.0.6.5.1 – Production on Wed Apr 3 08:56 ...
Copyright (c) ORACLE Corporation 1979, 1989. All ...
Connected to: ORACLE RDBMS V6.0.27.9.2, with transaction ...
PL/SQL V1.0.29.1.0 – Beta
SQL > set feedback off
SQL > select n_dep, nome_dep from dep;
inibe algumas mensagens de
aviso
N_DEP NOME_DEP
10 ADMINISTRAÇÃO
20 PESQUISA
30 VENDAS
40 PRODUÇÃO
Início de uma transaçã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
10 ADMINISTRAÇÃO O próprio usuário vê os dados, mas
20 PESQUISA eles ainda não foram efetivados
30 VENDAS
40 PRODUÇÃO
50 MARKETING
60 INFORMATICA
fim da transação, com 61
SQL > commit; efetivação dos dados
Commit complete.
IV – Criação e usa de tabelas
SQL > update dep set nome_dep = `COMERCIAL`
2 where n_dep = 30;
SQL > select nome_dep from dep where n_dep = 30;

NOME_DEP Início de
outra
COMERCIAL transação

fim da transação;
as
SQL > rollback; atualizações foram
Rollback complete.
SQL > select nome_dep from dep where n_dep = 30;

NOME_DEP
VENDAS

SQL > delete from emp where n_emp = 103;


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

Fim da ultima transação


Com COMMIT implícito

IV – Criação e usa de tabelas

• Observações

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


executada; não existe transação parcialmente executada,
por definição.
USUÁRIO 1 USUÁRIO 2
SQL > select sal from emp SQL > select sal from emp
- n_emp
2 where As modificações
= 189; efetuadas no
2 decorrer de uma
where n_emp transação
= 189;
por um usuário só são visíveis a outros usuários após a
SAL efetivação da transação (COMMIT).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;
63
SAL SAL
400000 400000
IV – Criação e usa de tabelas

• O comando SET AUTOCOMMIT ON do SQL*Plus faz com


que o commit seja executado automaticamente a cada
SQL > set feedback on
SQL > setcomando
autocommitdeonmanipulação de dados:
SQL > delete from dep
2 where n_emp = 10;
Commmit complete.

1 record deleted.

SQL > insert into emp values( 103, `SAMANTA`, `ANALISTA`,


2 110, `17-MAR-85`, 150000, NULL, 20);
Commit complete.

1 record created.

SQL > set autocommit off


SQL > delete from emp
2 where n_emp = 189;

1 record deleted.

SQL > rollback; 64


Rollback complete.
IV – Criação e usa de tabelas

• É 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;

65
IV – Criação e usa de tabelas

• 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

66
IV – Criação e usa de tabelas

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

67
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

- 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
10 ADMINISTRAÇÃO
175 PAULO ...10
20 PESQUISA
189 RITA ...30
30 VENDAS
201 EVERALDO ...30
40 PRODUÇÃO
208 SILVIO ...30
230 ANA ...10
276 RENATO ...20 indicações para o
dep. 20 apenas,
por motivos de
clareza

NOME NUM NUM_DEPTO NOME_DEPTO


Emp_Dep SAMANTA 103 20 PESQUISA
UBIRATAN 110 20 PESQUISA
PAULO 175 10 ADMINISTRAÇÃO
RITA 189 30 VENDAS
SQL > create view emp_dep
EVERALDO( nome, num, 30
201 num_epto, nome_depto
VENDAS )
2 as select nome_emp,
SILVIO n_emp,208
dep.n_dep,
30 nome_depVENDAS 68
3 from emp, depANA 230 10 ADMINISTRAÇÃO
RENATO 276 20 PESQUISA
4 where emp.n_dep = dep.n_dep; o nome das colunas pode ser modificado
IV – Criação e usa de tabelas

• 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


NOME * from emp_dep;
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 69
ANA 230 10 ADMINISTRAÇÃO
RENATO 276 20 PESQUISA
IV – Criação e usa de tabelas

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

70
IV – Criação e usa de tabelas

• 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 71
where emp.n_dep = dep.n_dep
• Para remover uma visão:

SQL > drop view emp_dep;

IV – Criação e usa de tabelas

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;

72
• Para usá-la:

SQL > INSERT INTO( nome_emp, n_emp, ...)


2 VALUES ( `PROXIMO CLIENTE`, seq_emp.NEXTVAL, ...);

IV – Criação e usa de tabelas

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

73
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

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.

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

IV – Criação e usa de tabelas

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

76
5. Utilização de variáveis

6. Relatórios avançados

V – Geração de Relatórios

V.1 – Formatação de colunas

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


do SQL*Plus são acumulativos
COLUMN coluna
ALIAS sinônimo
CLEAR
DEFAULT
• Sintaxe doFOLD_A[FTER]
comando COLUMN:
FOLD_B[EFORE]
FORMAT formato
HEADING texto
JUSTIFY
LEFT
CENTER
RIGHT
LIKE coluna
NEWLINE
NEW_VALUE var
OLD_VALUE var
NULL nulo
NOPRINT
PRINT
ON
OFF
WRAPPED 77
WORD_WRAPPERD
TRUNCATED
V – Geração de Relatórios

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

78
V – Geração de Relatórios

• 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

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

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

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 80
VENDAS SILVIO 1800000.00 9000.00
VENDAS EVERALDO 2400000.00 3000.00
V – Geração de Relatórios

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)

81
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

- 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

82
V – Geração de Relatórios

• 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 –
83
`Relatório de Empregados – Departamento de Pessoal`
V – Geração de Relatórios

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

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

• 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
3 where dep.n_dep = emp.n_dep de
4 order by nome_dep, cargo;
NOME_DEP CARGO NOME_EMP
acordo com os grupos formados!

ADMINISTRAÇÃO PRESIDENTE PAULO

SECRETARIA ANA

NOME_DEP CARGO NOME_EMP


PESQUISA ANALISTA SAMANTA
REANATO mudança
de página
DIRETOR UBIRATAN

NOME_DEP CARGO NOME_EMP


VENDAS DIRETOR RITA
85
VENDEDOR SILVIO
EVERALDO
V – Geração de Relatórios

• 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

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

V – Geração de Relatórios

• 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


N_DEP NOME_DEP NOME_EP SAL
SQL > compute sum of sal on nome_dep
10 ADMINISTRAÇÃO PAULO 500000.00
SQL > select dep.n_dep, nome_dep, nome_emp, sal
ANA 120000.00
2 from dep, emp
****************
3 where dep.n_dep = emp.n_dep
4 oeder by dep.n_dep;
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 87
***************
sum 680000.00
V – Geração de Relatórios

• 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

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

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.

89
SQL > set pagesize 25
SQL > show pagesize
pagesize 25

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

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

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

92
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

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”

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

• 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 94
175 PAULO
189 RITA
• após a utilização de uma variável não previamente definida,
seu valor (fornecido pelo usuário) é descartado

SQL > select nome_emp, sal


2 from emp
3 where n_dep = &&v_dep
Enter value for
V – Geração de v_dep: 30
Relatórios
old 3: where n_dep = &&v_dep
new 3: where n_dep = 30

• Para
NOME_EMP manter SAL
o valor fornecido pelo usuário para futuras
RITA utilizações, deve-se
330000 substituir o `&`por `&&`:
EVERALDO 200000
SILVIO 150000
interação para ler
SQL > run o
valor da variável
1 select nome_emp, sal
2 from emp
3 where n_dep = &&v_dep
old 3: where n_dep = &&v_dep
new 3: where n_dep = 30

NOME_EMP SAL
RITA 330000 95
Não há interação: a
EVERALDO 200000 variável
SILVIO 150000 Está permanentemente
V – Geração de Relatórios

• 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;
oldo 3: where n_emp = &v_dep podendo
ser NUMBER ou CHAR
new 3: where n_emp = 30

NOME_EMP SAL
RITA 330000
EVERALDO 200000 96
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

• 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 Parâmetros posicionais
de comandos

97
• 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
sal > = &2; segundo
parâmetro

V – Geração de Relatórios

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
98
no arquivo “relat1.lst”
SQL > apool relat1
SQL > start listaemp 10 100000
SQL > rem O primeiro parametro determina o departamento onde os
SQL > rem empregados selecionados trabalham
SQL > rem O segundo 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

• Se o comando SPOOL OUT for substituído por SPOOL OFF, o


arquivo de saída não será impresso.

SQL > set echo off


• > Para
SQL set verifyevitar
off que os próprios comandos e mensagens do
SQL > SQL*Plus
set feedback offsejam enviadas para o arquivo juntamente com o
SQL > relatório.
spool relat1
SQL > start listaemp 10 10000

N_EMP NOME_EMP
175 PAULO
99
230 ANA
SQL > spool out
V – Geração de Relatórios

• 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; 100
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

• As opções NEW_VALUE E OLD_VALUE do comando


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

V – Geração de Relatórios
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
• vamos
201 agora considerar
EVERALDO o seguinte
$200,000.00 relatório:
$5,000.00 1.48

data de hoje
número da página

102
departamento dos empregados
Departamento: VENDAS apresentados nesta página
V – Geração de Relatórios

• 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; 103
2. Definir os formatos das colunas

column n_emp format 9999 heading `Num`


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

3. Definir o agrupamento por departamento:

break on nome_dep skip page

4. Definir duas 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

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

set echo off


set pagasize 20
set linesize 75
set newpage 0
whenever sqlerror exit sql.sqlcode;
Vcolumn
– Geraçãon_empde format A 15 heading `Nome empregado`
Relatórios
column sal format $999,999,999.99 heading `Salario`
column comissao format $999,999,999.99 heading `Comissao`
column porcent_com format 9.99 heading `Porc.`
column data format A8
• Os
break comandos
on nome_dep necessários à geração do relatório
skip page sendo
column nome_dep old_value
especificado vardep_ant
poderiam new_value vardep_novo
(ou deveriam) estar armazenadas em um
column data new_value varhoje noprint
arquivo do sistema operacional, RELATORIO.SQL:
column nome_dep noprint
ttitle left varhoje center `Relatorio de Empregados` -
righe `Pag.`sql.pno skip 1 left `Departamento: `vardep_novo skip 2
btitle left `Departamento: `vardep_ant
spool relatorio
select nome_dep, n_emp, sal, nvl(com,0) 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 105
order by nome_dep, 6 desc;
spool out
V – Geração de Relatórios

• Dessa forma, o comando:

$ sqlplus –s ora 1/senha1 @relatorio

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

V – Geração de Relatórios

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”

107
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

Relatorio de Empregados

Departamento Nome Cargo Salário


ADMINISTRAÇÃO PAULO PRESIDENTE 500000
ANA SECRETARIA 120000
***************

avg 310000
sum 620000

V – Geração de Relatórios
PESQUISA SAMANTA ANALISTA 150000
UBIRATAN DIRETOR 300000
RENATO ANALISTA 100000
2. Faça um arquivo
************** de comando SQL*Plus chamado “ex52.sql” de
forma que sua execução exiba o seguinte resultado:
avg 183333.333
sum 550000

VENDAS RITA DIRETOR 330000


SILVIO VENDEDOR 150000
EVERALDO VENDEDOR 200000
**************
108
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

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

109
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

110
VI – Expressões e funções

111
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

112
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

113
VI – Expressões e funções

[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

114
VI – Expressões e funções

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

115
VI – Expressões e funções

• 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

116
VI – Expressões e funções

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`

117
VI – Expressões e funções

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`

118
VI – Expressões e funções

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

119
VI – Expressões e funções

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

120
VI – Expressões e funções

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

121
VI – Expressões e funções

• 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

122
VI – Expressões e funções

• 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`)

123
VI – Expressões e funções

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

124
VI – Expressões e funções

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;

125
VI – Expressões e funções

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.

126
VI – Expressões e funções

VII – Consultas avançadas

127
VII - Conteúdo

1. Pseudo-colunas

2. Junção externa

3. Auto-Junção

4. Consultas encaixadas

5. Consultas hierárquicas

128
VII – Consultas avançadas

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


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

SYSDATE USER ROWID


07-JAN-91 CURSO 00000984.0001.0001

129
VII – Consultas avançadas

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

130
VII – Consultas avançadas

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

131
VII – Consultas avançadas

• 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
3 where dep.n_dep = emp.n_dep ( + ); para 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

132
VII – Consultas avançadas

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

133
VII – Consultas avançadas

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
SQL > select n_emp, nome_emp, sal
delimitam a
2 from emp sub-consulta
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


elimina os valores
2 from dep
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

134
VII – Consultas avançadas

• 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

135
VII – Consultas avançadas

• 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
2 from emp x existe ou não!
3 where exists ( select `x` from emp y
4 where x.n_emp = y.chefe )

136
VII – Consultas avançadas

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

137
VII – Consultas avançadas

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

138
VII – Consultas avançadas

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

139
VII – Consultas avançadas

• Para saber todos os superiores de Everaldo:

SQL > select n_emp, nome_emp, cargo


indica o sentido da
2 from emp
consulta:
3 where nome_emp < > `EVERALDO` do empregado para o chefe
4 connect by n_emp = prior cheve
5 start with nome_emp = `EVERALDO`

indica o começo
da
especifica a conexão da
consulta

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


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

140
VII – Consultas avançadas

• 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

141
VII – Consultas avançadas

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.

142
VII – Consultas avançadas

VIII – Tópicos avançados

143
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

144
VIII – Tópicos avançados

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

145
VIII – Tópicos avançados

• 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

146
VIII – Tópicos avançados

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

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

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

148
VIII – Tópicos avançados

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

149
VIII – Tópicos avançados

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

150
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

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

151
VIII – Tópicos avançados

• É 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;

152
VIII – Tópicos avançados

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

153
VIII – Tópicos avançados

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

154
VIII – Tópicos avançados

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

155
o Oracle utilizará
o
índice emp_num

VIII – Tópicos avançados

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

156
VIII – Tópicos avançados

• 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

157
VIII – Tópicos avançados

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
10 ADMINISTRAÇÃO
175 PAULO ...10
20 PESQUISA
189 RITA ...30
30 VENDAS
201 EVERALDO ...30
40 PRODUÇÃO
208 SILVIO ...30
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

158
VIII – Tópicos avançados

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

159
VIII – Tópicos avançados

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

160
VIII – Tópicos avançados

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

SQL > create table proj (


2 n_proj number( 5 ) not null,
3 nome_proj char( 20 ),
4 n_dep number( 2 ) not null
5 ) cluster proj_dep( n_dep );

• Para associar uma tabela já existente a um cluster:

SQL > create table tmp


2 cluster proj_dep( n_dep )
3 as select * from dep;

Table created

SQL > drop table dep;

Table dropped.

SQL > rename tmp to dep;

Table renamed.

161
VIII – Tópicos avançados

• 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

162
VIII – Tópicos avançados

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

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

• 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

164
VIII – Tópicos avançados

• 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

165
VIII – Tópicos avançados

• Para saber todos as tabelas, sinônimos, seqüências e visões às


quais você tem acesso:

SQL > select table_name, owner, table_typefrom 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 166
EMP_NUM EMP N_EMP
EMP_NOME EMP NOME_EMP
VIII – Tópicos avançados

• 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

167
VIII – Tópicos avançados

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

168
VIII – Tópicos avançados

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.

169
VIII – Tópicos avançados

AP. A – Tabelas utilizadas

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

171
Ap. A – Tabelas utilizadas

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)

172
• Conteúdo:

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

Ap. A – Tabelas utilizadas

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)

173
Ap. A – Tabelas utilizadas

• 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) 174
N_DEP NUMBER(2)
Ap. A – Tabelas utilizadas

Ap. B – Sumário dos Comandos

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

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

• 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

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


• 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

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

AP. C – Resposta dos exercícios

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

II.2:
insert intoaluno
values ( `Joao da Silva Neto`, `Rua Brasincas, 145`, `Sao Paulo`,
`SP`, 01250, `12-JAN-11`);
insert into aluno
values ( `Joao da Silva Junior`, `Rua Tiradentes, 897`, `Bauru`,
`SP`, 12450, `24-APR-11`);
insert into aluno
values ( `Matias da Silva Salgado`, `Rua Rui Barbosa, 145`,
`Sao Paulo`, `SP`, 01124, `13-AUG-11`);
insert into aluno
values ( `Ana Rosa da Silva Salgado`, `Rua Brás Cubas, 789`,
`Curitiba`, `PR`, 80530, `01-OCT-11`);
180
II.3:
column niver format a5
select nome “Aluno”, to_char( aniversario, `DD/MM` ) “ Niver”
from aluno;

Ap. C – Resposta dos exercícios


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`
181
III.3:

select nome_emp, cargo, sal / 160


from emp
order by 3 desc;

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

Ap. C – Resposta dos exercícios

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;

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

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

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

Ap. C – Resposta dos exercícios

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;
183
IV.7:
delete from aluno
where nome = `Joaquim Alfredo Guimarães`;
commit;

Ap. C – Resposta dos exercícios

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

IV.9:
describe dep_sal
select * from dep_sal;

IV.10:

update emp
set sal = 300000
where nome_emp = `SAMANTA`;
select * from dep_sal;

184
IV.11:
rollback;

Ap. C – Resposta dos exercícios


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

V.2:
set echo off
set feedback off
set linesize 50
set pagasize 40
ttitle center “Relatorio de Empregados” skip 2
break on Departamento skip 1
compute avg sum of Salario on Departamento
select nome_dep “Departamento”, nome_emp “Nome”, cargo
“Cargo”, sal “Salario”
from emp, dep
where emp.n_dep = dep.n_dep
order by nome_dep; 185
Ap. C – Resposta dos exercícios
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 186
com is not null;
VI.2:
select userenv( `sessionid`), userenv( `terminal`)
from dual;

Ap. C – Resposta dos exercícios


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

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

VI.5:

select trunc( to_number(


months_between( max( data_adm ), min( data_adm ))
)) MESES
from emp;

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

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

Ap. C – Resposta dos exercícios


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;
188
VII.2:
select nvl( chefe.nome_emp, `-------` ) NOME_CHEFE,
func.nome_emp NOME_FUNC
from emp func, emp chefe
where func.chefe = chefe.n_emp (+)
order by 1;

Ap. C – Resposta dos exercícios


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

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

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

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

Ap. C – Resposta dos exercícios


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

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

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

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

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

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

Ap. C – Resposta dos exercícios

191