apostila sql
TRANSCRIPT
Índice
Conteúdo 3I - Introdução 4
1.1 - Objetivos do curso 51.2 - O que é SQL*Plus 6
II - Comandos SQL e SQL*Plus 7II-Conteúdo 811.1 - Ativação do SQL*Plus 911.2 - Criação de tabelas 1011.3 - Manipulação de tabelas 1211.4 - Formatação de relatórios 1611.5 - Edição de comandos 1711.6 - Outros comandos 22II - Exercícios 23
III - Consultas básicas 24111-Conteúdo 25111.1 - Seleção de colunas 26111.2- Uso de expressões 27111.3 - Seleção de linhas 29111.4 - Ordenação de resultados 31111.5 - Agrupamento 33111.6 - Operações de conjunto 35111.7 - Junção de tabelas 39III - Exercícios 44
IV- Criação e uso de tabelas 451V-Conteúdo 461V.1 -CREATETABLE 47IV.2 - Tipos de colunas 51IV.3 - Alteração de uma tabela 52lV.4 - O comando INSERT 54lV.5 - O comando DELETE 56IV.6 - O comando UPDATE 57IV.7 - Controle de transações 59lV.8 - Manipulação de visões 67IV.9 - Criação de seqüências 72IV - Exercícios 73
V -Geração de Relatórios 75V - Conteúdo 76V.1 - Formatação de colunas 77V.2 - Formatação de títulos 80V.3 - BREAK e COMPUTE 84V.4 - Parâmetros de controle 89V.5 - Utilização de variáveis 93V.6 - Relatórios avançados 98
1
V - Exercícios 107VI - Expressões e funções 110
VI- Conteúdo 111VI.1 - Operadores 112Vl.2 - Funções numéricas 114VI.3 - Funções de caracteres 116VI.4 - Funções de grupo 119VI.5 - Conversão entre tipos 120VI.6 - Funções de datas 123Vl.7 - Outras funções 124VI – Exercícios 125
VII - Consultas avançadas 126VII-Conteúdo 127VII.1 - Pseudo-colunas 128VII.2 - Junção externa 129VII.3 - Auto-Junção 132VII.4 - Consultas encaixadas 133VII.5 - Consultas hierárquicas 138VII - Exercícios 141
VIII - Tópicos avançados 142VIII - Conteúdo 143VIII.1 - Manutenção de usuários 144VllI.2 - Privilégios de acesso 146VIII.3 - Acesso concorrente 149VIII.4 - lndices 153VIII.5 - Clusters 157VIII.6 - Dicionário de dados 162VIII - Exercícios 168
Ap. A- Tabelas utilizadas 169 Ap. B- Sumário dos Comandos 174Ap. 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.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
comando do controle
I.2 – O que é SQL*Plus
É a interface básica para manipulações genéticas de um banco de dados ORACLE
O SQL + SQL
BD ORACLE
Características principais:
- interpretador de comando SQL
- possui extensões para formatação de relatórios
I – Introdução
6
SQL*PLUS
Parâmetros deControle deformatação
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
II.1 – Ativação do SQL*Plus
Para entrar no SQL*Plus, digite:
8
ou
Para sair do SQL*Plus, digite:
II – Comandos SQL e SQL*Plus
II.2 – Criação de tabelas
O que é uma tabela?
9
$ 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: ora1Enter password: ____Connected to: ORACLE RDBMS V6.0.27.9.2, with transaction...PL/SQL V1.0.29.1.0 – BetaSQL>
a senha não é exibida
$ sqlplus ora 1/senha1SQL*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 – BetaSQL >
a senha é exibida
SQL > exit$
II – Comandos SQL e SQL*Plus
Para criar a tabela de empregados
10
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
Coluna
Nome da coluna Linha (ou registro)
Campos
II – Comandos SQL e SQL*Plus
II.3 Manipulação de tabelas
11
SQL > create table emp (2 n_emp number (4) not null,
3 nome_emp char (10),
4 cargo char (10)
5 chefe number (4),
6 data_adm date,
7 sal number (10,2),
8 com number (10,2),
9 n_dep number (2) );
“.” Separa as definiçõesdas colunas
“.” Executa o comando
Indica a continuação do comando
N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP
Somente o cabeçalho
Para inserir informações na tabela EMP:
II – Comandos SQL e SQL*Plus
Para recuperar as informações da tabela EMP:
12
SQL > insert into emp values
2 ( 103, `SAMANTA`, `ANALISTA`, 110,
3 ´17-MAR-85´, 150000, NULL, 209;
SQL > insert into emp values2 ( 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
SQL > select * from emp;
Nome da coluna
Para recuperar apenas o nome dos empregados que são analistas:
II – Comandos SQL e SQL*Plus
Para remover o empregado de número 110:
13
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
SQL > select nome_emp2 from emp
3 where cargo = ´ANALISTA`;
NOME_EMP
SAMANTARENATO
Condição a ser satisfeita
Maiúsculas e minúsculas somentefazem diferença
entre ``(aspas simples)
Para remover todos os empregados admitidos a partir de 1989:
II – Comandos SQL e SQL*Plus
Para atualizar o salário do funcionário 110:
14
SQL > delete from emp 2 where n_emp = 110;
SQL > delete from emp 2 where data_adm > = `01-JAN-89´;
II – Comandos SQL e SQL*Plus
II.4 Formatação de relatórios
Comandos SQL x Comandos SQL*Plus
15
N_EMP NOME_EMP ... SAL ...110 UBIRATAN 300000
SQL > update emp2 set sal = 3500003 where n_emp= 110;
N_EMP NOME_EMP ... SAL ...110 UBIRATAN 350000
- 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:
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
16
SQL > column n_emp heading NUMERO
SQL > column nome_emp heading NOME
SQL > column sal format 999999.99 –
> heading SALARIO
SQL > select n_emp, nome_emp, sal from emp;
Comandos SQL*Plus nãoPrecisam de “;”
Para continuar um comando,Use o caractere “_”
NUMERO NOME SALARIO
103 SAMANTA 150000.00
110 UBIRATAN 300000.00
175 PAULO 500000.00
189 RITA 330000.00
201 EVERALDO 200000.00
208 SILVIO 150000.00
230 ANA 120000.00
276 RENATO 100000.00
Para listar o conteúdo do buffer:
Para apagar a linha corrente:
II – Comandos SQL e SQL*Plus
Para inserir linha após a linha corrente:
17
SQL > listouSQL > I
1 select2 n_emp, nome_emp3 from emp4* where n_emp =110
Qualquer em desses comandoPoder ser utilizado
“*” indica a linha corrente
SQL > delSQL > I
1 select2 n_emp, nome_emp3* from emp
SQL > list 2 2* n_emp, nome_empSQL > inputouSQL > I
3 cargo,4 sal5
SQL > list1 select2 n_emp, nome_emp3 cargo,4 sal5* from emp
Para acrescentar caracteres no fim da linha corrente:
II – Comandos SQL e SQL*Plus
Para substituir caracteres da linha corrente:
18
Deixe uma linha em brancoPara terminar a inserção
SQL > list 2 2* n_emp, nome_empSQL > append, chefe,ouSQL > a, chefe,SQL > list
1 select2 n_emp, nome_emp, chefe,3 cargo,4 sal5* from emp
SQL > list 2 2* n_emp, nome_emp, chefe,SQL > change/chefe/sal/ouSQL > c/chefe/sal/SQL > list
1 select2 n_emp, nome_emp, sal,3 cargo,4 sal5* from emp
Para executar o comando existente no buffer:
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:
19
SQL > runou SQL > rouSQL > /
Para saber qual é o buffer corrente:
Para modificar o conteúdo do buffer corrente com um editor externo:
O editor externo pode ser especificado pelo usuário da seguinte forma:
II – Comandos SQL e SQL*Plus
para salvar o buffer corrente num arquivo do Sistema Operacional:
20
SQL > set buffer teste
SQL > show bufferbuffer TESTE
SQL > edit
SQL > define _ editor = vi
SQL > save arquivo
Para recuperar um comando SQL armazenado num arquivo:
Para executar um seqüência de comando (SQL ou SQL*Plus) armazenada num arquivo:
Para editar um arquivo qualquer do sistema operacional:
II – Comandos SQL e SQL*Plus
II.6 – Outros comandos
Para executar um comando qualquer do sistema operacional:
21
nome do arquivo; a extensão .sql éacrescentada automaticamente
SQL > get arquivo
SQL > start arquivoouSQL > @arquivo
SQL > edit en21
É assumida a extensão “.sql”
SQL > hostouSQl > !total 20drwxr-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:
Para saber todos os comandos disponíveis:
II – Comandos SQL e SQL*Plus
II - Exercícios
1. Crie uma tabela chamada “ALUNO” com as seguintes colunas:
NOME CHAR( 30 ) NOT NULLENDER CHAR( 50 )
22
SQL > help select
nome do comando
SQL > help commands
CIDADE CHAR( 25 )ESTADO CHAR( 2 )CEP NUMBER( 5 )ANIVERSARIO DATE
dica: veja um exemplo na página 11
2. Insira dados sobre você e algum membro da sua família na tabela ALUNO(dica: exemplos na página 12)
3. Consulte o nome e a data de aniversário das pessoas cadastradas(dica: exemplo na página 13)
4. Consulte o seu (e somente o seu ) endereço completo
5. Salve o comando anterior no arquivo “ex24.sql”, saia do SQL*Plus, entre novamente e execute o comando contido no arquivo gerado
II – Comandos SQL e SQL*Plus
23
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
III.1 – Seleção de colunas
Para indicar as colunas a serem recuperadas de uma tabela:
25
SQL > select n_emp, nome_emp2 from emp3 where n_emp < 200;
N_EMP NOME_EMP
103 SAMANTA110 UBIRATAN175 PAULO189 RITA
A ordem em que as colunas são especificadas muda a apresentação do resultado:
III – Consultas básicas
III.2 – Uso de expressões
Para saber o salário anual dos empregados
26
SQL > select nome_emp, n_emp2 from emp3 where n_emp < 200;
NOME_EMP N_EMP
SAMANTA 103UBIRATAN 110PAULO 175RITA 189
NOME_EMP CARGO SAL
SAMANTA ANALISTA 150000UBIRATAN DIRETOR 300000PAULO PRESIDENTE 500000RITA DIRETOR 330000EVERALDO VENDEDOR 200000SILVIO VENDEDOR 150000ANA SECRETARIA 120000RENATO ANALISTA 100000
III – Consultas básicas
Para saber o nº total de caracteres nas colunas NOME_EMP E CARGO
27
SQL > select nome_emp, 12* sal from emp;
NOME_EMP 12*SAL
SAMANTA 1800000UBIRATAN 3600000PAULO 6000000RITA 3960000EVERALDO 2400000SILVIO 1800000ANA 1440000RENATO 1200000
NOME_EMP CARGO SAL
SAMANTA ANALISTA 150000UBIRATAN DIRETOR 300000PAULO PRESIDENTE 500000RITA DIRETOR 330000EVERALDO VENDEDOR 200000SILVIO VENDEDOR 150000ANA SECRETARIA 120000RENATO ANALISTA 100000
SQL > select2 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
III.3 – Seleção de linhas
Para saber os nomes dos empregados que trabalham no departamento 20:
28
N_EMP NOME_EMP CARGO ... N_DEP
103 SAMANTA ANALISTA ... 20110 UBIRATAN DIRETOR ... 20175 PAULO PRESIDENTE ... 10189 RITA DIRETOR ... 30201 EVERALDO VENDEDOR ... 30208 SILVIO VENDEDOR ... 30230 ANA SECRETARIA ... 10276 RENATO ANALISTA ... 20
III – Consultas básicas
Para saber o tempo de serviço dos funcionários cuja comissão é maior que 5% do salário:
29
SQL > select nome_emp3 from emp4 where n_dep = 20;
NOME_EMP
SAMANTAUBIRATANRENATO
SQL > select nome_emp,2 months_between( sysdate, data_adm ) MESES3 from emp4 where com > sal * 0.05;
III – Consultas básicas
III.4 – Ordenação de resultados
Para listar os funcionários em ordem alfabética:
30
NOME_EMP MESES
SILVIO 48.689726
SQL > select nome_emp, cargo, sal2 from emp3 order by nome_emp;
III – Consultas básicas
Para listar os empregados em ordem decrescente de salário, por cargo:
31
NOME_EMP CARGO SAL
ANA SECRETARIA 120000EVERALDO VENDEDOR 200000PAULO PRESIDENTE 500000RENATO ANALISTA 100000RITA DIRETOR 330000 SAMANTA ANALISTA 150000SILVIO VENDEDOR 150000UBIRATAN DIRETOR 300000
SQL > select nome_emp, cargo, sal2 from emp3 where cargo in ( `ANALISTA`, ´VENDEDOR`,4 `DIRETOR`, ´SECRETARIA` )5 order by cargo, sal desc;
NOME_EMP CARGO SAL
SAMANTA ANALISTA 150000RENATO ANALISTA 100000RITA DIRETOR 330000UBIRATAN DIRETOR 300000ANA SECRETARIA 120000EVERALDO VENDEDOR 200000SILVIO VENDEDOR 150000
Pode-se usar expressões ou referencias à posição de expressões no SELECT como argumento do ORDER BY:
III – Consultas básicas
III.5 - Agrupamento
Para saber quantos funcionários trabalham em cada departamento:
32
SQL > select nome_emp, cargo, length( cargo ), sal2 from emp3 where cargo in (`ANALISTA`, `VENDEDOR`,4 `DIRETOR`, `SECRETARIA`)5 order by 3, sal – nvl(com, 0 ) desc;
Indica a 3ª expressão doSELECT, que é“length(cargo)”
N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP
230 ANA SECRETARIA 175 01-MAY-89 120000 10
175 PAULO PRESIDENTE 27-FEB-86 500000 10
103 SAMANTA ANALISTA 110 17-MAR-85 150000 20
276 RENATO ANALISTA 110 30-APR-86 100000 20
110 UBIRATAN DIRETOR 175 20-APR-85 300000 20
189 RITA DIRETOR 175 25-DEC-85 330000 5000 30
201 EVERALDO VENDEDOR 189 28-SEP-86 200000 3000 30
208 SILVIO VENDEDOR 189 30-OCT-86 150000 9000 30
Para saber quantos funcionários trabalham em cada departamento:
22222222222jhglkjhgflkgjhfdlghfg ,lhdlfgn v
Nota : omitir a cláusula “GROUP BY” significa agrupar toda a tabela
III – Consultas básicas
Para saber a soma dos salários para os cargos onde a média de salários é maio que 150000:
33
SQL > select n_dep, count(*)2 from emp3 group by n_dep;
2
3
3
coluna do agrupamento “todas as linhas”
Função de grupo
critério de agrupamentoN_DEP COUNT(*)
10 220 330 3
N_EMP NOME_EMP CARGO ... SAL ...
103 SAMANTA ANALISTA ... 150000 ...276 RENATO ANALISTA ... 100000 ...
110 UBIRATAN DIRETOR ... 300000 ...189 RITA DIRETOR ... 330000 ...175 PAULO PRESIDENTE ... 500000 ...
230 ANA SECRETARIA ... 120000 ...
201 EVERALDO VENDEDOR ... 200000 ...208 SILVIO VENDEDOR ... 150000 ...
AVG = 125000
AVG = 315000
AVG = 120000AVG = 175000
SQL > select cargo, sum( sal ), max( sal )2 from emp3 group by cargo4 having avg( sal ) > 150000;
seleciona os grupos(“where” de grupo)
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:
34
função de grupo
CARGO SUM(SAL) MAS(SAL)DIRETOR 630000 330000PRESIDENTE 500000 500000VENDEDOR 350000 200000
(A, 1)
(B, 1)
(D, 2)
Col. 1 Col. 2A 1B 1D 2
Tabela Conjunto
Existem três operações básicas de conjunto em SQL:
- união (UNION)
- intersecção (INTERSECT)
- diferença (MINUS)
III – Consultas básicas
União:
TABELAS CONJUNTOS
TAB1 TAB2 Cj1 Cj2
35
elementosdo
conjunto
Col. 1 Col. 2A 1B 1D 2
colunas com tipo igual
select col1, col2 from tab1 Cj1 U Cj2
union
select col1, col2 from tab2
III – Consultas básicas
Intersecção:
TABELAS CONJUNTOS
Col. 1 Col. 2A 2B 1E 2D 2
Col. 1 Col. 2A 1A 2B 1D 2E 2
36
(A, 1)
(B, 1)
(D, 2)
(A, 2)(B, 1)(E, 2)(D, 2)
(A, 1)(A, 2)(B, 1)(D, 2)(E, 2)
TAB1 TAB2 Cj1 Cj2
Col. 1 Col. 2A 1B 1D 2
colunas com tipo igual
select col1, col2 from tab1 Cj1 inter Cj2
intersect
select col1, col2 from tab2
III – Consultas básicas
Diferença:
TABELAS CONJUNTOS
TAB1 TAB2 Cj1 Cj2
Col. 1 Col. 2A 2B 1E 2D 2
Col. 1 Col. 2B 1D 2
37
(A, 1)
(B, 1)
(D, 2)
(A, 2)(B, 1)(E, 2)(D, 2)
(B, 1)(D, 2)
Col. 1 Col. 2A 1B 1D 2
colunas com tipo igual
select col1, col2 from tab1 Cj1 - Cj2
minus
select col1, col2 from tab2
III – Consultas básicas
III.7 – Junção de tabelas
A junção de tabelas corresponde à operação de produtos cartesiano entre conjuntos:
Col. 1 Col. 2A 2B 1E 2D 2
Col. 1 Col. 2A 1
38
(A, 1)
(B, 1)
(D, 2)
(A, 2)(B, 1)(E, 2)(D, 2)
(A, 1)
A,B, C 1, 2
X
tab1 tab2col1 col2 col3 col4 col5A 3 B 2 E
select col1, col2, col3, col4, col5from tab1, tab2;
Col1 col2 col3 col4 col5A 3 B 2 E
III – Consultas básicas
Para saber o nome do departamento onde cada empregado trabalha:
39
(A, 1), (A, 2),
(B,1), (B,2),
(C,1), (C, 2)
SQL > select nome_emp, nome_dep2 from emp, dep
3 where emp.n dep = dep.n_dep;
produto cartesiano
critério de seleção da junção
para diferenciar coluna demesmo nome usa-se o no-me da tabela como prefixo
NOME_EMP NOME_DEP
PAULO ADMINISTRAÇÃO ANA ADMINISTRAÇÃOSAMANTA PESQUISAUBIRITAN PESQUISARENATO PESQUISARITA VENDASSILVIO VENDASEVERALDO VENDAS
III – Consultas básicas
40
NOME_EMP NOME_DEP EMP.N_DEP DEP.N_DEP
SAMANTA ADMINISTRAÇÃO 20 10UBIRATAN ADMINISTRAÇÃO 20 10
UBIRATAN ADMINISTRAÇÃO 20 10
PAULO ADMINISTRAÇÃO 10 10
RITA ADMINISTRAÇÃO 30 10
EVERALDO ADMINISTRAÇÃO 30 10
SILVIO ADMINISTRAÇÃO 30 10
ANA ADMINISTRAÇÃO 10 10
RENATO ADMINISTRAÇÃO 20 10
SAMANTA PESQUISA 20 20
UBIRATAN PESQUISA 20 20
PAULO PESQUISA 10 20
RITA PESQUISA 30 20
EVERALTO PESQUISA 30 20
SILVIO PESQUISA 30 20
ANA PESQUISA 10 20
RENATO PESQUISA 20 20
SAMANTA VENDAS 20 30
UBIRATAN VENDAS 20 30
PAULO VENDAS 10 30
RITA VENDAS 30 30
EVERALDO VENDAS 30 30
SILVIO VENDAS 30 30
ANA VENDAS 10 30
RENATO VENDAS 20 30
SAMANATA PRODUÇÃO 10 40
PAULO PRODUÇÃO 10 40
RITA PRODUÇÃO 30 40
EVERALDO PRODUÇÃO 30 40
SILVIO PRODUÇÃO 30 40
ANA PRODUÇÃO 10 40
RENATO PRODUÇÃO 20 40
III – Consultas básicas
Dada a tabela FAIXA_SAL, que classifica faixas de salários:
41
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:
III – Consultas básicas
Pode-se combinar diversas opções no mesmo comando SQL:
42
SQL > select nome_emp, sal, faixa2 from emp, faixa_sal3 where sal between salmin and salmax;
NOME_EMP SAL F
ANA 120000 BRENATO 100000 BSAMANTA 150000 CSILVIO 150000 CUBIRATAN 300000 DRITA 300000 DEVERALDO 200000 DPAULO 500000 E
especifica um tipo de junção
SQL > select nome_dep, faixa, count( * )2 from emp, dep, faixa_sal3 where emp.n_dep = dep.n_dep and4 sal between salmin and salmax5 group by nome_dep, faixa6 having sum( sal ) > 1200007 order by nome_dep, count( * ) desc
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”.
43
NOME_DEP F COUNT(*)
ADMINISTRAÇÃO E 1PESQUISA C 1PESQUISA D 1VENDAS D 2VENDAS C 1
2. Consulte o nome e o total mensal (salário mais comissão) recebido pelos vendedores da tabela EMP.
3. Carregue o conteúdo do arquivo “ex31.sql” no buffer corrente e modifique-o de forma a ordenar o resultado em ordem decrescente do salário por hora; salve seu exercício novamente, no mesmo arquivo.
4. Descubra o menor salário de todos os empregados. Dica: vela a nora da página 33.
5. Descubra o menor, o maior e a média dos salários de cada departamento, para aqueles departamentos que tem mais de um empregado. Dica: veja a página 34.
6. Consulte o nome e o departamento de todos os empregados que
trabalham em São Paulo ou Campinas; salve sei exercícios no arquivo “ex36.sql”. Dica: faça uma junção da tabela EMP com a tabela DEP (página 42), e recupere somente as linhas onde a localidade do departamento é São Paulo ou Campinas.
III – Consultas básicas
44
3. Alteração de uma tabela
4. O comando INSERT
5. O comando DELETE
6. O comando UPDATE
7. Controle de transações
8. Manipulação de visões
9. Criação de seqüências
IV – Criação e uso de tabelas
IV.1 – CREATE TABLE
O comando CREATE TABLE é usado para criar novas tabelas no banco de dados
- Forma 1:
46
CREATE TABLE nome_da_tabela (
coluna_1 tipo1,coluna_2 tipo2( tamanho ),coluna_3 tipo3 restrições,coluna_4 tipo4( tamanho ) restriçõesrestrições
);
especificação do tamanhoentre parênteses
Definição das colunas separadas
por “,”
» nome_da_tabela nome da tabela a ser criada» coluna_1,... colunas da tabela» tipo1, tipo2,... tipos das respectivas colunas» tamanho tamanho para um tipo» restrições uma combinação de zero ou mais de:
>NULL ou NOT indica que a coluna pode conter valores nulos (opção “default”) ou não
>DEFAULT expr determina o valor “default” da coluna como sendo expr
>UNIQUE indica que não podem existir valores duplicados para esta coluna. Não pose ser usado com PRIMARY KEY
>PRIMARY KEY indica que esta coluna é chave primaria. Não pode ser usado com UNIQUE.
IV – Criação e uso de tabelas
>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.
47
>CHECK determina que o valor desta coluna deve condição obedecer á condição lógica especificada
>CONSTRAINT determina que o valor desta coluna deve nome_restr obedecer à restrições nome_restr
OBS: Embora todas as restrições acima possam ser definidas, o RDBMS ORACLE versão 6 só garante a primeira: NULL ou NOT NULL. Entretanto, o SQL*Forms 3.0 é capaz de gerar código automaticamente para vários tipos de restrições.
Exemplo:
IV – Criação e uso de tabelas
- Forma 2:
48
SQL > CREATE TABLE emp 2 ( n_emp number(4) NOT NULL PRIMARY KEY, 3 nome_emp char(10) NOT NULL, 4 cargo char(10), 5 chefe number(4) REFERENCES emp(n_emp), 6 data_adm date DEFAULT sysdate
7 CHECK (data_adm < = sysdate),8 sal number(10,2),9 com number(10,2) CHECK(com > 0),10 n_dep number(2) REFERENCES dep(n_dep) );
CREATE TABLE tabelas ASSELECT col1, col2, ... colnFROM ...
- Cria uma tabela igual ao resultado da consulta executada com o comando “SELECT”
- Exemplo:
IV – Criação e uso de tabelas
Para verificar a estrutura de uma tabela
49
SQL > create table sal_médio as2 select nome_dep, avg( sal ) “Media_Salario”3 from dep, emp4 where emp.n_dep = dep.n_dep5 group by nome_dep;
SQL > select * from sal_médio;
NOME_DEP Media_Salário
ADMINISTRAÇÃO 310000PESQUISA 183333.333VENDAS 226666.667
SQL > describe empOuSQL > desc empName Null? TypeN_EMP NOT NULL NUMBER(4)NOME_EMP NOT NULL CHAR(10)CARGO CHAR(10)CHEFE NUMBER(4)DATA_ADM DATESAL NUMBER(10,2)COM NUMBER(10,2)N_DEP NUMBER(2)
Para remover uma tabela:
Para mudar o nome de uma tabela:
IV – Criação e uso de tabelas
IV.2 – Tipos de colunas
O Oracle suporta os seguintes tipos:
CHAR [(tamanho)]
50
SQL > drop table faixa_sal;
SQL > rename dep to departamento;
VARCHAR [(tamanho)] (sinônimo de CHAR)
CHARACTER [(tamanho)] (sinônimo de CHAR)
DATE
NUMBER [(tamanho [, decimais] )]
DECIMAL [(tamanho [, decimais] )]
INTEGER, INT (sinônimos de NUMBER)
NUMERIC, DEC (sinônimo de DECIAMAL)
FLOAT [(tamanho)]
REAL
DOBLE PRECISION
LONG
RAW (tamanho), LONG RAW
IV – Criação e uso de tabelas
IV.3 – Alteração de uma tabela
51
SQL > desc depName Null? Type
N_DEP NOT NULL NUMBER(2)NOME_DEP CHAR(14)LOCAL_DEP CHAR(13)
Para acrescentar uma coluna à tabela DEP:
Para aumenta o tamanho da coluna NOME_DEP:
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.
52
SQL > alter table dep 2 add ( diretor number( 4 ) ); tabela a ser modificada
nome da coluna Tipo da coluna
SQL > alter table dep 2 modify ( nome_dep char( 30 ) );
coluna a ser modificada
novo tipo
SQL > desc depName Null? Type
N_DEP NOT NULL NUMBER(2)NOME_DEP CHAR(30)LOCAL_DEP CHAR(13)DIRETOR NUMBER(4)
- 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:
IV – Criação e uso de tabelas
IV.4 – O comando INSERT
O comando INSERT é usado para inserir linhas com uma tabela.
- Forma 1:
53
SQL > create table dep_temp as2 select n_dep, nome_dep, local_dep3 from dep;
SQL > drop table dep;SQL > rename dep_temp to dep;
INSERT INTO tabela [( cil1, col2, ... coln)]VALUES ( val1, val2, ... valn)
» tabela nome da tabela onde os dados serão inseridos
»col1, col2, ... coln lista de colunas nas quais serão inseridos os valores. Será inserido o valor NULL nas colunas não especificadas. Se nenhuma coluna for especificada, é assumida uma lista com todas as colunas da tabela na ordem apresentada pelo comando DESCRIBE.
» val1, val2, ... valn lista de valores a serem inseridos. Os valores devem concordar em nº, ordem e tipo com as colunas especificadas no comando INSERT
- Exemplo:
IV – Criação e uso de tabelas
- Forma 2:
54
SQL > Insert into emp2 (nome_emp, n_emp, cargo, chefe, data_adm, sal, n_dep)3 values ( ´SAMANTA`, 103, `ANALISTA`, 110, sysdate-30,4 150000, 20);
ouSQL > Insert into emp
2 values ( 103, `SAMANTA`, `ANALISTA`, 110, sysdate-30 3 150000, NULL, 20);
INSERT INTO tabela ( col, col2, ... coln )SELECT exp1, exp2, ... expnFROM ...
- 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:
IV – Criação e uso de tabelas
IV.5 – Comando DELETE
O comando DELETE é usado para remover linhas de uma tabela:
55
SQL > insert into faixa_sal(salmin, salmax, faixa)2 select min( sal ), max( sal ), substr( cargo, 1, 1 )3 from emp4 group by substr( cargo, 1, 1 );
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:
- Para remover todos empregados do departamento 20:
- Para remover todos os empregados:
IV – Criação e uso de tabelas
IV.6 – O comando UPDATE
O comando UPDATE é usado para alterar valores já armazenados em tabelas:
56
SQL > delete from emp where n_emp = 189;
SQL > delete from emp where n_dep = 20;
SQL > delete from emp;
UPDATE tabela SET col1 = exp1, col2, = exp2, ... coln = expnWHERE condição
ou
»tabela nome da tabela a ser atualizada
»col1, col2, ... coln colunas cujos valores serão alterados
»exp1, exp2, ... expn expressões cujos resultados serão atribuídos às colunas col1, ... coln respectivamente
»consulta consultas que deve retornar o mesmo número de colunas especificas na cláusula SET
»condição especifica as linha que serão atualizadas
IV – Criação e uso de tabelas
Exemplos
- Para colocar 1000 de comissão para o funcionário de número 208:
57
UPDATE tabela SET ( col1 [, col2 ...] ) = ( consulta )WHERE condição
SQL > update emp2 set com = 10003 where n_emp = 208;
- Para dobrar o salário de todos empregados do departamen20 e transferi-los para o departamento 30:
- Para atualizar o salário do funcionário 208 como sendo o salário de seu chefe:
IV – Criação e uso de tabelas
IV.7 – Controle de transações
58
SQL> update emp2 set sal = 2 * sal, n_dep = 303 where n_dep = 20;
SQL > update emp e 12 set sal = ( select sal from emp e23 where e2.n:emp = e1.chefe ) where e1.n_emp = 208;
Uma transação é uma seqüência “indivisível” de comandos SQL que modifica o conteúdo de banco de dados.
Por exemplo, para transferir uma certa quantia em dinheiro de uma conta A para uma conta B, devemos:
- retirar o dinheiro da conta A
- depositar o dinheiro n conta B
Para que a operação acima seja segura, ou os dois passos são executados ou nenhum deles pode ocorrer.
IV – Criação e uso de tabelas
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.
59
O fim de uma transação é determinada de uma das seguintes formas:
- execução do comando COMMIT, todas as modificações são efetivadas no banco de dados
- execução do comando ROLLBACK; nenhuma modificação é efetivada
- execução de comando de definição de dados (CREATE, ALTER, ...); equivale ao comando COMMIT
- término da sessão corrente: equivale ao comando COMMIT
- quando uma transação é interrompida por fatores externos (queda do sistema) ou internos (“deadlock”); equivale ao comando ROLLBACK
IV – Criação e uso de tabelas
Exemplo:
60
$ sqlplus ora 1/senha 1SQL*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 – BetaSQL > set feedback offSQL > select n_dep, nome_dep from dep;
N_DEP NOME_DEP
10 ADMINISTRAÇÃO20 PESQUISA30 VENDAS40 PRODUÇÃO
SQL > insert into dep values( 50, `MARKETING`. `SAO PAULO` );SQL > insert into dep values( 60, `INFORMATICA`, `CAMPINAS`);SQL > select n_dep, nome_dep from dep;
N_DEP NOME_DEP
10 ADMINISTRAÇÃO20 PESQUISA30 VENDAS40 PRODUÇÃO50 MARKETING60 INFORMATICA
SQL > commit;Commit complete.
IV – Criação e usa de tabelas
61
inibe algumas mensagens deaviso
O próprio usuário vê os dados, mas eles ainda não foram efetivados
fim da transação, comefetivação dos dados
Início de uma transação
SQL > update dep set nome_dep = `COMERCIAL`2 where n_dep = 30;
SQL > select nome_dep from dep where n_dep = 30;
NOME_DEP
COMERCIAL
SQL > rollback;Rollback complete.SQL > select nome_dep from dep where n_dep = 30;
NOME_DEP
VENDAS
SQL > delete from emp where n_emp = 103;SQL > insert into emp values
2 ( 103, `SAMANTA`, `DIRETOR`, 175, `17-MAR-85`,3 200000, NULL, 20);
SQL > commit;Commit complete.SQL > update emp set cargo = `DIRETOR`, chefe = 175, sal = 200000
2 where n_emp =103;SQL > commit;Commit complete.SQL > delete from emp
2 where n_dep = 10;SQL > exit
Início de outratransação
fim da transação; asatualizações foram
descartadas
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.
62
Produzem oMesmo efeito
inicio da ultimatransação
Fim da ultima transaçãoCom COMMIT implícito
- As modificações efetuadas no decorrer de uma transação por um usuário só são visíveis a outros usuários após a efetivação da transação (COMMIT).
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 comando de manipulação de dados:
63
USUÁRIO 1 USUÁRIO 2 SQL > select sal from emp SQL > select sal from emp 2 where n_emp = 189; 2 where n_emp = 189;
SAL SAL 330000 330000
SQL > update emp SQL >2 set sal = 4000003 where n_emp = 189;
SQL > select sal from emp SQL > select sal from emp 2 where n_emp = 189; 2 where n_emp = 189;
SAL SAL 400000 330000
SQL > commit; SQL > Commit coplete.
SQL > select sal from emp SQL > select sal from emp 2 where n_emp = 189; 2 where n_emp = 189;
SAL SAL 400000 400000
SQL > set feedback onSQL > set autocommit onSQL > 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 offSQL > delete from emp
2 where n_emp = 189;
1 record deleted.
SQL > rollback;Rollback complete.
IV – Criação e usa de tabelas
É possível determinar pontos de salvamento intermediários em transações:
64
SQL > update conta2 set saldo = saldo – 103 where codigo = 1;
SQL > savepoint ja_tirou;
SQL > update conta2 set saldo = saldo + 103 where codigo = 2;
SQL > rollback to ja_tirou;
IV – Criação e usa de tabelas
Para garantir que vários comandos SELECT recuperem sempre os mesmo dados, independentemente de transações concorrentes:
65
determina um ponto desalvamento
desfaz as modificações feitas apóso ponto de salvamento “ já_tirou”
SQL > set transction read only;SQL > select sal2 from emp3 where n_emp = 110;
SAL 300000
SQL > SQL > select sal2 from emp3 where n_emp = 110;
SAL 300000
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.
66
os resultados serãosempre iguais
Visões são utilizadas por:
- segurança : pode-se restringir o acesso a informações contidas em tabelas
Tabela Emp
Visão Emp_10
IV – Criação e usa de tabelas
- conveniência: consultas complexas podem ser simplificadas com a criação de visões
Emp Dep
67
N_EMP NOME_EMP ...N_DEP
103 SAMANTA ... 20110 UBIRATAN ...20175 PAULO ...10189 RITA ...30201 EVERALDO ...30208 SILVIO ...30230 ANA ...10276 RENATO ...20
N_EMP NOME_EMP ...N_DEP
175 PAULO ... 10
230 ANA ...10
as colunas (nome e definição) sãoherdadas da tabela origem
SQL > create view emp_10 as2 select * from emp3 where n_dep = 10;
N_EMP NOME_EMP ...N_DEP
103 SAMANTA ...20110 UIRATAN ...20175 PAULO ...10189 RITA ...30201 EVERALDO ...30208 SILVIO ...30230 ANA ...10276 RENATO ...20
Emp_Dep
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:
68
N_DEP NOME_DEP
10 ADMINISTRAÇÃO20 PESQUISA30 VENDAS40 PRODUÇÃO
NOME NUM NUM_DEPTO NOME_DEPTOSAMANTA 103 20 PESQUISAUBIRATAN 110 20 PESQUISAPAULO 175 10 ADMINISTRAÇÃO RITA 189 30 VENDASEVERALDO 201 30 VENDASSILVIO 208 30 VENDASANA 230 10 ADMINISTRAÇÃORENATO 276 20 PESQUISA
indicações para odep. 20 apenas,por motivos de
clareza
SQL > create view emp_dep ( nome, num, num_epto, nome_depto )2 as select nome_emp, n_emp, dep.n_dep, nome_dep3 from emp, dep4 where emp.n_dep = dep.n_dep;
o nome das colunas pode ser modificado
SQL > desc emp_depName 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:
IV – Criação e usa de tabelas
Uma visão pode ser criada em temo de execução:
69
SQL > select * from emp_dep;
NOME NUM NUM_DEPTO NOME_DEPTO
SAMANTA 103 20 PESQUISAUBIRATAN 110 20 PESQUISAPAULO 175 10 ADMINISTRAÇÃORITA 189 30 VENDASEVERALDO 201 30 VENDASSILVIO 208 30 VENDASANA 230 10 ADMINISTRAÇÃORENATO 276 20 PESQUISA
SQL > select ep.nome_emp, dp.nome_dep 1 from emp ep, ( select de.n_dep, de.nome_dep
2 from dep de ) dp3 where ep.n_dep = dp.n_dep
nome_emp nome_depSAMANTA PESQUISAUBIRATAN PESQUISAPAULO ADMINISTRAÇÃORITA VENDAS...
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
70
- 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:
Para remover uma visão:
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:
71
SQL > set long 500SQL > select tex from eser_views where view_name = `EMP_DEP`;TEXT
select nome_emp, n_emp, dep.n_dep, nome_depfrom emp, depwhere emp.n_dep = dep.n_dep
SQL > drop view emp_dep;
faz o SQL*Plus mostrar até 500 caracteres decolunas do tipo LONG
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” :
Para usá-la:
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).
72
SQL > CREATE SEQUENCE seq_emp 2 START WITH 1 NOMAXVALUE ORDER;
SQL > INSERT INTO( nome_emp, n_emp, ...) 2 VALUES ( `PROXIMO CLIENTE`, seq_emp.NEXTVAL, ...);
2. mude o nome da tabela EMPREG para TEMP e depois a remova.
3. altere a estrutura da tabela ALUNO criada no exercício a da parte II, de forma a:
a) aumenta o tamanho da coluna CIDADE para 35 caracteres
b) acrescentar o campo SAL_DESEJADO, com tipo numérico de 9 dígitos na parte inteira e 2 casas decimais. Dica: lembre-se que o tamanho de um numero é dado pela soma dos dígitos na parte inteira com os dígitos na parte decimal do numero.
4. Insira os seguintes dados de um(a) amigo(a) seu(sua) na tabela ALUNO: NOME, ANIVERSARIO e SAL_DESEJADO
5. Atualize o seu salário desejado e o endereço completo da pessoa cadastrada no exercício anterior.
6. Remova o atributo SAL_DESEJADO da tabela ALUNO. Dica: veja a página 54.
7. Remova os dados da pessoa cadastrada no exercício 4 e efetive sua transação.
IV – Criação e usa de tabelas
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)
73
- salário médio (SAL_MED)- salário Maximo (SAL_MAX)
dica: primeiro faça uma consulta que retorna os dados acima, para depois criar uma visão baseada nessa consulta
9. Verifique a estrutura da visão DEP_SAL com o comando DESCRIBE e depois consulte todos os seus dados.
10. Atualize o salário de SAMANTA para 300000 e consulte a visão DEP_SAL novamente.
11. Desfaça a última atualização realizada.
IV – Criação e usa de tabelas
74
1. Formatação de colunas
2. Formatação de títulos
3. BREAK e COMPUTE
4. Parâmetros de controle
5. Utilização de variáveis
6. Relatórios avançados
V – Geração de Relatórios
V.1 – Formatação de colunas
Os comandos de formatação de colunas (formatação em geral) do SQL*Plus são acumulativos
Sintaxe do comando COLUMN:
76
COLUMN colunaALIAS sinônimo CLEARDEFAULTFOLD_A[FTER]FOLD_B[EFORE]FORMAT formatoHEADING textoJUSTIFY
LEFTCENTERRIGHT
LIKE colunaNEWLINENEW_VALUE varOLD_VALUE varNULL nuloNOPRINTPRINTONOFFWRAPPEDWORD_WRAPPERDTRUNCATED
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
77
»texto texto a ser apresentado como cabeçalho de uma coluna
»nulo texto a ser exibido quando o conteúdo de uma coluna for nulo
»var nome de uma variável (será explicado adiante)
V – Geração de Relatórios
Exemplos de formatos disponíveis para o comando COLUMN:
78
Formato Valor Resultado ObservaçãoA20 Empregado EmpregadoA5 Empregado Empre corta o resto999.99 56.478 56.48 arredonda999V99 56.478 5648 alinha pelo “V”9,999 8410 8,41099999 607 60709999 607 00607999 -5609 -56099999MI -5609 5609-9999PR -5609 <5609>B999 564B999 0 brancos imprime brancos quando zero99.99 124.98 # #.# # estouroDATE 2441453 12/23/80 valor = data JulianaEDATE 2441453 23/12/80
O comando COLUMN, seguido de um nome de coluna (ou sozinho), exibe as definições daquela coluna (ou de todas as coluna)
O comando CLEAR COLUMN elimina todas as definições de uma coluna
V – Geração de Relatórios
Exemplos
79
SQL > column 12*sal format 999999999.99SQL > column nome_emp format a20 heading `Empreg.`word_wrapSQL > column nome_dep like nome_emp heading `Departamento`SQL > column com heading `comissão | adicional`format 9999-99SQL > column 12*sal g~heading `salario| anual`SQl > column 12*salcolumn 12*sal ONheading `salario | anual`headsep `|`format 999999999.99SQL > select nome_dep, nome_emp, 12*sal,com
2 from emp, dep3 where emp.n_dep = dep.n_dep
salário comissãoDepartamento Empreg. anual adicionalADMINISTRAÇÃO PAULO 6000000.00ADMINISTRAÇÃO ANA 1440000.00PESQUISA SAMANTA 1800000.00PESQUISA UBIRATAN 3600000.00PESQUISA RENATO 1200000.00VENDAS RITA 3960000.00 5000.00VENDAS SILVIO 1800000.00 9000.00VENDAS EVERALDO 2400000.00 3000.00
definições acumulativas
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”
80
Pula uma linha
exibe as definições associadasà coluna “12*sal”
o define o texto como cabeçalho (rodapé), podendo conter “|” para pular linhas
o este formato acrescenta data e numeração de página automaticamente
o só existe para manter compatibilidade com versões antigas
- TTITLE (BTITLE)
o mostra a definições corrente
- TTITLE (BTITLE) OFF
o desabilita a exibição do cabeçalho (rodapé)
- TTIBLE (BTITLE) ON
o habilita a exibição do cabeçalho (rodapé)
V – Geração de Relatórios
- TTITLE (BTITLE) param1 param2 ...
o paramN :
81
» “texto” texto livre que aparecerá no cabeçalho»&variável imprime o valor de uma variável no cabeçalho»COLn faz o próximo caracter na coluna n»SKIPn pula n linhas»LEFT alinha o texto seguinte à esquerda»CENTER centraliza o texto seguinte»RIGHT alinha à direita o texto seguinte»SQL.PNO imprime o número da página corrente»SQL.LNO imprime o número da linha corrente
V – Geração de Relatórios
Exemplo:
82
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 emp3 where n_dep = 30;
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:
83
25 de dezembro de 1990Relatório de Empregados – Departamento de Pessoal
N_EMP NOME_EMP SAL
189 RITA 330000201 EVERALDO 200000208 SILVIO 150000
SQL > ttitleTtitle on and is the follwing 95 characters:Center `25 de dezembro de 1990` skip col 6 –`Relatório de Empregados – Departamento de Pessoal`
BREAK ON controle1 ON controle2 ... ON controleN
»controleN grupo ação repetição»grupo nome de uma coluna, expressão, ROW ou
REPORT
»ação SKIP n, onde n é um número de linhas a serem puladas, SKIP PAGE ou PAGE; este parâmetro pode ser omitido
»repetição NODUPLICATES (padrão) ou DUPLICATES: controla se os valores de grupo duplicados são exibidos ou não
V – Geração de Relatórios
Exemplo:
84
SQL > break on nome_dep page on cargo skip 1SQL > select nome_dep, cargo, nome_emp
2 from dep, emp3 where dep.n_dep = emp.n_dep4 order by nome_dep, cargo;
é importante ordenar o resultado deacordo com os grupos formados!
NOME_DEP CARGO NOME_EMP
ADMINISTRAÇÃO PRESIDENTE PAULO
SECRETARIA ANA
NOME_DEP CARGO NOME_EMP
PESQUISA ANALISTA SAMANTAREANATO
DIRETOR UBIRATAN
NOME_DEP CARGO NOME_EMP
VENDAS DIRETOR RITA
VENDEDOR SILVIOEVERALDO
mudançade página
V – Geração de Relatórios
Para mostrar as definições correntes:
85
SQL > brekbreak on nome_dep page 1 nodup on cargo skip 1 nodup
Para eliminar as definições de grupo:
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:
86
SQL > clear break
SQL > break on n_dep on nome_dep skip 1SQL > compute sum of sal on nome_depSQL > select dep.n_dep, nome_dep, nome_emp, sal
2 from dep, emp3 where dep.n_dep = emp.n_dep4 oeder by dep.n_dep;
V – Geração de Relatórios
Sintaxe do comando:
87
N_DEP NOME_DEP NOME_EP SAL10 ADMINISTRAÇÃO PAULO 500000.00
ANA 120000.00****************
sum 620000.00
20 PESQUISA SAMANTA 150000.00RENATO 100000.00UBIRATAN 300000.00
***************sum 550000.00
30 VENDAS RITA 330000.00EVERALDO 200000.00SILVIO 150000.00
***************sum 680000.00
COMPUTE operação1 ... OF operando1 ... ON evento_break
»opearaçãoN uma das seguintes operações: COUNT, SUM, AVG, MIN, MAX,STD, NUM, VAR
»operaçãoN coluna, expressão entre aspas ou sinônimo, sobre o qual as operações serão efetuadas. Devem ser especificados no comando SELECT
»evento_break especifica o evento que o SQL*Plus irá utilizar como “quebra” . Pode ser o nome de uma coluna, expressão entre aspas, sinônimo, ROW ou REPORT
V – Geração de Relatórios
V.4 – Parâmetros de controle
O SQL*Plus possui uma série de parâmetros para controle de formatação.
88
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.
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
89
SQL > set pagesize 25SQL > show pagesizepagesize 25
AUTOCOMMIT ON | OFF faz com que cada alteração feita na base de dados seja efetivada imediatamente
BUFFER buffer | SQL torna buffer o buffer de edição corrente
CMDSEP c | `;` | ON | OFF caractere de separação entre vários comandos SQL digitados em uma mesma linha
COMPATIBILITY V5 | V6 força compatibilidade com o RDMS ORACLE V5 ou V6
CONCAT c | `.` | ON | OFF caractere de concatenação para utilização de variáveis
COPYCOMMIT n | 0 tamanho do lote de registros que deve ser processado pelo comando COPY antes da execução de um COMMIT
CRT crt define o crt padrão para o comando RUNFORM
DCLSEP c | `! ` caractere de separação de comandos do sistema operacional
DEFINE c | `&` | ON | OFF caractere que precede a utilização de variáveis
DOCUMENT ON | OFF interpreta ou não o texto dentro do comando DOCUMENT
ECHO ON | OFF exibe ou não os comandos SQL*Plus quando são executados de um arquivo de comandos
EMBEDDED ON | OFF força ou não que todo relatório comece em uma nova página
ESCAPE c | ON | OFF caractere de “escape” para permitir a inserção de caracteres especiais
V – Geração de RelatóriosFEEDBACK 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
90
HEADSEP c | `I`| ON | OFF caractere para pular linha em cabeçalhos (formato antigo)
LINESIZE n | 80 número de caractere por linha
LONG n | 80 número máximo de caracteres visualizados para valores do tipo LONG
MAXDATE n tamanho máximo de uma linha que o SQL*Plus pode processar
NEWPGE n | 1 número de linhas brancas a serem impressas a cada página nova (0 indica a impressão de um “pulo de página”)
NULL texto texto a ser exibido quando um valor é nulo
NUMFORMAT formato formato padrão para exibição de número (formato numérico do comando COLUMN)
NUMWIDTH n | 10 largura padrão para exibição de números
PAGESIZE n | 14 número de linhas por página
PAUSE texto | ON | OFF antes de começar cada página, exibe o texto e espera (ou não) que o usuário tecle ENTER
SCAN ON | OFF liga ou desliga p procedimento de substituição de variáveis
SHOWMODE ON | OFF exibe ou não os valores antigo e atual de parâmetros modificados com o comando SET
SPACE n | 1 número de espaço entre colunas
SQLCONTINUE c | “>” caractere exibido quando da continuação de um comando SQL*Plus
V – Geração de RelatóriosSQLNUMBER ON | OFF liga ou desliga a numeração de linhas
quando da continuação de comandos SQL
91
SQLPREFIX c | `#` caractere de prefixo para a execução de comandos SQL durante a edição de um outro comando
SQLPROMPT texto | “SQL>” texto exibido no início de cada linha de edição
SQLTERMINATOR c |`;`| ON | OFF caractere que indica o término de um comando SQL
SUFFIX texto | “SQL” texto que será usado como sufixo para execução e edição de arquivos
TAB ON | OFF permite ou não a utilização de caracteres TAB na impressão de brancos
TERMOUT ON | OFF permite ou não a exibição de comando sendo executados
TIME ON | OFF exibe ou não a hora antes de cada linha de edição
TIMING ON | OFF exibe ou não estatísticas de tempo para cada comando executado
TRIMOUT ON | OFF inibe ou não impressão de brancos no final de cada linha
TRUNCATE ON | OFF permite ou não o “corte” de uma linha se ela for muito grande
UNDERLINE c|`-`| ON | OFF caractere que será utilizado para sublinhas o cabeçalho de colunas
VERIFY ON | OFF exibe ou não comandos SQL antes e depois da substituição de variáveis
WRAP ON | OFF é o inverso do comando TRUNCATE
O comando SHOW ALL mostra o valor de todos ps parâmetros
V – Geração de Relatórios
V.5 – Utilização de variáveis
92
O SQL*Plus permite a definição e uso de variáveis genéricas:
Para recuperar o valor de uma variável em uma comando SQL, deve-se escrever o nome da variável precedido de `&`:
V – Geração de Relatórios
O SQL*Plus requisita o valor de uma variável se esta não tiver sido previamente definida:
93
SQL > define v_dep = 20SQL > define v_nomerel = “relatorio de utilidades”
SQL > define v_dep = 20SQL > select * from dep 2 where n_dep = &v_dep
após a utilização de uma variável não previamente definida, seu valor (fornecido pelo usuário) é descartado
V – Geração de Relatórios
Para manter o valor fornecido pelo usuário para futuras utilizações, deve-se substituir o `&`por `&&`:
94
SQL > select * from emp2 where sal > &limite;
Enter value for limite: 200000old 2: where sal > &limitenew 2: where sal > 200000
N_EMP NOME_EMP
110 UBIRATAN175 PAULO189 RITA
V – Geração de Relatórios
O comando ACCEPT possibilita iniciar variáveis valores fornecidos pelo usuário:
95
SQL > select nome_emp, sal2 from emp3 where n_dep = &&v_dep
Enter value for v_dep: 30old 3: where n_dep = &&v_depnew 3: where n_dep = 30
NOME_EMP SAL
RITA 330000EVERALDO 200000SILVIO 150000
SQL > run1 select nome_emp, sal2 from emp3 where n_dep = &&v_dep
old 3: where n_dep = &&v_depnew 3: where n_dep = 30
NOME_EMP SAL
RITA 330000EVERALDO 200000SILVIO 150000
interação para ler ovalor da variável
Não há interação: a variávelEstá permanentemente
definida
O comando PROMPT permite exibir informações na tela:
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:
96
SQL > accept v_dep NUMBER PROMPT `Departamento: `Departamento: 30SQL > select nome_emp, sal
2 from emp3 where n_dep = &v_dep;
oldo 3: where n_emp = &v_depnew 3: where n_emp = 30
NOME_EMP SAL
RITA 330000EVERALDO 200000SILVIO 150000
especifica o tipo da variável; podendoser NUMBER ou CHAR
SQL > prompt Relatorio de EmpregadosRelatórios de EmpregadosSQL >
Onde o arquivo LISTAEMP.SQL contém os seguintes comandos:
V – Geração de Relatórios
V.6 – Relatórios avançados
97
SQL > start listaemp 10 100000
nome do arquivode comandos Parâmetros posicionais
rem O primeiro parametro determina o departamento onde osrem empregados selecionados trabalhamrem O segundo parametro determina o menor salário que os rem empregados selecionados recebem. select n_emp, nome_empfrom empwhere n_emp = & 1 andsal > = &2;
linhas de comando
primeiro e segundoparâmetro
Os relatórios produzidos até aqui foram sempre apresentados na tela; é possível imprimi-los e armazena-los em arquivo do sistema operacional:
V – Geração de Relatórios
98
SQL > apool relat1SQL > start listaemp 10 100000SQL > rem O primeiro parametro determina o departamento onde osSQL > rem empregados selecionados trabalhamSQL > rem O segundo parâmetro determina o salário minino que osSQL > rem empregados selecionados recebem.SQL > select n_emp, nome_emp
2 from emp3 where n_dep = &1 and4 sal > = &2;
old 3: where n_dep = &1 andnew 3: where n_deo = 10 andold 4: sal > = &2;new 4: sal > = 100000;
N_EMP NOME_EMP175 PAULO230 ANA
2 records selected.
SQL > spool out
termina o armazenamento eimprime o resultado
inicia armazenamento do resultadono arquivo “relat1.lst”
Se o comando SPOOL OUT for substituído por SPOOL OFF, o arquivo de saída não será impresso.
Para evitar que os próprios comandos e mensagens do SQL*Plus sejam enviadas para o arquivo juntamente com o relatório.
V – Geração de Relatórios
99
SQL > set echo offSQL > set verify offSQL > set feedback offSQL > spool relat1SQL > start listaemp 10 10000
N_EMP NOME_EMP
175 PAULO230 ANA
SQL > spool out
No caso do comando COMPUTE, para eliminar os textos “sum” e “******” que aparecem como indicadores do cálculo executado:
V – Geração de Relatórios
100
SQL > collumn aux_dep noprintSQL > column sal format $999,999,999.99SQL > break on n_dep on nome_dep on aux_dep skip1SQL > compute sum of sal on aux_depSQL > select dep.n_dep aux_dep, dep.n_dep, nome_dep,
2 nome_emp, sal3 from dep, emp
4 where dep.n_dep = emp.n_dep 5 order by dep.n_dep;
N_EMP NOME_DEP NOME_EMP SAL
10 ADMINISTRAÇÃP PAULO $500,000.00ANA $120,000.00
$620,000.00
20 PESQUISA SAMANTA $150,000.00RENATO $100,000.00UBIRATAN $300,000.00
$550,000.00
30 VENDAS RITA $330,000.00EVERALDO $200,000.00SILVIO $150,000.00
$680,000.00
As opções NEW_VALUE E OLD_VALUE do comando COLUMN podem ser utilizadas para recuperar dados em uma consulta e usá-los em uma outra consulta:
V – Geração de Relatórios
101
SQL > set echo offSQL > set verify offSQL > set feedback offSQL > column PROCENT format 999.99SQL > column sum(sal) new_value somaSQL > rem calcula o valor de “soma”SQL > select sum(sal) from emp;SQL > rem calcula porcentagens dos salarios utilizando “soma”SQL > select nome_emp, sal, 100 * sal / &soma “PORCENT”
2 from emp3 order by 3 desc;
Indica a terceira expressão doSELECT
SUM1850000
NOME_EMP SAL PORCENT
PAULO 500000 27.03RITA 330000 17.84UBIRATAN 300000 16.22EVERALDO 200000 10.81SAMANTA 150000 8.11SILVIO 150000 8.11ANA 120000 6.49RENATO 100000 5.41
vamos agora considerar o seguinte relatório:
V – Geração de Relatórios
102
23/11/90 Relatorio de Empregados Pág. 3Departamento: VENDAS
Num Nome Empregado Salário Comissão Porc.
208 SILVIO $150,000.00 $9,000.00 5.66 189 RITA $330,000.00 $5,000.00 1.49 201 EVERALDO $200,000.00 $5,000.00 1.48
Departamento: VENDAS
data de hojenúmero da página
departamento dos empregadosapresentados nesta página
Para produzir o relatório da página anterior, deve-se acompanhar os seguintes passos:
1. Definir a consulta a ser realizada:
2. Definir os formatos das colunas
3. Definir o agrupamento por departamento:
4. Definir duas variáveis que armazenarão o valor novo e o antigo da coluna NOME_DEP durante a quebra do grupo:
V – Geração de Relatórios
103
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` ) datafrom dep, empwhere dep.n_dep = emp.n_deporder bu nome_dep, 6 desc;
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
break on nome_dep skip page
column nome_dep old_value vardep_ant new_value vardep_novo
5. Definir uma variáve para armazenar a data sendo recuperado pela consulta:
6. Esconde as colunas NOME_DEP e DATA:
7. Definir os títulos:
8. Definir o tamanho da página:
9. Em caso de erro, interromper o processamento do SQL*Plus retornando o código do erro:
V – Geração de Relatórios
104
column data new_value varhoje
column nome_dep noprintcolumn data noprint
ttitle left varhoje center `Relatorio de Empregados` -right `Pag. `sql.pno skip 1 –left `Departamento: `vardep_novo skip 2btitle left `Departamento: `vardep_ant
set pagasize 20set linesize 75set newpage 0
Wherenever sqlerror exit SQL.SQLCODE;
Os comandos necessários à geração do relatório sendo especificado poderiam (ou deveriam) estar armazenadas em um arquivo do sistema operacional, RELATORIO.SQL:
V – Geração de Relatórios
105
set echo offset pagasize 20set linesize 75set newpage 0whenever sqlerror exit sql.sqlcode;column n_emp format A 15 heading `Nome empregado`column sal format $999,999,999.99 heading `Salario`column comissao format $999,999,999.99 heading `Comissao`column porcent_com format 9.99 heading `Porc.`column data format A8break on nome_dep skip pagecolumn nome_dep old_value vardep_ant new_value vardep_novocolumn data new_value varhoje noprintcolumn nome_dep noprintttitle left varhoje center `Relatorio de Empregados` -righe `Pag.`sql.pno skip 1 left `Departamento: `vardep_novo skip 2 btitle left `Departamento: `vardep_antspool relatorioselect 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` ) datafrom dep, emp where dep.n_dep = emp.n_deporder by nome_dep, 6 desc;spool out
Dessa forma, o comando:
- teria como efeito gerar o relatório na impressora do sistema
V – Geração de Relatórios
106
$ sqlplus –s ora 1/senha1 @relatorio
V - Exercícios
1. Recupere o comando contido no arquivo “ex31.sql” e formate seu resultado da seguinte forma:
a) mude o cabeçalho da coluna que indica o salário por hora para “Sal/hora”
b) coloque um titulo centralizado indicando “Salário por hora dos Empregados”
c) mude o formato da coluna “Sal/hora” para um número com quatro casas inteiras e duas decimais.
d) Alinhe o cabeçalho da coluna CARGO pela direita
e) Verifique as definições de coluna existentes
V – Geração de Relatórios
107
2. Faça um arquivo de comando SQL*Plus chamado “ex52.sql” de forma que sua execução exiba o seguinte resultado:
Dica: comece fazendo a consulta; depois, acrescenta as definições da coluna, comandos BREAK e COMPUTE; finalmente, ajuste o tamanho da página e o tamanho da linha com o co,mando SET.
V – Geração de Relatórios
108
Relatorio de Empregados
Departamento Nome Cargo SalárioADMINISTRAÇÃO PAULO PRESIDENTE 500000
ANA SECRETARIA 120000***************
avg 310000sum 620000
PESQUISA SAMANTA ANALISTA 150000UBIRATAN DIRETOR 300000RENATO ANALISTA 100000
**************
avg 183333.333sum 550000
VENDAS RITA DIRETOR 330000SILVIO VENDEDOR 150000EVERALDO VENDEDOR 200000
**************
avg 226666.667sum 680000
3. Altere o arquivo “ex52.sql” de forma que:
a) O menor salário a ser considerado na consulta seja passado como parâmetro (veja página 99)
b) O maior salário a ser considerado na consulta seja entrado pelo usuário através de um comando ACCEPT
c) Somente o resultado da consulta seja armazenado no arquivo “ex.53.lst”
d) Desapareçam os textos “sum”, “avg” e *********” exibidos pelo SQL`Plus (veja página 102)
V – Geração de Relatórios
109
VI - Conteúdo
1. Operadores
2. Funções numéricas
3. Funções de caracteres
4. Funções de grupo
5. Conversão entre tipos
6. Funções de datas
7. Outras funções
VI – Expressões e funções
111
VI.1 - Operadores
Operadores de valor:
+ , - indicador de sinal WHERE X = -1
* , / multiplicação e divisão SELECT 2 * X...
+ , - soma e subtração SELECT X + Y...
| | concatena “strings” SELECT `EMPREGADO`| | NOME_EMP
Operadores lógicos
= teste igualdade WHERE SAL = 100000
! =, < >, ^ = testa desigualdade WHERE SAL ! = 100000
>, > = testa maior (ou igual) WHERE SAL > 100000
<, < = testa menor (ou igual) WHERE SAL < = 100000
VI – Expressões e funções
112
[NOT] IN teste de inclusão ou CARGO IN (`ANALISTA`, VENDEDOR`)exclusão um conjunto
[NOT] teste de intervalo SAL BETWEEN 10000 AND 200000
BETWEEN …AND
[ NOT ] LIKE testa casamento de WHERE NOME_EMP LIKE `_X%`padrão
IS [ NOT ] testa valor nulo WHERE COM IS NULL
NULL
NOT inverte resusltado WHERE NOR ( SAL = 100000 )lógico de expressões
AND operação lógica e WHERE SAL < 100000 AND CARGO =`ANALISTA`
OR operação lógica ou WHERE COM IS NULL OR SAL > 100000
ANY deve casar com WHERE SAL = ANY (SELECT SALqualquer dos valores FROM EMP WHERE N_DEP = 30)retornados por umalista ou consulta
ALL deve casar com todos WHERE (SAL,COM) > = ALL (os valores retornados (150000. 30000), (2000000, 0) )por uma lista ouconsulta
VI – Expressões e funções
113
VI.2 – Funções numéricas
Em geral, funções podem ser usadas em qualquer lugar onde variáveis ou expressões do mesmo tipo são usadas.
Legenda para as próximas tabelas:
- T : tipo retornado pela função:
o `C`indica caractere
o `D`indica data
o `N`indica número
o `R`indica Rowld
o `W`indica “raw”
- Argumentos para funções:
o `*` : tipo depende do contexto da função
o m, n : expressões numéricas
o c, c1, c2, conj_c, de_c, para_c: expressões que retornam cadeias de caracteres
o d, d1: expressões que retorna datas
o expr, caso, ret, ret_outro: expressões de qualquer tipo
VI – Expressões e funções
114
Funções numéricas:
T função Descrição/Exemplo
N ABS(n) valor absoluto de nABS(-5) = 5
N CEIL(n) arredonda para cimaCEIL(5.1) = 6CEIL(5) = 5
N FOOR(n) arredonda para baixoCEIL(5.1) = 5CEIL(5) = 5
N MOD(m, n) resto da divisão de m por nMOD(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 decimaisROUND(2.3456) = 2.35ROUND(1989, -3) = 2000
N SIGN(n) sinal de nSIGN(-2) = -1SIGN(0) = 0SIGN(2) = 1
N SQRT(n) raiz quadrada de nSQRT(4) = 2SQRT(-4) = NULL
N TRUNC(n,[m]) trunca n para m casas decimaisTRUNC(2.3456,2) = 2.34TRUNC(1989, -3) = 1000
VI – Expressões e funções
115
VI.3 – Funções de caracteres
T NOME Descrição/ExemploN ASCII(c) código ASCII do primeiro caractere de
cASCII( `Água`) = 65
C CHR(n) caractere de código ASCII igual a nCHR(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 c2em 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 cLENGTH( `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 suficientepara que c1 atinja o tamanho n.O caractere ``é assumido caso c2 sejaomitidoLPAD( `SP`, 5, `-`) = `-SP`
VI – Expressões e funções
116
C LTRIM(c, conj_c) remove todos os caracteres de c até o primeiro caractere que não estiver presente em conj_cLTRIM(`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 cpara_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 suficientepara 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_cRTRIM(`AGUA`, `UA`) = `AG`
C SOUNDEX(c) uma cadeia de caracteres que representa o som das palavras em cSOUNDEX( `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 fimSUBSTR(`São Paulo`, 5 ) = `Paulo`
VI – Expressões e funções
117
C TRANSLATE(c, traduz c e substitui todos caracteres de c de_c, para_c) existentes em de_c para o correspondente
em para_cTRANSLATE( `AGUA`, `AEIO`, `12345`) = `1G51`
C UPPER(c) converte todos os caracteres de c_para maiúsculasUPPER( `Sao Paulo`) = `SAO PAULO`
C USERENV(c) c pode assumir os seguintes valores:`ENTRYID` = novo identificador para o propósito de auditoria`SESSIONID`= identificador da sessão de auditoria`TERMINAL` = identificador do terminal`LANGUAGE`= língua em uso
VI – Expressões e funções
118
VI.4 – Funções de grupo
T Nome Descrição
N AVG([distinct | all] n) media de n; ignora valores nulos
N COUNT([distinct | all] número de linhas para as quais expr | *) expr não é nulo. * faz contar todas as
linhas selecionadas
N MAX([distinct | all] expr) maior valor de expr
N MIN([distinct | all] expr) menor valor de expr
N STDDEV([distinct | all] n) desvio padrão de n; ignora valores nulos
N SUM([distinct | all] n) soma dos valores de n
N VARIANCE([distinct|all] n) variância de n; ignora valores nulos
VI – Expressões e funções
119
VI.5 – Conversão entre tipos
T Nome Descrição
C CHARTOROWID(char) converte char para um “rowid”
W HEXTORAW(char) converte char contendo dígitos hexadecimais para um valor binário, conveniente para ser inserido em uma coluna do tipo RAW
C RAWTOHEX(raw) converte raw para a cadeia e caracteres contendo números hexadecimais
C ROWIDTOCHAR(rowid) converte um rowid para uma cadeia de 18 caracteres
C TO_CHAR(n[,fmt]) ou converte o número n ou a data d para TO_CHAR(d[,fmt]) uma cadeia de caracteres, de acordo
com o formato fmt
D TO_DATE(char[,fmt]) converte char para uma data, de acordo com o formato fmt
N TO_DATE(n[,fmt]) converte char para uma data, de acordo com o formato fmt; este formato deve corresponder a um número (J, MM etc.)
N TO_NUMBER(char) converte char para um número; char deve conter um número válido
VI – Expressões e funções
120
Conversão automática de tipos:
- 123 > `39` = 132 > to_number(`39`)
- `39` > 123 = `39` < to_char(123)
- `39` + 123 = to_number(`39`) + 123
- 123 | | `39` = to_char(123) | | `39`
Se uma operação pode ser usada com vários tipos de dados, o tipo do primeiro operando determina o tipo dominante:
- 123 > `39`
Se uma operação só pode ser usada com um tipo de dados, esse fica sendo o tipo dominante:
- `39` + 123
VI – Expressões e funções
121
a tabela a seguir mostra os principais formatos de datas existentes (parâmetro fmt utilizado nas funções de conversão) aplicados à data 13:07:10 de 16/01/91
- OBS: qualquer combinação dos formatos acima pode ser feita para formar o parâmetro fmt (EX: `HH24:MI:SS-DD/MON/YYYY`)
VI – Expressões e funções
122
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”)
VI.6 – Funções de datas
T Nome Descrição
D ADD_MONTHS(d,n) adiciona n meses à data dADD_MONTHS( `13-AUG-91`8) =13-APR-92
D LAST_DAY(d) data do último dia do mês da data dLAST_DAY( `13-FEB-92`) = 29-FEB-92
N MONTHS_BEETWEEN(d,e) o número de meses existentes antes as datas d e eMONTHS_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 dNEXT_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 horasTRUNC( 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 fmtROUBD( to_date(`13-jan-91`), `YEAR`)= 01-JAN-91
VI – Expressões e funções
123
VI.7 – Outras funções
T Nome Descrição
* DECODE(expr, s1, r1, se expr for igual a algum s, então ...[padrão]) devolve o r seguinte; caso contrário
devolve padrão. Caso padrão seja omitido e não haja “casamento” o valor NULL é retornado
* DUMP(expr[, tipo[, mostra o valor de uma expressão no posinic[, bytes]]]) formato interno do Oracle
* GREATEST(expr1, expr2,...) devolve o maior valor da lista expr1, expr2, ...
* LEAST(expr1, expr2,...) devolve o menor valor da lista expr1, expr2, ...
* NVL(x, expr) caso x seja nulo, devolva expr; caso contrário devolve x.
N VSIZE(expr) devolve o número de bytes de expr na representação interne do Oracle
Para reduzir as faixas salariais a apenas 3 patamares, 1 para as atuais A e B, 2 para C e D, e 3 para a faixa E
VI – Expressões e funções
124
SQL > select nome_emp, cargo, sal,2 decode( faixa, `A`, 1, `B`, 1, `C`, 2, `D`, 2, 3 ) NOVA FAIXA3 from emp, faixa_sal4 where emp.sal between salmin and salmax5 order by 5;
VI - Exercícios
1. Consulte o nome e o cargo dos empregados da tabela EMP que foram contratados entre 01/02/85 e 27/12/85 e que são comissionados.
2. Descubra os seus identificadores de sessão e terminal.
3. Calcule o desvio padrão (DesvPadr) e a média (Media) dos salários do presidente e diretores presentes na tabela EMP.
4. Faça uma consulta na tabela ALUNO que retorna o nome e a
data de aniversário dos alunos cadastrados nos formatos DD/MM (data1) e DD-MON (data2).
5. Faça uma consulta que devolva o número de meses completos existentes entre as datas de admissão do empregado mais novo e dos mais antigo constantes na tabela EMP.
6. Consulte o número, nome, cargo e total de recebimentos (Totreceb), ou seja, salário mais comissão, dos empregados da tabela EMP.
7. Faça uma consulta na tabela EMP que retorne o nome e a categoria do empregado. A categoria do empregado tem valor 1 para secretárias, 2 para vendedores, 3 para analistas e 4 para outros cargos.
8. Faça uma consulta na tabela EMP que devolva o nome e o salário ideal (Salideal). O salário ideal é o maior valor entre o salário atual e a média dos salários do departamento onde o empregado trabalho (Dica: use a visão DEP_SAL criada no exercício IV.8).
9. Faça um consulta que retorne somente a primeira letra dos nomes de todos os empregados, ordenados por data de admissão.
VI – Expressões e funções
125
VII - Conteúdo
1. Pseudo-colunas
2. Junção externa
3. Auto-Junção
4. Consultas encaixadas
5. Consultas hierárquicas
VII – Consultas avançadas
127
VII.1 – Pseudo-colunas
Pseudo-colunas são colunas que podem ser consultadas em qualquer tabela, como uma coluna normal, mas não podem ser alteradas:
T Nome Descrição
N nome_seq.CURVAL valor corrente da seqüência nome_seq
N nome_seq.NEXTVAL próximo valor da seqüência nome_seq
N LEVEL usada na comando SELECT ... CONNECT BY (explicado na seção VII.5); é igual a 1 para o nó raiz de uma árvore, 2 para seus filhos e assim por diante
_ NULL valor nulo
R ROWID identificação interna de uma linha
N ROWNUM número que indica a ordem de seqüência da linha selecionada em uma consulta
D SYSDATE data e hora correntes
N UID número que identifica unicamente o usuário corrente
C USER nome do usuário corrente
VII – Consultas avançadas
128
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
VII.2 – Junção externa
Para listar o nome de todos departamentos e seus respectivos empregados:
VII – Consultas avançadas
129
SQL > select dep.n_dep, nome_dep, n_emp, nome_emp2 from dep, emp3 where dep.n_dep = emp.n_dep;
N_DEP NOME_DEP N_EMP NOME_EMP
10 ADMINISTRAÇÃO 175 PAULO 10 ADMINISTRAÇÃO 230 ANA 20 PESQUISA 103 SAMANTA 20 PESQUISA 110 UBIRATAN 20 PESQUISA 276 RENATO 30 VENDAS 189 RITA 30 VENDAS 208 SILVIO 30 VENDAS 201 EVERALDO
PROBLEMA: Departamento 40 não aparece,Pois não tem empregados
VII – Consultas avançadas
130
NOME_EMP NOME_DEP EMP.N_DEP DEP.N_DEP
SAMANTA ADMINISTRAÇÃO 20 10UBIRATAN 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 departamento40
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):
Para saber os departamentos sem empregados:
VII – Consultas avançadas
131
SQL > select dep.n_dep, nome_dep, n_emp, nome_emp 2 from dep, emp3 where dep.n_dep = emp.n_dep ( + );
operador especial 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
SQL > selct distinct dep.n_dep, nome_dep, local_dep2 from dpe, emp3 where dep.n_dep = emp.n_dep ( + ) and n_emp is null;
N_DEP NOME_DEP LOCAL_DEP 40 PRODUÇÃO SÃO BERNARDO
VII.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:
VII – Consultas avançadas
132
SQL > select ger.nome_emp gerente, ger.sal, max(2*trab.sal )2 from emp trab, emp ger3 where trab.chefe = ger.n_emp4 group by ger.nome_emp, ger.sal5 having max(2*trab.sal) > ger.sal;
GERENTE SAL MAX(2*TRAB.SAL)RITA 330000 400000PAULA 500000 660000
pseudônimos para as tabelas
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:
Para saber os departamentos que não tem empregados:
VII – Consultas avançadas
133
SQL > select n_emp, nome_emp, sal2 from emp3 where sal > (select avg(sal) from emp);
parênteses delimitam asub-consulta
o resultado dessa sub-consulta éum único valor
SQL > select n_dep, nome_dep2 from dep3 where n_dep not in (select distinct n_dep from emp);
elimina os valores duplicados
operador de exclusãode conjunto
esta sub-consulta retorna um conjunto de valores
N_DEP NOME_DEP 40 PRODUÇAO
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:
VII – Consultas avançadas
134
SQL > select n_dep, nome_emp, sal2 from emp x3 where sal > ( select avg(sal) from emp y4 where x.n_dep = y.n_dep5 order by n_dep;
N_DEP NOME_DEP SAL 10 PAULO 500000 20 UBIRATAN 300000 30 RITA 330000
nesse caso é necessário o pseudônimo para a tabela
Os operadores IN, NOT IN, ANY e ALL também podem ser usados para sub-consultas:
Para saber se o resultado de uma sub-consulta é vazio ou não (equivalente ao IS NOT NULL para colunas):
VII – Consultas avançadas
135
SQL > select nome_emp, sal, cargo, n_dep2 from emp3 where sal < all ( select sal from emp4 where n_dep = 20);
SQL > select nome_emp, cargo, n_dep2 from emp x3 where exists ( select `x` from emp y4 where x.n_emp = y.chefe )
só importa se uma linhaexiste ou não!
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:
VII – Consultas avançadas
136
SQL > select nome_emp, sal2 from emp e13 where sal > (select sal from emp e24 where e2.n_dep = e1.n_dep and5 data_adm = (6 select min(data_adm)7 from emp8 where n_dep = e2.n_dep))9 and exists (select `x` from emp10 where n_dep = e1.n_dep11 having count(*) > = 3);
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:
Para que todos empregados mais novos de cada cargo ganhem o melhor salário e a media das comissões de seu cargo:
VII – Consultas avançadas
137
SQL > delete from emp e2 where data_adm = (select max(data_adm) from emp3 where n_dep = e.n_dep);
SQL > update emp e2 set (sal,com) = (select Max(sal), avg(com) from emp3 where cargo = e.cargo)4 where date_adm = (select max(data_adm) from emp5 where cargo = e.cargo);
VII.5 – Consultas hierárquicas
O Oracle permite recuperar informações estruturas de forma hierárquica (“em arvore”):
VII – Consultas avançadas
138
175 / PRESIDENTE
230 / SECRETARIA 189 / DIRETOR110 / DIRETOR
103 / ANALISTA 208 / VENDEDOR201 / VENDEDOR276 / ANALISTA
N_EMP NOME_EMP CARGO CHEFE103 SAMANTA ANALISTA 110110 UBIRATAN DIRETOR 175175 PAULO PRESIDENTE189 RITA DIRETOR 175201 EVERALDO VENDEDOR 189208 SILVIO VENDEDOR 189230 ANA SECRETARIA 175276 RENATO ANALISTA 110
Para saber todos os superiores de Everaldo:
Para saber o nome do Presidente e de seus subordinados, exceto aqueles que também subordinados de UBIRATAN:
VII – Consultas avançadas
139
SQL > select n_emp, nome_emp, cargo2 from emp3 where nome_emp < > `EVERALDO`4 connect by n_emp = prior cheve5 start with nome_emp = `EVERALDO`
indica o sentido da consulta:do empregado para o chefe
especifica a conexão da
indica o começo daconsulta
N_EMP NOME_EMP CARGO189 RITA DIRETOR175 PAULO PRESIDENTE
SQL > select n_emp, nome_emp, cargo2 from emp3 connect by prior n_emp = chefe and chefe < > 1104 start with cargo = `PRESIDENTE`;
N_EMP NOME_EMP CARGO175 PAULO PRESIDENTE110 UBIRATAN DIRETOR189 RITA DIRETOR201 EVERALDO VENDEDOR208 SILVIO VENDEDOR230 ANA SECRETARIA
elimina toda umasub-árvore
Podemos usar a pseudo-coluna LEVEL para saber o nível de cada registro na hierarquia:
VII – Consultas avançadas
140
SQL > select level, Ipad( ` `, 2*level ) | | nome_emp nome2 from emp3 connect by prior n_emp = chefe4 start with cargo = `PRESIDENTE`;
LEVEL NOME1 PAULO2 UBIRATAN3 SAMANTA3 RENATO2 RITA3 EVERALDO
3 SILVIO 2 ANA
VII - Exercícios
1. Consulte seu identificador e nome no sistema, bem como a data e hora correntes no formato que você achar mais usualmente utilizado (ex. 02:50-11/01/91).
2. Consulte o nome dos chefes (NOME_CHEFE) dos funcionários (NOME_FUNC) da tabela EMP, ordenados por NOME_CHEFE. Caso algum funcionário não possua chefe, mostre a cadeia de caracteres `________`em NOME_CHEFE.
3. Consulte os nomes, salários e cidades onde trabalham os empregados que estão na mesma faixa de salário que UBIRATAN. Dica: construa antes as seguintes consultas: nome, salário e cidade de todos empregados; nome, salário, cidade e faixa salarial de todos empregados; e faixa salarial de UBIRATAN.
4. Aumente o salário em 20% para os empregados que sejam os mais antigos de seus departamentos.
5. Remova os empregados que recebem mais que a média dos salários de seus cargos.
6. Desfaça as duas operações anteriores.
VII – Consultas avançadas
141
VIII - Conteúdo
1. Manutenção de usuários
2. Privilégios de acesso a tabelas
3. Acesso concorrentes a tabelas
4. Criação e uso de índices
5. Criação e uso de clusters
6. Dicionário de estruturas de dados
VIII – Tópicos avançados
143
VIII.1- Manutenção de usuários
Para criar um novo usuário Oracle:
»privilégio é uma das seguintes permissões:
>CONNECT permite conexão ao ORACLE
>RESOURCE permite criação de tabelas, visões, índices, etc.
>DBA permite executar operações privilegiadas, como criar novos usuários
»usuário nome (identificação) do usuário
»senha senha do usuário
- OBS : somente um usuário DBA pode criar ou alterar privilégios de outro usuário
VIII – Tópicos avançados
144
GRANT privilégio, ... TO usuário, ...IDENTIFIED BY senha, ...
Para alterar sua própria senha:
- OBS : qualquer usuário pode executar esta variação do comando GRANT
Para retirar privilégios de um usuário:
Para remover um usuário do banco de doados:
- remova todos os objetos do usuário
- remova todos seus privilégios
Remover os privilégios de um usuário não implica em remover seus objetos
VIII – Tópicos avançados
145
GRANT CONNECT TO seu_nome IDENTIFIED BY nova_senha
REVOKE privilegio, privilegio, … FROM usuario, …
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:
Um usuário pode definir quem pode usar suas tabela e que tipo de operação podem ser realizadas:
»privilégio uma das seguintes permissões:
>ALTER permite alterar a estrutura da tabela
>DELETE permite apagar linhas da tabela
>INSERT permite inserir linhas na tabela
>INDEX permite criar índices para a tabela
>REFERENCES permite fazer referencia a esta tabela em uma restrição de tabela ou coluna
>SELECT permite consultar tabela
>UPDATE (col1, permite atualizar as colunas col1, …, coIN ..., coIN Se nenhuma coluna for especificada, então
todas poderão ser alteradas
>ALL permite todas as operações acima »usuário nome do usuário. Se for especificado o pseudo-
usuário PUBLIC, então todos os usuários terão os privilégios em questão
VIII – Tópicos avançados
146
SQL > select * 2 from joão.aluno;
GRANT privilegio, ... ON tabela TO usuário [WITH GRANT OPTION]
»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:
Para permitir que todos usuários tenham todos privilégios sobre a tabela DEP:
Também é possível restringir o acesso a tabelas através do uso de visões:
VIII – Tópicos avançados
147
SQL > Grant select on emp to Rita:
SQL > Grant all on dep to public;
SQL > create view emp_dia2 as select * from emp3 where to_number( to_char( sysdate, `HH24`))4 between 8 and 17;
Para facilitar o acesso a tabelas de outros usuários pode-se criar sinônimos para os nomes das tabelas:
»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:
VIII – Tópicos avançados
148
CREATE [PUBLIC] SYNONYM sinônimo FOR tabela
creat synonym joão_aluno for joão.aluno;
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:
»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, mantidoUPDATE para compatibilidade com versões anteriores
do ORACLE.
>ROW permite outros usuários alterem outras linhasEXCLUSIVE individualmente, mas sem poder bloquear toda
a tabela de forma alguma (nem em modo SHARE)
>SHARE ROW possibilita que um usuário execute múltiplasEXCLUSIVE atualizações sobre a tabela, permitindo que
outros usuários façam consultas a ela mas proibindo a colocação de bloqueios do tipo SHARE ou atualizações de linhas.
VIII – Tópicos avançados
149
LOCK TABLE tabela, ... IN tipo MODE [NOWAIT]
>EXCLUSIVE permite que outros usuários façam consultas à tabela mas proíbe qualquer outra operação sobre ela
»NOWAIT especifica se o comando de bloqueios deve esperar até obter sucesso ou não
Um usuário sempre pode consultar informações do banco de dados, independente de qualquer bloqueio.
Todos os bloqueios são liberados no final da transação corrente (COMMIT ou ROLLBACK)
VIII – Tópicos avançados
150
É possível bloquear antecipadamente algumas linhas de uma tabela em modo EXCLUSIVE, para posterior atualização:
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:
VIII – Tópicos avançados
151
SQL > select * from emp2 where n_emp = 1103 for update of sal;
bloqueia somente as linhas recuperadas em modo exclusive
SQL > update emp2 set sal = 1.2 * sal3 where n_emp = 110;
SQL > commit;
“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:
VIII – Tópicos avançados
152
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 depSQL > 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
2 in exclusive mode;lock table in exclusive mode *ERROR at line: ORA-0060:deadlock delected, transactionbacked out
Table(s) Locked.
tempo que o usuário Aesperou pela liberação da
tabela dep
O Oracle detecta a ocorrênciade um deadlock
VII.4 - Índice
Índices permitem que o Oracle recupere informações do banco de dados de forma mais eficiente.
Para criar um índice:
»UNIQUE garante que a tabela nunca irá conter dois registros com os mesmos valores em todas as colunas do índice
»índice nome do índice a ser criado; deve ser único para cada usuário
»tabela nome da tabela a ser indexada
»col1, ..., coIN colunas que participam do índice
>ASC ordem ascendente (padrão)
>DESC ordem descendente
VIII – Tópicos avançados
153
CREATE [UNIQUE] INDEX índice ONtabela [col1 ASC | DESC, …)
Para remover um índice:
» í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:
ou
Para usar um índice qualquer não é necessário especificá-lo o Oracle decide automaticamente como e quando utilizar um índice.
VIII – Tópicos avançados
154
DROP INDEX índice [ON tabela]
SQL > creat unique index emp_num on emp( n_emp)
SQL > creat index emp_nome on emp( nome_emp );
SQL > creat unique index emp_nome_num 2 on emp( nome_inp, n_emp);
SQL > select * from emp 2 where n_emp = 110;
o Oracle utilizará oíndice emp_num
Índices também podem ser usados para impedir duplicação de registros:
Todos os índices do banco de dados são mantidos automaticamente pelo Oracle.
Deve-se criar índices:
- se uma tabela possui mais que algumas centenas de linhas
- em colunas freqüentemente usadas para recuperação de dados
não é aconselhável criar muitos índices para uma tabela, pois os índices podem prejudicar o desempenho dos comandos INSERT, UPDATE e DELETE
VIII – Tópicos avançados
155
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
O Oracle não aproveita índices para colunas envolvidas em expressões aritméticas:
Para evitar que um índice seja usado, basta fazer uma operação sem efeito na primeiro coluna associada ao índice:
VIII – Tópicos avançados
156
SQL > select nome_emp from emp2 where n_emp = 110;
SQL > select nome_emp from emp 2 where n_emp – 110 = 0;
usa índice
não usa índice
SQL > select nome_emp2 from emp3 where cargo | | ” = `DIRETOR` and n_emp = 110;
não usaria índice em cargo, casoexistisse algum
VIII.5 - Clusters
“Cluster” é uma característica que permite que várias tabelas relacionadas sejam agrupadas fisicamente no banco de dados
Emp Dep
Cluster Emp_Dep
VIII – Tópicos avançados
157
N_EMP NOME_EMP ...N_DEP
103 SAMANTA ...20110 UIRATAN ...20175 PAULO ...10189 RITA ...30201 EVERALDO ...30208 SILVIO ...30230 ANA ...10276 RENATO ...20
N_DEP NOME_DEP
10 ADMINISTRAÇÃO20 PESQUISA 30 VENDAS40 PRODUÇÃO
10 ADMINISTRAÇÃO SAO PAULO175 PAULO PRESIDENTE - 27-FEB-86 ...230 ANA SECRETARIA 175 01-MAY-89 ...
20 PESQUISA CAMPINAS103 SAMANTA ANALISTA 110 17-MAR-85 ...110 UBIRATAN DIRETOR 175 20-APR-85 ...276 RENATO ANALISTA 110 30-APR-86 ...
30 VENDAS BRASILIA189 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
o departamento e seusempregados estãofisicamente agrupados
Um cluster pode envolver várias tabelas, mas uma tabela pode participar no máximo de um cluster.
Assim como ocorre com índices, o Oracle tira proveito de clusters automaticamente; não é necessário (nem possível) indicar o uso de um cluster.
Um cluster agrupa tabela fisicamente por um conjunto de colunas comuns a estas tabelas (como acontece logicamente em uma junção).
Cada valor distinto existente nas colunas de um cluster é armazenado uma única vez no banco de dados.
VIII – Tópicos avançados
158
Para criar um cluster:
»cluster nome do cluster a ser criado»col1 tipo1, ... colunas (e respectivos tipos) usadas para
agrupar as tabelas
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:
VIII – Tópicos avançados
159
CREATE CLUSTER cluster (col1 tipo1, ...)
SQL > create cluster 2 proj_dep ( n_dep number(2) );
SQL > create index imd_prod_dep on cluster proj_dep;
Para criar uma nova tabela dentro de um cluster já existente:
Para associar uma tabela já existente a um cluster:
VIII – Tópicos avançados
160
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 );
SQL > create table tmp2 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.
Para remover um cluster, pode-se antes remover suas tabelas:
Ou então remover o cluster e seu conteúdo de uma só vez:
Em geral clusters:
- aumentando o desempenho para junções naturais
- economizam espaço na banco de dados
- diminuem o desempenho para consultas simples ás tabelas separadamente
VIII – Tópicos avançados
161
SQL > drop table dep;SQL > drop table proj;SQL > drop cluster proj_dep;
SQL > drop cluster proj_dep including tables;
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 odicionário de dados
ALL_COL_COMENTS comentários sobre colunas das tabelas que ousuá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 queNS o usuário tem acesso, incluindo o dicionário de
dados
ALL_TAB_COMENTS comentários sobre tabelas e visões acessíveisao usuário
ALL_TAB_GRAN listas de permissões de acesso recebidas pelo TS_RECD usuário (GRANT)
ALL_USERS lista dos usuários Oracle
ALL_VIEWS lista das visões que o usuário tem acesso
VIII – Tópicos avançados
162
DICTIONARY descrições de tabelas e visões do dicionário dedados do Oracle
USER_CATALOG tabelas, sinônimos, seqüência e visões que ousuário tem aceso (excluindo o dicionário dedados)
USER_CLUSTERS “clusters” e tabelas associadas (o usuário deveter 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 criadaspelo usuário
USER_TABLES descrição das tabelas do usuário
USER_VIEWS comandos SQL que definem as visões criadaspelo usuário
VIII – Tópicos avançados
163
Para saber quais são suas tabelas, visões, sinônimos e clusters:
VIII – Tópicos avançados
164
SQL > select table_name, table_type
TABLE_NAME TABLE_TYPEDEP TABLEDEP_SAL VIEWEMP TABLEEMP_DEP VIEWEMP_DIA VIEWFAIXA_DIA TABLEJOAO_ALU SYNONYMPROJ TABLEPROJ_DEP CLUSTERSAL_MEDIO TABLE
Para saber todos as tabelas, sinônimos, seqüências e visões às quais você tem acesso:
Para saber todos os índices da tabela EMP:
VIII – Tópicos avançados
165
SQL > select table_name, owner, table_type from all_catalog;
TABLE_NAME OWNER TABLE_TYPEALUNO JOAO TABLEDEP CURSO TABLEDEP_SAL CURSO VIEWEMP CURSO TABLEEMP_DEP CURSO VIEWEMP_DIA CURSO VIEWFAIXA_SAL CURSO TABLEFRANQUIAS JOAQUIM TABLEITEM_PED JOAO TABLEPEDIDO JOAO TABLEPRODUTO JOAO TABLEPROJ CURSO TABLESAL_MEDIO CURSO TABLE...
SQL > select i.index_name, i.table_name, column_name2 from user_indexes i, user_ind_columns c3 where i.index_name = c.index_name and4 i.table_name = `EMP`;
INDEX_NAME TABLE_NAME COLUMN_NAMEEMP_NUM EMP N_EMPEMP_NOME EMP NOME_EMP
Para saber seus privilégios em tabelas de outros usuários:
VIII – Tópicos avançados
166
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 r5 from all_tab_grants_recd6 where grantee = user and grantor ! = user;
DOADOR TAB A D N I S U RJOAO PRODUTO Y Y Y Y Y Y YJOAO ALUNO Y Y Y YJOAQUIM FRANQUIAS Y YJOAO PEDIDO Y Y Y Y YJOAO ITEM_PED Y Y Y Y Y
é possível armazenar comentários sobre tabelas e colunas no dicionário de dados:
VIII – Tópicos avançados
VIII - Exercícios
167
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, comments2 from user_tab_comments3 where table_name = EMP`;
TABLE_NAME COMMENTSEMP Empregados da Software Desing
SQL > select column_name comments2 from user_col_comments3 where table_name = `EMP and comments is not null;
COLUMN_NAME COMMENTSNOME:EMP Nome do empregadoCHEFE código do chefe desta pessoa
1. Conceda privilegio de consulta a inserção em sua tabela ALUNO para seu companheiro mais próximo.
2. Crie i sinônimo ALUNO0 para a tabela ALUNO do instrutor (usuário ora0).
3. Bloqueia a tabela ALUNO0 em modo exclusivo e insira os seus dados nela (dica: utilize a segunda forma do comando INSERT). Efetive a operação.
4. Crie um índice na coluna NOME da sua tabela ALUNO.
5. Revogue as permissões de acesso a sua tabela ALUNO para seu companheiro, concedidas no exercício nº 1.
6. Consulte os índices existentes para a sua tabela ALUNO. Dica: veja a página 165.
7. Consulte seus privilégios de acesso à tabela ALUNO do instrutor. Dica: veja pagina 166.
VIII – Tópicos avançados
168
Tabelas:
Conteúdo:
Ap. A – Tabelas utilizadas
170
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)
N_EMP NOME_EMP CARGO CHEFE DATA_ADM SAL COM N_DEP
103 SAMANTA ANALISTA 110 17-MAR-85 150000 20110 UBIRATAN DIRETOR 175 20-APR-85 300000 20175 PAULO PRESIDENTE 27-FEB-86 500000 10189 RITA DIRETOR 175 25-DEC-85 330000 5000 30201 EVERALDO VENDEDOR 189 28-SEP-86 200000 3000 30208 SILVIO VENDEDOR 189 30-OCT-86 150000 9000 30230 ANA SECRETARIA 175 01-MAY-89 120000 10276 RENATO ANALISTA 110 30-APR-86 100000 1000 20
SQL > DESCRIBE dep Name Null? Type N_DEP NOT NULL NUMBER(2) NOME_DEP NOT NULL CHAR(14) LOCAL_DEP CHAR(13)
Conteúdo:
Conteúdo:
Ap. A – Tabelas utilizadas
171
N_EMP NOME_DEP LOCAL_DEP
10 ADMINISTRAÇÃO SAO PAULO20 PESQUISA CAMPINAS30 VENDAS BRASILIA40 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)
SALMIN SALMAX F 1 99999 A 100000 149999 B150000 199999 C200000 399999 D400000 800000 E
SQL > DESCRIBE proj
Name Null? TypeNOME 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? TypeNOME_DEP NOT NULL CHAR(14)Number_Salario NUMBER
SQL > DESCRIBE proj
Name Null? Type.N_PROJ NOT NULL NUMBER(5)NOME_PROJ CHAR(20)N_DEP NOT_NULL NUMBER(2)
Ap. A – Tabelas utilizadas
173
SQL > DESCREBE dep_sal
Name Null? Type
NOME_DEP NOT NULL CHAR(14)NUM_FUNC NUMBERSAL_MIN NUMBERSAL_MED NUMBERSAL_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? TypeN_EMP NOT NULL NUMBER(4)NOME_EMP NOT NULL CHAR(10)CARGO CHAR(10)CHEFE NUMBER(4)DATA_ADM DATESAL NUMBER(10,2)COM NUMBER(10,2)N_DEP NUMBER(2)
Ap. B – Sumário dos Comandos
Principais comandos SQL:
ALTER TABLE adicione ou redefine uma colina em uma tabela existente
174
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ãoSYNONYM
CREATE TABLE cria uma tabela e define as características desuas colunas
CREATE VIEW cria uma visão sobre uma ou mais tabelas ouvisões
DELETE remove linhas de uma tabela
DROP objeto remove um “cluster”, tabela, visão, etc. dobanco de dados
GRANT cria usuários, atribui senhas, e fornece privilégios de acesso a tabelas e visões
INSERT insere novas linhas em uma tabela ou visão
LOCK TABLE bloqueia uma tabela
RENAME muda o nome de uma tabela, visão ousinônimo
REVOKE revoga acesso ao banco de dados ou a tabelas evisõ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
175
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 operacionalsem 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, eque ação deve ser tomada em cada quebra
BTITLE especifica um título a ser mostrado no rodapé de cada pagina de um relatorio
CHANGE altera o conteúdo da linha corrente no buffer
CLEAR apaga as definições dos comandos BREAK, COMPUTE, COLUMN, etc.
COLUMN especifica como uma coluna e seu nome devem ser mostrados em um relatório
COMPUTE realiza cálculos em um conjunto de linhas selecionadas. Funciona em conjunto com o comando BREAK
CONNECT termina a sessão corrente e se conecta novamente ao ORACLE
DEFINE define uma variável e atribui um valor a ela
Ap. B – Sumário dos Comandos 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
176
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 eSQL*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 decomandos
RUM mostra e executa o conteúdo do buffer corrente
RUMFORM executa um formulário previamente gerado
SAVE salva o conteúdo do buffer corrente em um arquivo
SET atribui um valor a um parâmetro do SQL*Plus
SHOW mostra as definições atuais dos parâmetros doSQL*Plus
SPOOL controla a copia de saída dos comandos emarquivos ou na impressora do sistema
TTITLE especifica um titulo a ser mostrado no topo de cada página de um relatório
UNDEFINE remove a definição de uma variável
WHENEVER controla o fluxo de execução do SQL*Plus quando ocorrem erros em comandos SQL
Ap. B – Sumário dos Comandos
177
AP. C – Resposta dos exercícios
II.1:
178
create table aluno (nome char( 30 ) not null,ender char( 50 ),cidade char( 25 ),estado char( 2 ),cep number( 5 ),aniversario date );
II.2:
II.3:
Ap. C – Resposta dos exercíciosII.4:
II.5:
179
insert intoalunovalues ( `Joao da Silva Neto`, `Rua Brasincas, 145`, `Sao Paulo`,`SP`, 01250, `12-JAN-11`);
insert into alunovalues ( `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 alunovalues ( `Ana Rosa da Silva Salgado`, `Rua Brás Cubas, 789`,`Curitiba`, `PR`, 80530, `01-OCT-11`);
column niver format a5select nome “Aluno”, to_char( aniversario, `DD/MM` ) “ Niver”from aluno;
select ender, cidade, estado, cepfrom alunowhere nome = `João da Silva Neto´;
III.1:
III.2:
III.3:
III.4:
Ap. C – Resposta dos exercícios
III.5:
180
save ex24exitsqlplus ora1/senha1start ex24
select nome_emp, cargo, sal / 160from emp;
select nome_emp, sal + comfrom empwhere cargo = `VENDEDOR`
select nome_emp, cargo, sal / 160from emporder by 3 desc;
select min(sal)from emp;
select n_dep, min(sal) “Menor Salario”, max(sal) “Maior Salario”, avg(sal) “Salario Médio”from empgroup by n_dephaving count(*) > 1;
III.6:
IV.1:
IV.2:
IV.3a:
IV.3b:
Ap. C – Resposta dos exercícios
IV.4:
IV.5:
181
select nome_emp, nome_dep from emp, depwhere emp.n_dep = dep.n_dep and local_dep in ( `SAO PAULO`, `CAMPINAS` );
creat table empreg as select n_emp, nome_emp, sal from emp;
rename empreg to temp;drop table temp;
alter table aluno modify ( cidade char( 35 ) );
alter table aluno add ( sal_desejado mnber( 11, 2 ) );
insert into aluno ( nome, aniversario, sal_desejado )values ( `Joaquim Alfredo Guimarães`, `13-JUL-11`, 350000 );
IV.6:
IV.7:
Ap. C – Resposta dos exercícios
IV.8:
182
update alunoset sal_desejado = 400000where nome = `João da Silva Neto`;update alunoset ender = `Rua Pindamonnhangaba, 123`,cidade = `Taubaté`, estado = `SP`, cep = 14500where nome = `Joaquim Alfredo Guimarães`;
create table tmp as select nome, ender, cidade, estado, cep, aniversario from aluno;drop table aluno;rename tmp to aluno;
delete from alunowhere nome = `Joaquim Alfredo Guimarães`;commit;
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:
IV.10:
IV.11:
Ap. C – Resposta dos exercíciosV.1:
183
describe dep_salselect * from dep_sal;
update empset sal = 300000where nome_emp = `SAMANTA`;select * from dep_sal;
rollback;
get ex31del1a “Sal/hora”ttitle center “Salario por hora” skip 1 center “dos Empregados” skip1column Sal/hora format 9999.99column cargo justify rightcolumn/
V.2:
Ap. C – Resposta dos exercíciosV.3:
184
set echo offset feedback offset linesize 50set pagasize 40ttitle center “Relatorio de Empregados” skip 2break on Departamento skip 1compute avg sum of Salario on Departamentoselect nome_dep “Departamento”, nome_emp “Nome”, cargo“Cargo”, sal “Salario” from emp, depwhere emp.n_dep = dep.n_deporder by nome_dep;
set echo offset verify offset feedback offset pause offset linrsize 50set pagasize 40clumn aux noprintttitle center “Relatorio de empregados” skip 2break on aux skip 1compute avg sum of Salario on auxaccept MaiorSalario number prompt `Maior Salario: `spool ex.53.lstselect nome_dep aux, nome_dep “Departamento”, nome_emp “Nome”, cargo “Cargo”, sal “Salário”from emp, depwhere emp.n_dep = dep.n_dep and sal > = &1 and sal < = &MaiorSalarioorder by nome_dep;spool off
VI.1:
VI.2:
Ap. C – Resposta dos exercíciosVI.3:
185
select nome_emp, cargofrom empwhere to_char( data_adm, `DD/MM/YY` ) between `01/02/85`and `27/12/85` and com is not null;
select userenv( `sessionid`), userenv( `terminal`)from dual;
Select stddev( sal ) DesvPadr, avg( sal ) MediaFrom empWhere cargo in ( `DIRETOR`, `PRESIDENTE`);
VI.4:
VI.5:
VI.6:
VI.7:
Ap. C – Resposta dos exercíciosVI.8:
186
column data 1 format a6column data 2 format a6select nome, to_char( aniversario, `DD/MM`) data1, to_char( aniversario, `DD-MON`) data2from aluno;
select n_emp, nome_emp, cargo, sal + nvl( com, 0 ) TotSalariofrom emp;
select trunc( to_number( months_between( max( data_adm ), min( data_adm )) )) MESES from emp;
select nome_emp, decode( cargo, `SECRETARIA`, 1, `VENDEDOR`, 2, `ANALISTA`, 3, 4 ) Categoriafrom emp;
select emp.nome_emp, greatest( emp.sal, dep_sal.sal_méd ) Saladealfrom emp, dep, dep_salwhere emp.n_dep = dep.n_dep and dep.nome_dep = dep_sal.nome_dep;
VI.9:
VII.1:
VII.2:
Ap. C – Resposta dos exercíciosVII.3:
187
select substr( nome_emp, 1, 1)from emporder by data_adm;
column data_hora format a15select uld, user, to_char( sysdate, `HH24:MI-DD/MM/YY` )DATA HORAfrom dual;
select nvl( chefe.nome_emp, `-------` ) NOME_CHEFE, func.nome_emp NOME_FUNCfrom emp func, emp chefewhere func.chefe = chefe.n_emp (+)order by 1;
select nome_emp, sal, local_depfrom emp x, dep, faixa_salwhere 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:
VII.5:
VII.6:
VIII.1:
Ap. C – Resposta dos exercíciosVIII.2:
VIII.3:
188
update emp xset sal = 1.2 * salwhere data_adm = ( select min( data_adm ) from emp y where y.n_dep = x.n_dep);
delete from emp xwhere x.sal > ( select avg( y.sal ) from emp y where y.cargo = x.cargo );
rollback;
grant select, insert on aluno to ora
create synonym aluno0 for ora0.aluno;
lock table aluno0 in exclusive mode;insert into aluno0 select * from aluno where nome = `Joao da Silva Neto`;commit;
VIII.4:
VIII.5:
VIII.6:
VIII.7:
Ap. C – Resposta dos exercícios
189
create index alu_nome on aluno( nome );
revoke select, insert on aluno from ora2;
select ui.index_name, ui.table_name, column_namefrom user_indexes ui, user_ind_columns unidwhere ui.index_name = uind.index_name and ui.table_name = `ALUNO`;
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 rfrom all_tab_grants_recdwhere table_name = `ALUNO` and grantor = `ORA`;