apostila sql

238
Índice Conteúdo 3 I - Introdução 4 1.1 - Objetivos do curso 5 1.2 - O que é SQL*Plus 6 II - Comandos SQL e SQL*Plus 7 II-Conteúdo 8 11.1 - Ativação do SQL*Plus 9 11.2 - Criação de tabelas 10 11.3 - Manipulação de tabelas 12 11.4 - Formatação de relatórios 16 11.5 - Edição de comandos 17 11.6 - Outros comandos 22 II - Exercícios 23 III - Consultas básicas 24 111-Conteúdo 25 111.1 - Seleção de colunas 26 111.2- Uso de expressões 27 111.3 - Seleção de linhas 29 111.4 - Ordenação de resultados 31 111.5 - Agrupamento 33 111.6 - Operações de conjunto 35 111.7 - Junção de tabelas 39 III - Exercícios 44 IV- Criação e uso de tabelas 45 1V-Conteúdo 46 1V.1 -CREATETABLE 47 IV.2 - Tipos de colunas 51 IV.3 - Alteração de uma tabela 52 lV.4 - O comando INSERT 54 lV.5 - O comando DELETE 56 IV.6 - O comando UPDATE 57 IV.7 - Controle de transações 59 lV.8 - Manipulação de visões 67 IV.9 - Criação de seqüências 72 IV - Exercícios 73 V -Geração de Relatórios 75 V - Conteúdo 76 V.1 - Formatação de colunas 77 V.2 - Formatação de títulos 80 1

Upload: joao-assef

Post on 12-Jun-2015

1.928 views

Category:

Documents


13 download

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 – Introdução

4

I.1 – Objetivos do Curso

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

- Definir e alterar a estrutura de um banco de dados

- Consultar, inserir, alterar ou remover informações de um banco de dados

- Gerar relatórios a partir de consultas

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

I – Introdução

5

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

II – Comandos SQL e SQL*Plus

II - Conteúdo

7

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

III – Consultas básicas

III - Conteúdo

1. Seleção de colunas

24

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

IV – Criação e uso de tabelas

IV – Conteúdo

1. CREATE TABLE

2. Tipos de colunas

45

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

V – Geração de Relatórios

V – Conteúdo

75

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

110

VI - Conteúdo

1. Operadores

2. Funções numéricas

3. Funções de caracteres

4. Funções de grupo

5. Conversão entre tipos

6. Funções de datas

7. Outras funções

VI – Expressões e funções

111

VI.1 - Operadores

Operadores de valor:

+ , - indicador de sinal WHERE X = -1

* , / multiplicação e divisão SELECT 2 * X...

+ , - soma e subtração SELECT X + Y...

| | concatena “strings” SELECT `EMPREGADO`| | NOME_EMP

Operadores lógicos

= teste igualdade WHERE SAL = 100000

! =, < >, ^ = testa desigualdade WHERE SAL ! = 100000

>, > = testa maior (ou igual) WHERE SAL > 100000

<, < = testa menor (ou igual) WHERE SAL < = 100000

VI – Expressões e funções

112

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

[NOT] teste de intervalo SAL BETWEEN 10000 AND 200000

BETWEEN …AND

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

IS [ NOT ] testa valor nulo WHERE COM IS NULL

NULL

NOT inverte resusltado WHERE NOR ( SAL = 100000 )lógico de expressões

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

OR operação lógica ou WHERE COM IS NULL OR SAL > 100000

ANY deve casar com WHERE SAL = ANY (SELECT 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 – Consultas avançadas

126

VII - Conteúdo

1. Pseudo-colunas

2. Junção externa

3. Auto-Junção

4. Consultas encaixadas

5. Consultas hierárquicas

VII – Consultas avançadas

127

VII.1 – Pseudo-colunas

Pseudo-colunas são colunas que podem ser consultadas em qualquer tabela, como uma coluna normal, mas não podem ser alteradas:

T Nome Descrição

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

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

N LEVEL usada na comando SELECT ... CONNECT BY (explicado na seção VII.5); é igual a 1 para o nó raiz de uma árvore, 2 para seus filhos e assim por diante

_ NULL valor nulo

R ROWID identificação interna de uma linha

N ROWNUM número que indica a ordem de seqüência da linha selecionada em uma consulta

D SYSDATE data e hora correntes

N UID número que identifica unicamente o usuário corrente

C USER nome do usuário corrente

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

142

VIII - Conteúdo

1. Manutenção de usuários

2. Privilégios de acesso a tabelas

3. Acesso concorrentes a tabelas

4. Criação e uso de índices

5. Criação e uso de clusters

6. Dicionário de estruturas de dados

VIII – Tópicos avançados

143

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

Para criar um novo usuário Oracle:

»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

AP. A – Tabelas utilizadas

169

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

Visões:

172

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