Vous êtes sur la page 1sur 437

ORACLE 9I FUNDAMENTAL

SQL, PL/SQL E
ADMINISTRAO

Oracle 9i Fundamental

EDUARDO TERRA MORELLI


tmorelli@tmorelli.com.br

ORACLE 9I FUNDAMENTAL
SQL, PL/SQL E ADMINISTRAO

Morelli, Eduardo M. Terra, 19661. Banco de dados - Gerncia 2. Oracle 3. PL/SQL (Linguagem de
programao para computadores) 4. SQL (Linguagem de programao para
computadores) I. Ttulo.
ndices para Catlogo Sistemtico:
1. Oracle: Banco de dados : Sistemas de gerncia 005.75
Algumas imagens utilizadas neste livro foram obtidas a partir do CorelDRAW 7, 8 e 9 e da
Coleo do MasterClips/ MasterPhotos da IMSI, 1985 Francisco Blvd. East, San Rafael, CA
94901-5506, USA.

Oracle 9i Fundamental

FABRICANTE
Produto: Oracle 9i
Oracle do Brasil
Rua Jos Guerra, 127 - Chcara Santo Antnio
CEP: 04719-030 - So Paulo - SP
Tel: (11) 5189-1000
Site: www.oracle.com.br

REQUISITOS DE HARDWARE E DE SOFTWARE


Para que os assuntos aqui tratados possam ser postos em prtica, deve-se
atender a um conjunto mnimo de requisitos, tanto de hardware quanto de
software. Tomou-se por base a plataforma Windows, utilizada ao longo do
livro.
Seguem os requisitos mnimos de hardware para utilizao do Oracle
Server 9i na plataforma Windows:
Servidor:


PC baseado em processador Pentium 166 MHz (recomendado:


Pentium
233 MHz).

RAM: mnimo de 128 MB; recomenda-se 512 MB.


Espao em disco configurado como NTFS: 2,8 GB (no includo
espao de bases de dados) mais 275 MB no disco de sistema. Para
discos configurados como FAT: 4,5 GB mais 140 MB no disco de
sistema. Disco contendo diretrio apontado pela varivel de
ambiente TEMP deve possuir 400 MB livres, no mnimo. rea de
paginao (swap) deve partir de 200 MB.
 Placa de vdeo SuperVGA com 2 MB de memria.
Mquinas clientes devem partir de Pentium 166 MHz, possuir 64 MB de
RAM e 800 MB de espao livre em disco.
Software mnimo:
Servidor: Windows 2000 com ltimo Service Pack instalado; Microsoft
Internet Explorer 5.5; Oracle Server.
Cliente: Windows 98; Microsoft Internet Explorer 5.5; Oracle Client.
O ambiente necessrio para praticar os ensinamentos do livro consiste no
Windows 2000 com ltimo Service Pack; Oracle Server verso 9.2; SQL
Navigator da Quest, para os captulos de programao; Uma planilha
compatvel com Microsoft Excel para abrir o arquivo Livros_Oracle9i.xls.
Para realizar instalaes em outras plataformas, deve-se consultar
documentao especfica do Sistema Operacional em questo. Inicie a
busca
por:
http://technet.oracle.com/docs/products/oracle9i/content.html.
Mais detalhes no Apndice G.



Oracle 9i Fundamental

DEDICATRIA
Ao Thiago, ainda alguns Bytes;
Ao Leonardo, j com alguns Kilobytes;
Monick, todo Exabyte que houver.

Oracle 9i Fundamental

AGRADECIMENTOS
Nenhum livro pode ser escrito apenas pelo seu autor. Todos aqueles que
contribuam para incrementar os conhecimentos tericos e dem
oportunidades para aplic-los tambm so um pouco autores. Sendo
assim, gostaria de agradecer s contribuies da GINFO da Companhia
Libra de Navegao representada por Marcelo, Fernando, Eduardo, Marcia,
Lus Eduardo, Leme, Mariana, Marcos, Pedro, Cristina, Bruno, Ricardo,
Amrico, Hamilton, Ftima e, principalmente, Lus Paulo Soares Dutra, o
Lupa (as dicas sobre LOBs foram cruciais).
Mas, apenas oportunidade de estudo e prtica no so o bastante para
produzir um livro. Palavras de incentivo, quando emitidas no momento
certo e da forma adequada, representam um estmulo sem igual. E no
existiram palavras to instigantes como as de Patrcia de Andrade Bueno
Garcia, da UFPR (Curitiba-PR).
Incentivo pouco diante da persistncia de Rosana Arruda. Graas sua
infinita pacincia com prazos expirados, este trabalho pde ser concludo.
Obrigado a Pieter Reckman da Starsoft pela confiana depositada nestes
trs anos de convivncia.
A Luiz Paulo Maia pelo excelente artigo do Captulo 17.
Deveriam inventar uma palavra que expressasse uma imensa gratido, pois
ela seria destinada aos meus pais, Enrique e Guillermina, pelo apoio em
todos estes anos.
Um agradecimento especial s minhas irms, Mariana, Victoria, Maria Jos
e Maria Pia, pelo exemplo de persistncia e integridade.
J que inventaro uma palavra para imensa gratido, deveriam faz-lo
tambm para expressar um sentimento que revelasse extrema felicidade
por compartilhar a vida de outra pessoa especial, pois essa palavra
representaria uma nfima parcela do que significa viver com Monick.
Aos meus segundos pais, Sergio e Elizabeth pelo apoio nestes meses de
trabalho rduo.
Ao Leonardo sou grato pelo brilho em seus olhos a cada captulo concludo.
Ao Thiago, pela paz que emana de seu ser.
Oracle 9i Fundamental

SOBRE O AUTOR
Eduardo Terra Morelli, autor dos livros Oracle 8: SQL, PL/SQL e
Administrao (2000) e de SQL Server 2000 Fundamental (2001),
trabalha com treinamento e confeco de material didtico desde 1986.
Neste perodo, foram mais de 6.300 horas de sala de aula, com cerca de
2.600 alunos, sem contar com oito anos como professor universitrio na
PUC-RJ (350 alunos) e ainda outro na Faculdade Carioca (100 alunos).
Atualmente trabalha como DBA Oracle e SQL Server em diversas empresas,
alm de, claro, ministrar cursos sobre estes assuntos. J escreveu mais de
trinta apostilas, alm de diversas contribuies para revistas do ramo, tais
como MicroSistemas.

Oracle 9i Fundamental

SOBRE O MATERIAL DISPONVEL NA INTERNET


O material disponvel na Internet contm arquivos de exerccios e exemplos
utilizados ao longo do livro. Em cada captulo (seo Arquivos
Necessrios) aparece uma lista com os arquivos a serem utilizados no
captulo em questo. Aps a descompactao, os arquivos estaro
distribudos por quatro diretrios: C:\ParteI, C:\ParteII, C:\ParteIII e
C:\Hots.
Para utilizar esses arquivos, imprescindvel que o leitor possua o Oracle
9i Server (servidor) e Client (cliente) instalados sua mquina, Servidora e
Cliente, respectiva-mente. Para acompanhar os exemplos descritos na Parte
II, tambm recomendam-se as presenas do SQL Navigator da Quest e de
algum editor de textos compatvel com Microsoft Word no Cliente. Vale
ressaltar que todos os trabalhos podem ser efetuados apenas na mquina
servidora, caso exista uma para fins de testes.
Arquivo
ORACLE_9I.EXE
EXERCICIO.EXE

Tamanho
96 KB
734 KB

Procedimento para Download


Acesse o site do Autor: www.tmorelli.com.br. Na pgina principal do site,
selecione Livros e clique no item Download. D um clique sobre o arquivo
executvel e este ser transferido.
Procedimento para Descompactao
Primeiro passo: aps ter transferido o arquivo, verifique o diretrio em que
se encontra e d um duplo-clique sobre ele. Ser exibida uma tela do
programa WINZIP SELF-EXTRACTOR que conduzir voc ao processo de
descompactao. Abaixo do Unzip To Folder, existe um campo que indica o
destino dos arquivos que sero copiados para o disco rgido do seu
computador.
Segundo passo: prossiga com a instalao, clicando no boto Unzip, o qual
se encarrega de descompactar os arquivos. Logo abaixo dessa tela, aparece
a barra de status a qual monitora o processo para que voc acompanhe.
Aps o trmino, outra tela de informao surgir, indicando que os
arquivos foram des-compactados com sucesso e esto no diretrio criado.
Para sair dessa tela, clique no boto OK. Para finalizar o programa WINZIP
SELF-EXTRACTOR, clique no boto Close.

Oracle 9i Fundamental

PREFCIO
Recente estudo conduzido na Universidade da Califrnia, em
Berkeley, concluiu que o mundo produz entre um e dois exabytes (EB) por
ano. J Richard Niemiec afirma que se estima em 12 EB o total de
informaes no mundo1.
S para que se tenha uma noo do que isso significa, analise a seguinte
tabela:
Potncia
de 10

Nome

Armazena

Byte (B)

Um caractere representa um byte.

Kilobyte (KB)

Uma pgina de um livro tpico ocupa 25 linhas e


80 colunas, resultando em pouco menos de 2 KB.

Megabyte (MB)

Supondo que uma pgina ocupe 2000 bytes, um


livro com 500 pginas gastaria 1 MB; um arquivo
MP3 contendo uma m-sica tpica gasta cerca de 4
MB.

Gigabyte (GB)

Uma sinfonia completa em alta fidelidade ocuparia


1 GB; tpicos Bancos de Dados comerciais
possuem entre 5 e 200 GB.

12

Terabyte (TB)

Papel equivalente a 50.000 rvores.

15

Petabyte (PB)

Estima-se em 8 PB o volume de toda a informao


disponvel na Internet.

18

Exabyte (EB)

Todas as palavras j ditas por todos os seres


humanos ocupariam 5 EB.

21

Zettabyte (ZB)

24

Yottabyte (YB)

Desde 1979, quando foi lanado o primeiro SGBDR comercial, a


Oracle notabilizou-se por nortear os rumos do mercado de Bancos de
Dados Corporativos. Em junho de 2001, a Oracle lanou a verso 9i de seu
SGBDR2, o primeiro a permitir acesso a dados em barramento de 64 bits.
Se memria fsica no for empecilho, com esta caracterstica possvel
enderear 264, o que equivale a 16 exabytes! S para se ter uma idia do
que representa este vanguardismo, a Microsoft ainda no possui um
Sistema Operacional com este poder de endereamento.
1

Leia a ntegra da pesquisa em http://www.sims.berkeley.edu/research


/projects/how-much-info/summary.html. A afirmao de Richard Niemiec
consta na edio de setembro/outubro de 2001 da Oracle Magazine (pgina
29).
Em maio de 2002 foi lanada a verso 9.2, tambm conhecida por Release II

Oracle 9i Fundamental

Este livro destina-se ao profissional que percebeu a importncia dos


bancos de dados Oracle em plena Era da Informao. A meta principal
consiste em, objetivamente, abrir as portas do Mundo Oracle. O leitor no
pode se conformar em parar aqui. H muitos pontos que podem e devem
ser explorados mais a fundo.
Composio do Livro
O livro divide-se em quatro partes. A primeira trata de SQL
(captulos 1 a 7), na qual so ensinados os fundamentos desta
importantssima linguagem de manipulao de bancos de dados
relacionais. A partir de um estudo de caso, que, alis, continua sendo
usado ao longo do livro, apresentam-se a terminologia bsica, como se
conectar as bases Oracle e os comandos SQL mais importantes. Leitores
com pouca ou nenhuma experincia em SQL devem estudar a fundo estes
captulos.
A segunda parte (captulos 8 a 17) destina-se aos programadores
que desejam desenvolver cdigo na linguagem PL/SQL. Diferente de outras
linguagens, tais como: Pascal, C ou VBA, os programas escritos em
PL/SQL so executados no Servidor em que esto os dados. H muitos
tpicos interessantes nesses captulos: Cursores, Packages, Triggers e
Objetos, em que h um texto primoroso sobre as bases conceituais do
Paradigma da Orientao por Objetos escrito por Luiz Paulo Maia.
O melhor do livro est na terceira parte (captulos 18 a 26) que
explica como um banco de dados Oracle deve ser administrado, ou melhor,
como trabalha um DBA. H que se comentar quase todos os captulos: o 19
apresenta a arquitetura de um BD Oracle; o 20 trata sobre Tablespaces; do
21 ao 23, explica-se Segmento e as suas variaes: Undo (21), Tabela (22) e
ndice (23); o 24 discute aspectos de segurana e o 25 sobre como
implementar uma Poltica de Backup consistente. Finalmente, h breves
comentrios sobre a utilizao do Database Configuration Assistant sob
Windows 2000.
A ltima parte rene os sete apndices do livro. Destaque para o C
no qual se comentam diversos livros de Oracle que complementam os
assuntos aqui tratados. Seguindo o princpio do aprendizado contnuo, este
apndice apresenta os prximos desafios. O arquivo fornecido
Livros_Oracle9i traz uma relao mais completa com editora, pginas e
ISBN.

Oracle 9i Fundamental

Devo enfatizar o apndice D apresentando um exemplo de relatrio


produzidos em um tpico dia de trabalho de um DBA. Vale a pena conferir o
E, no qual se detalha um roteiro que permite implementar um Banco
Standby, isto , uma fiel cpia do original por motivos de performance
(abriga pesadas consultas) e disponibilidade (caindo a produo,
rapidamente se mudam as conexes para o novo Banco).
Finalmente, o apndice F oferece uma lista de endereos na Internet
(mais de 30) coletada por horas a fio. Lembre-se que a Internet muito
dinmica, assim, quando chegar nele, outros endereos podem existir.
Por falar em Internet, h no site do Autor (www.tmorelli.com.br) uma
lista de scripts que podem e devem ser carregados. Os quase cem arquivos
esto distribudos em quatro diretrios: ParteI, ParteII, ParteIII e ParteIV.
Este ltimo, abriga o HOTS, contendo um conjunto de scripts que devem
ser utilizados regularmente.
O ambiente necessrio para praticar os ensinamentos do livro
consiste no Windows 2000 com ltimo Service Pack; Oracle Server verso
9.2; SQL Navigator da Quest, para os captulos de programao.

Oracle 9i Fundamental

10

Composio dos Captulos


A organizao interna dos captulos segue o estilo dos outros livros
do autor, sendo resultado da experincia adquirida em escrever materiais
didticos ao longo dos ltimos 16 anos.
Todo captulo divide-se em:
 Objetivos:
 Novidades
 Arquivos
Necessrios:
 Prrequisitos:
 Motivao:
 Teoria:
 Exerccios/
dicas:

 Referncia
Rpida:

determina-se o que o leitor deve aprender com o


captulo corrente. Deve-se voltar a esta seo
freqentemente para que o foco no seja perdido.
presente a partir do captulo 19, revela os novos
recursos in-troduzidos na verso 9i.
scripts utilizados como exemplo ou exerccio. H mais
de cem arquivos fornecidos.
destinado ao leitor que no prefira uma leitura
seqencial,
para
que
avalie
se
possui
os
conhecimentos necessrios para estudar o captulo.
nem sempre presente, exibe uma situao problema
que in-troduz os tpicos a serem aprendidos.
apresenta conceitos, exemplifica, fornece sintaxe de
coman-dos.
complementa a teoria a partir de instigantes exerccios.
Existem alguns, inclusive, que levam o leitor a
conhecer novos recursos (por exemplo, trigger em
startup no captulo 19).
H quase 270 exerccios, cujas solues comentadas
esto disponveis no site do Autor (maiores
informaes na pgina Sobre o Material Disponvel na
Internet).
clere fonte de acesso teoria. Tambm possui carter
complementar e s vezes apresenta recursos inditos
(por exemplo, comando CREATE PFILE no captulo
19).

Por que vale a pena ler este livro


Quem adquiriu o primeiro livro, ORACLE8: SQL, PL/SQL e
ADMINISTRAO pode pensar que comprar este seria um desperdcio de
tempo e dinheiro, entretanto, h muitas razes para no pensar desta
forma:

Oracle 9i Fundamental

11

J se passaram mais de dois anos desde o lanamento do primeiro


livro. Neste tempo, o autor aumentou seus conhecimentos
dramaticamente, j que vivenciou Bancos de Dados Oracle
diariamente;

Aquele livro tratava da verso 8. Depois dela, j foram lanadas a 8i,


9i e 9i Release II, estas duas ltimas com grande destaque neste
trabalho;

H muito mais pginas, exerccios (todos corrigidos!), dicas, notas de


rodap, exemplos e scripts;

A maioria dos captulos foram quase totalmente reescritos, como por


exemplo o 15Packages (h grande nfase em LOBs); 21-Segmentos
de Undo/Rollback (aborda SMU e DBMS_FLASHBACK), 22Segmentos de Tabelas (IOTs, Materialized Views), 23-Segmentos de
ndice (Bitmaps), 24-Segurana (mais recursos de gerncia de
usurios) e, principalmente, o 25-Backup & Recover tratando de
assuntos inditos como LogMiner, Tablespaces Transportveis e
Recovery Manager.

Oracle 9i Fundamental

12

NDICE ANALTICO
Captulo 1 Bancos de Dados ............................ 21
1.1 - O Problema ........................................... 22
1.1.1 - A Situao Ideal ................................... 23
1.2 - A Soluo............................................. 23
1.2.1 - Projeto Conceitual.................................. 24
1.2.2 - Projeto Lgico ..................................... 25
1.3 - SQL ................................................. 25
Captulo 2 TABELAS .................................... 28
2.1 - Conexo.............................................. 28
2.2 - Criao de Tabelas ..................................... 29
2.2.1 - Tipos de Dados .................................... 30
2.2.2 - Constraints ....................................... 32
2.3 - Alterao de Tabelas .................................... 35
2.4 - Excluso de Tabelas .................................... 37
2.5 - Insero de Dados...................................... 38
Captulo 3 SELEO DE DADOS ........................... 42
3.1 - Selees Simples ....................................... 42
3.2 - Ordenaes e Filtros .................................... 45
3.3 - Visualizando Dados em Tabelas Diferentes .................. 48
3.3.1
3.3.2
3.3.3
3.3.4

Relacionamento
Relacionamento
Relacionamento
Relacionamento

EquiJoin............................
OuterJoin...........................
NonEquiJoin ........................
SelfJoin ............................

48
52
52
53

3.4 - Expresses Calculadas .................................. 53


3.4.1
3.4.2
3.4.3
3.4.4
3.4.5

Funes
Funes
Funes
Funes
Funes

de Caracteres ..............................
de Datas ..................................
Numricas ................................
de Converso de Dados ......................
de Grupo .................................

54
55
57
57
60

3.5 - Operadores de Conjunto ................................. 62


3.6 - Dicionrio de Dados .................................... 64
Captulo 4 ATUALIZAO DE DADOS ....................... 70
Oracle 9i Fundamental

13

4.1 - Fundamentos ......................................... 70


4.2 - Alterao de Linhas..................................... 71
4.3 - Eliminao de Linhas ................................... 71
4.4 - Transaes ........................................... 72
Captulo 5 RELATRIOS ................................. 79
5.1 - Fundamentos ......................................... 79
5.2 - Variveis de Ambiente................................... 80
5.3 - Comandos SQL*Plus Worksheet de Formatao ............... 81
5.3.1 - Column .......................................... 81
5.3.2 - Ttitle e Btitle ...................................... 83
5.3.3 - Break e Compute .................................. 83
5.4 - Bind Variables......................................... 84
5.5 - Gerao de SQL........................................ 86
Captulo 6 OUTRAS ESTRUTURAS DE DADOS ................. 89
6.1 - Fundamentos ......................................... 90
6.2 - ndices ............................................... 90
6.3 - Views ................................................ 92
6.4 - Sequences ............................................ 95
6.5 - Synonyms ............................................ 97
Captulo 7 SUBQUERIES ................................ 101
7.1 - Fundamentos ........................................ 101
7.2 - Subqueries de Uma Linha .............................. 102
7.3 - Subqueries de Mltiplas Linhas .......................... 104
7.4 - Subqueries de Mltiplas Colunas......................... 106
7.5 - Subqueries Correlatas ................................. 106
Captulo 8 PROGRAMAO CLIENTE/ SERVIDOR ............. 110
Criando Programas sob Enfoque Cliente-Servidor ............. 110
8.1 - PL/SQL ............................................. 112
8.2 - PL/SQL ou Java? ..................................... 113
8.3 - Unidades de Programa ................................. 114
8.4 - Procedures........................................... 115
8.5 - Functions ........................................... 116
Captulo 9 SQL NAVIGATOR ............................. 120
9.1 - Fundamentos ........................................ 120
Oracle 9i Fundamental

14

9.2 - Elementos do Ambiente ................................ 121


9.2.1 - DB Navigator.....................................
9.2.2 - Stored Program Editor .............................
9.2.3 - SQL Editor ......................................
9.2.4 - Trigger Editor ....................................
Captulo 10 VARIVEIS ................................

121
122
123
123
126

10.1 - Fundamentos ....................................... 126


10.2 - Tipos Escalares ...................................... 127
10.3 - Tipos Compostos ..................................... 129
10.3.1 - Vetores (Tables).................................. 129
10.3.2 - Registros (Records) ............................... 130
10.4 - Escopo ............................................. 131
Captulo 11 PL/SQL: SQL .............................. 134
11.1 - Seleo (Select/Into) .................................. 134
11.2 - Insero (Insert) ..................................... 136
11.3 - Alterao (Update).................................... 137
11.4 - Excluso (Delete)..................................... 138
11.5 - SQL Dinmica ....................................... 139
Captulo 12 pl/sql:pl ................................ 142
12.1 - Processamento Condicional ............................ 142
12.2 - Processamento Repetitivo .............................. 145
12.2.1
12.2.2
12.2.3
12.2.4

FOR ...........................................
WHILE .........................................
LOOP ..........................................
FORALL........................................

145
146
147
148

12.3 - Depurao .......................................... 149


Captulo 13 CURSORES ................................. 153
Exemplo de processamento precisando Cursores .............. 153
13.1 - Fundamentos ....................................... 154
13.2 - Cursores Explcitos ................................... 156
13.3 - Cursores de Atualizao ............................... 159
Captulo 14 EXCEES ................................. 163
14.1 - Fundamentos ....................................... 163
14.2 - Excees Predefinidas................................. 164
14.3 - Excees no Predefinidas ............................. 166
14.4 - Excees Definidas pelo Usurio ........................ 167
Oracle 9i Fundamental

15

14.5 - Excees em Blocos Annimos.......................... 169


Captulo 15 PACKAGES ................................. 173
15.1 - Fundamentos ....................................... 174
15.2 - Criao ............................................ 175
15.2.1 - Especificao ................................... 175
15.2.2 - Corpo.......................................... 176
15.3 - Ativao ............................................ 177
15.4 - Dependncias ....................................... 178
15.5 - Packages Embutidos.................................. 180
15.5.1 - DBMS_JOB ..................................... 180
15.5.2 - DBMS_LOB ..................................... 183
Captulo 16 TRIGGERS ................................. 191
16.1 - Fundamentos ....................................... 191
16.2 - Criao ............................................ 194
16.3 - DML ............................................... 196
16.3.1
16.3.2
16.3.3
16.3.4

INSERT ........................................
UPDATE .......................................
Delete .........................................
Mltiplos .......................................

196
196
197
198

16.4 - Atualizao de Views.................................. 199


16.5 - Schema ............................................ 200
16.6 - DBMS_ALERT ....................................... 201
Captulo 17 OBJETOS .................................. 205
O Paradigma da orientao por Objetos ..................... 206
17.1 - Fundamentos ....................................... 210
17.2 - Tipos Objeto ........................................ 211
17.3 - Herana ............................................ 214
17.4 - Tabelas de Objetos ................................... 215
17.5 - Tabelas Aninhadas ................................... 217
17.6 - Vetores Variveis..................................... 219
Captulo 18 INTRODUO ADMNISTRAO ................ 223
Um Dia na Vida de Daniel Barbosa Alves (DBA) ............... 224
18.1 - O DBA ............................................. 224
18.2 - Organizao Interna .................................. 226
18.2.1 - Organizao Fsica ............................... 226
18.2.2 - Organizao Lgica............................... 227
Oracle 9i Fundamental

16

18.3 - Objetos de um Banco de Dados ......................... 227


Captulo 19 ORGANIZAO FSICA ....................... 230
19.1 - Arquivos ........................................... 231
19.1.1
19.1.2
19.1.3
19.1.4
19.1.5
19.1.6

Data Files ......................................


Control Files ....................................
Redo Log Files...................................
Arquivos de Parmetros (INIT.ORA e SPFILE.ORA) ......
Arquivos de Acompanhamento......................
Arquivo de Senhas ...............................

232
233
233
235
236
237

19.2 - Memria ........................................... 237


19.2.1 - Program Global Area (PGA) ........................ 237
19.2.2 - System Global Area (SGA) ......................... 237
19.3 - Processos........................................... 239
19.3.1 - Processo Usurio ................................ 239
19.3.2 - Processo Servidor ................................ 239
19.3.3 - Processo Background ............................. 240
19.4 - Instncia ........................................... 242
19.4.1
19.4.2
19.4.3
19.4.4

Parmetros .....................................
Etapas .........................................
Fechando: Shutdown .............................
Abrindo: Startup.................................

242
245
246
247

19.5 - Viso Geral ......................................... 248


19.6 - O Que Ocorre Durante um SELECT...................... 248
19.7 - O Que Ocorre Durante um UPDATE ..................... 249
19.8 - Notas sobre o Oracle sob Windows 2000 .................. 250
Captulo 20 ORGANIZAO LGICA: TABLESPACES .......... 258
20.1 - Fundamentos ....................................... 259
20.2 - OFA (Optimal Flexible Architecture)...................... 260
20.3 - Criao ............................................ 261
20.4 - Alterao ........................................... 267
20.5 - Eliminao ......................................... 269
20.6 - Enterprise Manager Console ........................... 270
Captulo 21 SEGMENTOS DE ROLLBACK/UNDO ............... 274
21.1 - Introduo aos Segmentos ............................. 275
21.2 - Introduo aos Segmentos de Rollback/ Undo ............. 276
21.3 - Gerncia Automtica (System Managed Undo) ............. 279
Oracle 9i Fundamental

17

21.4 - Flashback Queries ................................... 281


21.5 - Gerncia Manual..................................... 283
21.6 - Regras de Ouro para Gerncia Manual ................... 286
21.7 - Enterprise Manager Console ........................... 286
Captulo 22 SEGMENTOS DE TABELA ...................... 291
22.1 - Fundamentos ....................................... 292
22.2 - Alterao de Segmentos de Tabela ....................... 295
22.3 - Identificao de Linhas ................................ 297
22.4 - Encadeamento de Linhas .............................. 299
22.5 - Materialized Views ................................... 300
22.6 - Index-Organized Tables (IOTs) .......................... 301
22.7 - Parties ........................................... 302
22.8 - Estatsticas ......................................... 305
22.9 - Reorganizao ....................................... 307
22.9.1
22.9.2
22.9.3
22.9.4
22.9.5
22.9.6
22.9.7

Testando Viabilidade do Processo ...................


Criao da Tabela Intermediria ....................
Preenchimento dos Dados .........................
Novas Caractersticas .............................
Sincronismo ....................................
Troca de Tabelas.................................
Eliminao .....................................

307
308
308
308
309
309
309

22.10 - Tabelas Externas.................................... 310


Captulo 23 SEGMENTOS DE NDICE ...................... 315
23.1 - Fundamentos ....................................... 315
23.2 - Organizao Interna .................................. 319
23.2.1 - rvore-B ....................................... 319
23.2.2 - Bitmap ........................................ 321
23.3 - Alterao de Segmentos de ndice ....................... 323
23.4 - Acompanhamento .................................... 324
23.5 - Parties ........................................... 325
Captulo 24 SEGURANA ................................ 329
24.1 - Fundamentos ....................................... 330
24.2 - Usurios ........................................... 331
24.3 - Privilgios .......................................... 333
24.3.1 - Privilgios de Sistema ............................. 333
Oracle 9i Fundamental

18

24.3.2 - Privilgios de Objeto .............................. 335


24.4 - Roles .............................................. 338
24.5 - Profiles............................................. 339
24.6 - Autenticao via Sistema Operacional .................... 341
24.7 - Auditoria ........................................... 342
24.8 - Regras de Ouro ...................................... 344
Captulo 25 BACKUP & RECOVER ......................... 354
25.1 - Fundamentos ....................................... 355
25.2 - Operaes Lgicas.................................... 359
25.2.1 - Exportao ..................................... 359
25.2.2 - Importao ..................................... 362
25.3 LogMiner ............................................ 365
25.4 DBMS_FLASHBACK ................................... 368
25.5 - Tablespaces Transportveis ............................ 369
25.6 - Cold Backup ........................................ 371
25.7 - Hot Backup ......................................... 372
25.7.1 - Modo ArchiveLog................................. 372
25.7.2 - Hot Backup ..................................... 374
25.7.3 - Recuperao a partir de um Hot Backup ............. 376
25.8 Recovery Manager ..................................... 378
25.8.1
25.8.2
25.8.3
25.8.4
25.8.5

Terminologia ....................................
Preparao .....................................
Backup ........................................
Recuperao ....................................
Automao .....................................

378
380
381
384
387

25.9 - Concluso .......................................... 388


Captulo 26 CRIAO DE UM BANCO DE DADOS ............. 398
26.1 - Fundamentos ....................................... 398
26.2 - Database Configuration Assistant ....................... 399
26.3 - Net Configuration Assistant ............................ 400
26.4 - Eliminao de um Banco de Dados ......................
APNDICE a: SQL*PLUS ...................................
APNDICE b: MODELO DE CONTROLE ACADMICO ...............
APNDICE C: BIBLIOGRAFIA COMENTADA .....................
APNDICE D: EXEMPLO DE RELATRIO DE LEVANTAMENTO .......

401
402
404
406
411

Medidas Bsicas .......................................... 412


Oracle 9i Fundamental

19

APNDICE E: STANDBY DATABASES .......................... 421


E.1 - Fundamentos ........................................ 421
E.2 - Parmetros no Banco Principal .......................... 422
E.3 - Parmetros no Banco Standby........................... 424
E.4 - Implantando Modo Manual ............................. 424
E.5 - Implantando Modo Automtico .......................... 425
E.6 - Implantando Modo Leitura .............................. 426
E.7 - Desativando Servidor Standby ........................... 427
E.8 - Concluses .......................................... 427
APNDICE F: APOIO NA INTERNET .......................... 429
APNDICE G: INSTALAO NO WINDOWS 2000 ................. 434
G.1 - Fundamentos ........................................ 434
G.2 - Requerimentos de Hardware ............................ 434
G.3 - Requerimentos de Software ............................. 434
G.4 - Processo ............................................ 435
G.5 - Verificao .......................................... 435
G.6 - Instalao no Cliente .................................. 437

MARCAS REGISTRADAS
Oracle marca registrada da Oracle Inc.
Windows, Access, MS-SQL Server so marcas registradas da Microsoft
Corporation.
SQL Navigator marca registrada da Quest Inc.
Todos os demais nomes registrados, marcas registradas, ou direitos de uso
citados neste livro, pertencem aos respectivos proprietrios.

Oracle 9i Fundamental

20

Captulo 1 Bancos de Dados


OBJETIVOS

Conhecer o estudo de caso utilizado ao longo do livro;


Rever termos bsicos relacionados a Bancos de Dados;
Travar um primeiro contato com a linguagem SQL;
Informar sobre o real significado do mundo Oracle.

ARQUIVOS NECESSRIOS

Nenhum.

PR-REQUISITOS

Noes de Modelagem de Dados;


Definir entidade, atributo, relacionamento;
Compreender o papel da Normalizao no Projeto de um Banco
de Dados;
Identificar as diferentes etapas prvias construo de um
Banco de Dados.

Oracle 9i Fundamental

21

MOTIVAO
O Mundo Oracle
O maior mrito da Oracle Corporation foi apostar decisivamente em
uma ferramenta de gerncia de bancos de dados relacionais. O
estrondoso sucesso no incio dos anos setentas levou criao de
verses especficas s plataformas de hardware. No "boom" do PC, a
Oracle lanou sua verso para micros.
H muito o nome Oracle deixou de significar apenas uma poderosa
ferramenta para implementao de Bancos de Dados corporativos,
cujo nico objetivo era ler, gravar e proteger dados. Hoje a Oracle tem
produtos na rea de desenvolvimento (Forms Developer, Designer,
Reports Developer, JDeveloper), Servidor de Aplicaes (Oracle
Application Server), ERP (Financials, Human Resources, etc.),
Internet (Commerce Server, Self-Service Web Applications), OLAP
(Data Mart Suite, Data Mining Suite, Discoverer) e, evidentemente,
administrao de Bancos de Dados (Oracle-Server, Enterprise
Manager).
Uma das grandes razes do sucesso da Oracle foi criar produtos que
pudessem ser utilizados em diversas plataformas: desde o VMS at o
Unix, passando pelo Windows (3.1, 9x, NT, 2000, XP).
Ao longo do livro sero construdas e alimentadas com dados as
tabelas discutidas no presente captulo. Desta forma, juntamente
com o Oracle-Server, ser utilizada a ferramenta SQL*Plus
Worksheet que, alm de responsvel pela conexo entre Cliente e
Servidor (podem estar em uma mesma mquina ou em duas),
reconhece e submete comandos SQL para execuo no Servidor e
permite, entre outras facilidades, a entrada de dados interativa,
formatao de sada e edio de comandos SQL e prprios por meio
de um editor de textos.

TEORIA
1.1 - O Problema
O famoso CEVOG (Centro Educacional de Volta Grande), melhor escola da
regio, completa trezentos anos de existncia. Dizem que at Tiradentes
rabiscou suas primeiras letras por l.

Oracle 9i Fundamental

22

Em breve, o atual diretor, Moura XI, passar o cargo para seu filho, o
jovem promis-sor Moura XII. Cargo este j ocupado pelo lendrio Moura I, o
Fundador.
Para comemorar tal importante data e tambm a passagem do cargo,
finalmente o CEVOG resolveu render-se modernidade: a partir deste ano,
o notrio centro tambm oferecer cursos de informtica comunidade. O
jovem Moura XII est bastante preocupado: como disponibilizar cursos de
computao se todo o controle interno ainda manual?
O Controle Acadmico a ser implantado tentar copiar o utilizado h tanto
tempo pelos cursos regulares. Existem dois cadastros: o de Alunos (Nome,
Endereo, Telefone) e o de Cursos (Descrio, Carga Horria, Prrequisitos). H dez cursos e, a princpio, uns trezentos alunos.
Nada foi definido quanto criao de turmas, nem h a menor idia de
como implantar o controle de instrutores. Seria interessante guardar um
histrico de cada aluno (notas, freqncias) para poder controlar prrequisitos em futuras matrculas.
Os problemas so muitos, mas nada que possa arrefecer os nimos dos
Moura. Se eles j foram at citados como centro de excelncia de ensino
nos idos anos quarentas (do sculo XIX!), no ser um curso de informtica
que os far recuar ante o inexorvel avano do tempo.

1.1.1 - A Situao Ideal


Moura, o Doze, deseja implantar o seguinte:

Criar um cadastro de Instrutores (Nome, Endereo, Telefone,


Data de admisso) para que seja implantado um eficiente sistema
de alocao;
Integrar os cadastros de Alunos e Cursos para saber, em questo
de minutos, se um determinado indivduo est fazendo ou j fez
um dado curso;
Criar outro cadastro de Notas (Turma, Matrcula, Nota) para que
se tenha uma idia do nvel de cada aluno.

Numa prxima ocasio ser implantado um controle rigoroso sobre


cobrana, prevendo, inclusive, uma modalidade de pagamento a prazo mais
sofisticada.
A idia oferecer os cursos para o mundo via Internet, assim os dados
armazenados sero da ordem de peta bytes, o que justifica a utilizao do
Sistema Gerenciador de Bases de Dados Objeto-Relacionais Oracle 9i.

1.2 - A Soluo
A soluo ser dividida em trs etapas:
Oracle 9i Fundamental

23

Projeto
Conceitual

Inicialmente
so
identificadas
entidades,
relacionamentos e atributos. No existe preocupao
com eventuais limitaes de hardware e de software. O
resultado desta etapa o Modelo de Entidades e
Relacionamentos (M.E.R.).

Projeto Lgico

Nesta fase identificam-se as tabelas fsicas do futuro


Banco de Dados. Levam-se em conta as regras de
normalizao para que no haja redundncias na
montagem final.

Projeto Fsico

Consiste na implementao do Banco em Oracle, que


ser feito ao longo do livro.

1.2.1 - Projeto Conceitual


Analisando o problema, v-se claramente a presena de trs entidades:
Alunos, Instrutores e Cursos, cujos atributos poderiam ser os listados em
seguida:
Entidade

Atributos

Alunos

Matrcula, Nome, Telefone, Endereo, UF

Instrutores

Nome, Telefone, Data admisso

Cursos

Nome, Carga horria, Preo, Pr-Requisitos

V-se ainda que o relacionamento entre um aluno e um curso a Turma, o


mesmo, alis, entre instrutor e curso. Um atributo do relacionamento
Aluno-Turma poderia ser sua nota.
As cardinalidades seriam as seguintes:
Alunos x Turmas:
N:N
Cursos x Turmas:
1:N
Instrutores x Turmas:
1:N
O resultado final poderia ser este:

Oracle 9i Fundamental

24

1.2.2 - Projeto Lgico


Como j foi dito, nesta etapa so especificadas as tabelas fsicas, com as
respectivas chaves, do Banco de Dados e so resolvidos problemas
referentes normalizao.
Infelizmente no possvel implementar relacionamentos muitos-paramuitos, assim haver mais uma tabela: AlunosTurmas, ou melhor,
Histrico:
Tabela

Campos

Alunos

Matrcula, Nome, Telefone, Endereo, UF

Histrico

Cdigo Turma, Matrcula, Nota

Turmas

Cdigo Turma, Sala, Cdigo Instrutor, Cdigo Curso

Cursos

Cdigo Curso, Nome, Carga horria, Preo,


Pr-requisito

Instrutores

Cdigo Instrutor, Nome, Telefone, Data admisso

Observao
Os campos em negrito representam as chaves primrias.
Como era esperado, todos os relacionamentos tm a cardinalidade umpara-muitos.
Na prxima etapa, o Projeto Fsico, sero criadas as tabelas reais, levandose em considerao os tipos e tamanhos permitidos pelo Sistema
Gerenciador de Banco de Dados Relacionais (SGBDR), no caso, o Oracle.

1.3 - SQL
Toda interao com o Oracle acontece, em ltima anlise, via SQL. Trata-se
de uma linguagem cujos comandos dividem-se em trs categorias:
Oracle 9i Fundamental

25

DML (Data Manipulation Language);


DDL (Data Definition Language);
DCL (Data Control Language).

Ao contrrio de linguagens ditas procedurais (COBOL, Pascal, Basic, etc.), a


SQL permite especificar o que deve ser feito em vez do como. Por exemplo,
o trecho apresentado em seguida, escrito em uma linguagem procedural
qualquer, percorreria todos os registros de uma tabela:
Inicio
Enquanto no-fim (Tabela)
Leia Registro
Avance
Fim-Enquanto
Fim

J em SQL, teramos apenas um comando:


select * from Tabela

A ttulo de exemplo, a relao seguinte explica alguns comandos SQL:


Comando

Descrio

Tipo

select

Recupera dados de uma ou mais tabelas. o


comando mais utilizado da SQL.

DML

insert
update
delete

Servem para incluir, alterar e eliminar linhas de


uma tabela respectivamente.

DML

commit
rollback

Responsveis pelo controle de transaes,


permitem que o usurio desfaa (ROLLBACK)
ou confirme (COMMIT) alteraes em tabelas.

DML

create
alter
drop

teis para definir, alterar e remover estruturas


do Banco de Dados.

DDL

grant
revoke

Permitem remover direitos de acesso dos


usurios do Banco de Dados e seus
componentes, ou conced-los.

DCL

Oracle 9i Fundamental

26

EXERCCIOS
1. Na tabela seguinte numere a terceira coluna para que os termos que
esto na segunda sejam explicados na quarta coluna:

Seu
Nmero

Nmero

Termo

Definio

Banco de Dados

Sinnimo de Atributo, representa um


tipo de informao.

Tabela

Campo que identifica univocamente


cada registro.

Campo

Utilizado para unir duas tabelas que


tenham um campo em comum. Uma
fornece sua Chave Primria e a
outra, uma Chave Estrangeira.

Chave Primria

Mecanismo que permite visualizar


dados que estejam em tabelas
diferentes.

Chave
Estrangeira

"Sistema de armazenamento de
dados baseado em computador, cujo
objetivo global registrar e manter
informao considerada significativa
organizao" [Date].

Registro

Depsito de dados em forma matricial em que as linhas representam


registros e as colunas, campos.

Relacionamento

Linguagem de manipulao de
dados.

Viso

Campo idntico a uma Chave


Primria em outra tabela.

SQL

O mesmo que tupla. Imaginando que


uma tabela fosse um conjunto, ento
seriam os elementos desse conjunto.

Observao
[Date] refere-se a C.J. Date; a frase em questo encontra-se no livro
"Introduo a Sistemas de Bancos de Dados", pgina 26, Editora
Campus.
Oracle 9i Fundamental

27

Captulo 2 TABELAS
OBJETIVOS

Realizar conexes ao Servidor;


Criar tabelas, levando em considerao nomes de campos, tipos e
constraints;
Utilizar os primeiros comandos da ferramenta SQL*Plus
Worksheet;
Alterar tabelas;
Eliminar tabelas;
Alimentar tabelas com dados.

ARQUIVOS NECESSRIOS

Monta_Tabela_Instrutores.sql;
Monta_Tabelas.sql.

PR-REQUISITOS

Noes de Modelagem de Dados;


Definir entidade, atributo, relacionamento;
Compreender o papel da Normalizao no Projeto de um Banco
de Dados;
Identificar as diferentes etapas prvias construo de um
Banco de Dados;
Conhecer conceitos bsicos, tais como: Banco de Dados, Tabela,
Campo, Registro, Chave Primria, Chave Estrangeira e
Relacionamento.

TEORIA
2.1 - Conexo
Para que seja possvel trabalhar com Oracle, preciso, antes de tudo,
realizar uma conexo. Ela pode ser feita com inmeras ferramentas, por
exemplo, SQL*Plus Worksheet, utilizada ao longo do livro.

Oracle 9i Fundamental

28

Em ambientes grficos, como Windows 98, NT ou 2000, segue-se um


caminho de menus, tal como: Start, Programs, Oracle OraHome92,
Application Development, SQL*Plus Worksheet3. Ser mostrada a caixa
de dilogo seguinte:

Ateno

No momento dessa conexo saiba que j existe um Banco de Dados


(conhecido no Cliente como Servio) e ele est pronto para ser utilizado.
Futuramente, nos captulos de Administrao de Bancos de Dados (18
em diante), voc aprender como criar novos Bancos de Dados e
disponibiliz-los para uso.

Em ambientes no grficos deve-se utilizar outra ferramenta, a SQL*Plus,


cuja ativao seria:
sqlplus usurio/senha@banco

Em que usurio, senha e banco so fornecidos pelo Administrador (DBA).

2.2 - Criao de Tabelas


Uma vez realizada a conexo, pode-se comear a interagir com o OracleServer via comandos SQL. Por exemplo, a criao das tabelas do estudo de
caso ser feita pelo comando create table cuja sintaxe simplificada
mostrada em seguida:

A localizao das ferramentas pode variar de uma instalao para outra.


Ao longo deste livro, assumiremos a instalao padro do Oracle 9i sob
Windows 2000 Server.

Oracle 9i Fundamental

29

CREATE TABLE [schema.]tabela


(coluna1 tipo_de_dado [DEFAULT expresso]
[constraint_coluna],
...
(colunaN tipo_de_dado [DEFAULT expresso]
[constraint_coluna],
[constraint_tabela] );

Os colchetes representam clusulas opcionais. A tabela seguinte explica a


sintaxe do comando:
Opes
Schema
Tabela

Coluna

Tipo_de_
dado

Expresso

Constraint_
coluna
Constraint_
tabela

Descrio
Representa o proprietrio da tabela. Quando omitido, assume-se que
a tabela pertencer ao usurio corrente.
Nome da tabela a ser criada.
Nome da coluna (campo). Deve iniciar por uma letra; pode ter no mximo 30 caracteres (A-Z, a-z, 0-9, underscore e $) e tambm no podem ser palavras reservadas do Oracle. Podem existir at
inconcebveis mil colunas.
Tamanho e tipo de dado da coluna. Veja, ainda neste captulo, uma
descrio dos tipos possveis.
Especifica um valor predefinido para a coluna. Utilizado para evitar
NULL quando uma coluna for omitida em um comando INSERT
(insero de dados). Pode ser um literal, uma expresso, funes SQL,
tais como: SYSDATE (data corrente) ou USER (usurio corrente), mas
no pode ser utilizado o nome de outra coluna ou pseudocolunas
geradas por Sequences (NEXTVAL ou CURRVAL)4.
Especifica a restrio de integridade para uma coluna, como, por
exemplo, valores que podem ser armazenados. Recomenda-se que
tenha nome.
Restrio de integridade como parte da definio de uma tabela.
Utilizada para definir chaves compostas. Tambm aconselha-se
denomin-la.

Ateno
Para que voc possa criar uma tabela, algum, geralmente o DBA, deve
ter lhe dado o direito de criao de tabelas.

2.2.1 - Tipos de Dados


Cada campo em uma tabela deve possuir um tipo previamente estabelecido.
Por tipo entende-se um domnio de valores que o campo pode conter. A
tabela seguinte explicita os tipos de dados mais importantes utilizados pelo
Oracle-Server:
4

Sequences sero vistas adiante, no captulo 6.

Oracle 9i Fundamental

30

Tipo
Char (n)

Varchar2 (n)

Clob

Long

Blob

Raw e
Long raw

Number (p,e)

Date

Timestamp

Interval Year
(p) to month

Interval Day
(dp) to
second (sp)

Descrio
Cadeia de caracteres com tamanho fixo n. O default 1 e o mximo,
2.000.
Cadeia contendo caracteres de tamanho varivel com o mximo
de n, em que n pode ter o valor de at 4.000. Para que dois
campos desse tipo sejam consideradas iguais, elas devem possuir,
alm do mesmo contedo, o mesmo tamanho.
Significa Character Long Object. Permite armazenar extensas
cadeias con-tendo caracteres de tamanho varivel com o mximo
de 4 gigabytes. Existem funes especiais que manipulam campos
deste tipo. Mais detalhes no Captulo 15, Packages.
Antigo mecanismo que permitia armazenar longas cadeias
contendo caracteres de tamanho varivel com o mximo de 2
gigabytes. S pode existir um campo desse tipo por tabela. Um
campo deste tipo pode ser substitudo por outro do tipo CLOB.
Significa Binary Long Object. Permite armazenar extensa cadeia
contendo dados binrios (no so interpretados pelo Oracle,
como, por exemplo, sons, imagens, etc.). Possuem tamanho
varivel com o mximo de 4 gigabytes. Para manipul-los, devemse utilizar funes especiais. Mais detalhes no Captulo 15,
Packages.
Quando no existia o tipo BLOB, eram utilizados para armazenar
dados binrios. Limites raw: 2.000 bytes; long raw: 2.GB
Valores numricos em que p indica a preciso (mximo de 38) e
indica a escala (nmero de casas decimais) que varia de 84 a
+127. Por exemplo, number(5,2) especifica um nmero na faixa
entre -999,99 e +999,99.
Armazena data e hora, incluindo sculo, ano, ms, dia, hora,
minuto e se-gundo. Intervalo: 1/1/4712 a.C. at 31/12/9999.
Campos deste tipo ocupam 7 bytes.
Permite armazenar datas/horas com maior preciso (mxima: 9,
default: 6). Por exemplo, caso seja necessrio especificar
milsimos de segundo, a preciso deve ser 3.
Armazenam intervalos de tempo em anos/meses. P representa a
quan-tidade dgitos para o ano (possveis: 0 a 9; default: 2).
Intervalos podem ser obtidos, por exemplo, ao subtrair uma data
de outra.
Armazenam intervalos de tempo em dias, horas, minutos e
segundos. DP representa a quantidade de dgitos para o dia
(possveis: 0 a 9; default: 2). SP representa a quantidade de
dgitos para o segundo (possveis: 0 a 9; default: 6).

Oracle 9i Fundamental

31

2.2.2 - Constraints
Um constraint ou restrio representa um mecanismo capaz de
implementar controles que garantam a consistncia dos dados (Integridade
de dados e refe-rencial). Pode ser definido tanto em nvel de coluna (afeta
apenas um campo) como em nvel de tabela (afeta todos os campos). Uma
alternativa a esses controles a utilizao de Triggers que apresentam
performance menor, mas oferecem toda a flexibilidade de uma linguagem
de programao (PL/SQL)5.
A tabela seguinte mostra as restries. Logo aps, exemplos revelam como
aplic-las.
Nome

Uso

Null

Unique

Check

Primary key
Foreign key

Informa se o campo em questo pode receber valores nulos. Caso


no possa, deve ser precedido pela palavra not.
Indica que os valores na coluna, ou conjunto de colunas em
questo, no podem ser repetidos. Cria um ndice6
automaticamente.
Determina uma regra de validao, isto , especifica os valores que
uma coluna pode assumir. Em nvel de campo, somente pode fazer
referncia ao prprio campo que est sendo trabalhado. J em
nvel de tabela, pode referenciar vrias colunas.
Identifica a Chave Primria da tabela. Tambm cria um ndice
automaticamente.
Identifica uma Chave Estrangeira da tabela. Implementada pela
clusula references.

Primeiro exemplo: Criao da tabela Instrutores7


create table instrutores
(cod_instrutor
number(3)
constraint instrutores_pk primary key,
nome_instrutor
varchar2(30)
constraint instrutores_nome_nu not null,
tel_instrutor
varchar2(10),
admissao
date default sysdate);

Observaes

5
6
7

A tabela recm-criada possui quatro campos (cod_instrutor,


nome_instrutor, tel_instrutor e admissao);

O assunto triggers ser visto no captulo 16.


ndices sero estudados nos captulos 6 e 23.
O
cdigo
apresentado
em
seguida
Monta_Tabela_Instrutores.sql.

encontra-se

Oracle 9i Fundamental

no

Script

32

Os dois primeiros campos tm restrio. Note a conveno


utilizada no sufixo (PK para Primary Key e NU para Not Null);
O campo admissao apresenta um valor default: a data atual;
Estando o SQL*Plus Worksheet aberto, uma vez concluda a
digitao, executa-se o comando anterior, pressionando a tecla
F5 ou clicando no boto Executar, presente na barra de
ferramentas esquerda;
Todo comando SQL deve ser finalizado por ponto-e-vrgula;

A digitao do comando pode ser feita opcionalmente em um editor externo.


Para ativar o arquivo gerado, utilize o comando start. Por exemplo:
start G:\LivroO9i\Scripts\ParteI\Monta_Tabela_Instrutores.sql

Tambm possvel abrir diretamente o arquivo contendo comandos e


execut-los. Utilize o comando Arquivo, Abrir do SQL*Plus Worksheet.
O Comando start pertence ao SQL*Plus Worksheet e pode ser abreviado
como @.
Para comprovar a criao da tabela, deve ser usado o comando describe do
SQL*Plus Worksheet. Este comando pode ser abreviado como desc.
describe instrutores
Nome
----------------------------------------COD_INSTRUTOR
NOME_INSTRUTOR
TEL_INSTRUTOR
ADMISSAO

Nulo?
Tipo
-------- --------------------------NOT NULL
NUMBER(3)
NOT NULL
VARCHAR2(30)
VARCHAR2(10)
DATE

O SQL*Plus Worksheet trabalha com um buffer em que fica armazenado o


histrico de comandos emitidos. Para acess-lo, ative o comando Folha de
Trabalho, Histrico de Comandos:

Oracle 9i Fundamental

33

Segundo exemplo: Criao da tabela Alunos


A prxima criao de tabela traz exemplo de regra de validao (constraint
check):
create table alunos
(matricula
number(3)
constraint alunos_pk primary key,
nome_aluno
varchar2(30)
constraint alunos_nome_nu not null,
tel_aluno
varchar2(10),
endereco_aluno
varchar2(30),
cidade_aluno
varchar2(20)
default 'Rio de Janeiro',
uf
char(2)
default 'RJ'
constraint alunos_uf_ch check (uf in ('SP', 'MG', 'RJ', 'ES'))
);

Observaes

No podem existir dois constraints homnimos;


Evite usar nomes com palavras acentuadas (matrcula,
endereo);
A restrio check serve para qualquer regra de validao. Por
exemplo, caso fosse preciso restringir os valores no campo nota
da tabela Historico:
... check (nota > 0), ...

Terceiro exemplo: Criao da tabela Turmas


A prxima criao de tabela traz exemplo de referncia (constraint foreign
key):
create table turmas
(cod_turma
number(3) constraint turmas_pk primary key,
cod_curso
constraint turmas_curso_fk references cursos(cod_curso),
cod_instrutor
constraint turmas_instrutor_fk references
instrutores(cod_instrutor),
sala
number(2)
);

Observaes

Antes de criar a tabela apresentada anteriormente, outra j deve ter


sido construda: CURSOS. Se preferir, extraia o comando que cria
essa tabela do arquivo Monta_Tabelas.sql;
A clusula references informa que a tabela corrente estar
relacionada com a mencionada na forma de 1 (mencionada) para N
(corrente). O campo refe-renciado deve ser chave primria (neste
caso, pode ser omitido) ou possuir restrio unique e ser do mesmo
tipo do campo corrente;
Note a impossibilidade da criao de um relacionamento N:N. J o
1:1 deve ser controlado via programao (Triggers).
Oracle 9i Fundamental

34

Quarto exemplo: Criao da tabela Historico


A prxima tabela possui um constraint em nvel de tabela (especificao da
chave primria composta) e duas chaves estrangeiras:
create table historico
(cod_turma
constraint historico_turma_fk
references turmas (cod_turma),
matricula
constraint historico_aluno_fk
references alunos (matricula),
nota
number (7,2),
constraint historico_pk
primary key (cod_turma, matricula));

Observaes

Para que esta criao tenha sucesso, j devem existir as tabelas


TURMAS e ALUNOS. Se elas ainda no existirem, obtenha os
comandos de criao a partir do Script Monta_Tabelas.sql;
Constraints em nvel de tabela no podem ser not null;
Como as chaves estrangeiras devem ser de mesmo tipo e
tamanho das chaves primrias equivalentes, no preciso
especificar os tipos desses campos.

2.3 - Alterao de Tabelas


Para alterar a estrutura de uma tabela, deve-se utilizar o comando alter
table. Por alterar, entende-se:

Criar, alterar ou eliminar colunas;


Renomear a tabela;
Criar ou eliminar constraints;
Habilitar ou desabilitar constraints.

A sintaxe simplificada a seguinte:


alter table [schema.]tabela
[add (coluna tipo_de_dado [default expresso]
[constraint_coluna],...)]
[modify (coluna tipo_de_dado [default expresso]
[constraint_coluna],
...)]
[rename to novo_nome_tabela]
[add constraint_coluna/constraint_tabela]
[drop constraint_coluna/constraint_tabela [cascade]]
[enable constraint_coluna/constraint_tabela]
[disable constraint_coluna/constraint_tabela];

Oracle 9i Fundamental

35

Primeiro exemplo: Insero da coluna de endereos


alter table instrutores add endereco varchar2(40);

Segundo exemplo: Alterao da coluna de endereos


alter table instrutores modify endereco varchar2(60);

Terceiro exemplo: Excluso da coluna de endereos


alter table instrutores drop column endereco;

Ateno
Tenha muito cuidado ao emitir um comando que exclua uma coluna!
Lembre-se que os dados nela contidos TAMBM sero eliminados.

Quarto exemplo: Insero da restrio para notas


alter table historico
add constraint historico_nota_ch
check (nota >=0 and nota <= 10);

Evidentemente, possvel comprovar a existncia do novo constraint.


Ateno Isto ser devidamente explicado no prximo captulo, mas apenas para
matar sua curiosidade, emita o comando:
select constraint_name from user_constraints;

Ele mostra todas as restries criadas pelo usurio corrente.

Infelizmente, s podemos alterar o estado de uma restrio, mas no seu


corpo. Deve-se elimin-la (veja exemplos adiante) e recri-la.

Quinto exemplo: Desabilitar a restrio para notas


alter table historico
disable constraint historico_nota_ch;

Conseqentemente, os dados inseridos a partir deste comando no levaro


em conta os valores especificados nesta restrio, e ela no poder ser
novamente habilitada, caso existam dados que a contrariam.

Sexto exemplo: Excluso do constraint para notas


alter table historico
drop constraint historico_nota_ch;

Note que, ao excluir uma tabela, seus constraints tambm desaparecem.


Oracle 9i Fundamental

36

Stimo exemplo: Incluso de uma chave estrangeira


Supondo que no exista chave estrangeira referenciando Cursos na tabela
Turmas, poderamos inseri-la a posteriori:
alter table turmas
add constraint turmas_curso_fk
foreign key (cod_curso)
references cursos(cod_curso);

Oitavo exemplo: Excluso de dados em cascata


O relacionamento entre ALUNOS e HISTORICO poderia contemplar uma
excluso em cascata, isto , quando um aluno fosse eliminado, suas notas
tambm o seriam:
alter table historico
add constraint historico_alunos_fk
foreign key (matricula)
references alunos (matricula)
on delete cascade;

Ateno Trata-se de um procedimento bastante recomendvel criar primeiro as


tabelas sem constraints e depois inclu-los via comando ALTER TABLE.
Isto desobriga uma ordem especfica na criao de tabelas, j que no
existiro chaves estrangeiras fazendo referncia a tabelas inexistentes.

2.4 - Excluso de Tabelas


Para apagar uma tabela e os constraints nela inseridos, deve-se utilizar o
comando drop table:
DROP TABLE [schema.]tabela [CASCADE CONSTRAINTS];

A tabela seguinte explica a sintaxe do comando:


Opes

Descrio

Schema

Representa o proprietrio da tabela. Quando omitido, assume-se


que a tabela pertence ao usurio corrente. Para que seja possvel
apagar tabelas de outros, permisses especiais devem ser
conferidas.

Tabela

Nome da tabela a ser eliminada.

cascade
constraints

Elimina todas as restries presentes em outras tabelas que faam


refe-rncia tabela que est sendo eliminada. Os dados nas
tabelas relacio-nadas, cujos constraints foram eliminados, no
desaparecem.
Caso esta clusula seja omitida e existirem referncias, o OracleServer re-tornar um erro.

Cuidado Ao destruir uma tabela, todos os dados que nela constarem tambm
Oracle 9i Fundamental

37

sero eliminados.

Exemplo: Excluso mal-sucedida


Por que a eliminao seguinte provocaria um erro?
drop table cursos;

Como esse comando poderia ser alterado para que a eliminao tivesse
sucesso? Somente um comando bastaria?

2.5 - Insero de Dados


Uma vez criadas as tabelas, podem-se inserir dados nelas. Geralmente, isto
feito via aplicativos produzidos por ferramentas front-end, tais como:
Oracle Forms, MS-Visual Basic ou Borland Delphi. Entretanto, tambm
podem-se alimentar tabelas via SQL.
Em seguida mostra-se a sintaxe simplificada do comando insert,
responsvel pela insero de dados:
INSERT INTO [schema.]tabela
coluna1, coluna2, colunaN
VALUES
(valor1, valor2, valorN);

Cada comando insert eqivale insero de um registro, portanto devem-se


levar em considerao os campos cujo preenchimento obrigatrio (chaves
primrias e campos com restrio not null sem clusula default).
Futuramente ser visto como inserir vrios registros de uma vez.

Primeiro exemplo: Insero de um curso


insert into cursos
(cod_curso, nome_curso, carga_horaria, preco)
values
(1, 'Introduo Lgica de Programao', 32, 800);

Dica

A comprovao de que o dado realmente est na tabela ficar para o


prximo captulo. Por enquanto, use o comando seguinte:
select * from cursos;

Ele mostra todos os registros da tabela Cursos.


Ateno Logo aps o comando insert, os dados ainda no foram "gravados" em
definitivo. Em breve, voc aprender o conceito de transao que
explicar melhor essa gravao. Por enquanto, aps alguns inserts,
emita o comando:
Oracle 9i Fundamental

38

commit;

E os dados sero definitivamente gravados.

Segundo exemplo: Insero de um aluno com valores defaults


insert into alunos (matricula, nome_aluno)
values (11, 'lvaro Lepus');

Note que os campos cidade_aluno e uf foram omitidos, j que seus valores


predeterminados so Rio de Janeiro e RJ respectivamente.
Uma alternativa poderia ser:
insert into alunos (matricula, nome_aluno, cidade_aluno)
values (12, 'Thiago Eridanus', default);

Terceiro exemplo: Insero simplificada de um histrico


insert into historico values (1, 1, 7.5);

Este comando traria problemas caso houvesse colunas que no estivessem


na "ponta", com clusula default.
O que ocorreria se em vez do primeiro 1 estivesse escrito 1111?

EXERCCIOS
Aos itens 1 a 4 responda objetivamente.
1. Quando deve-se utilizar um constraint em nvel de tabela?
2. Faz sentido um constraint ser null e unique?
3. Qual erro teramos no comando seguinte?
create table instrutores
(cod_instrutor
number(3)
constraint primary key,
nome_instrutor
varchar2(30) constraint not null,
tel_instrutor
varchar2(10),
admissao
date default sysdate);

4. O comando seguinte funciona?


create table instrutores
(cod_instrutor
number(3) primary key,
nome_instrutor
varchar2(30) not null,
tel_instrutor
varchar2(10),
admissao
date default sysdate);

Qual seu inconveniente?


5. Conecte-se ao Oracle Server e crie a tabela Cursos cuja estrutura
mostrada em seguida:
Oracle 9i Fundamental

39

Campo

Tipo

Observaes

Cod_curso

number(3)

chave primria

Nome_curso

varchar2(60)

no nulo, nico

Carga_horaria

number (3)

Preco

number(7,2)

valor default = 0

6. Comprove a criao da tabela.


Utilize o comando Describe no SQL*Plus Worksheet.
Por que ele no termina com ponto-e-vrgula?

7. Acrescente mais uma coluna:


Pre_requisito

Number(3)

8. Impea cargas horrias negativas.


9. Insira o curso:
COD_CURSO NOME_CURSO CARGA_HORARIA PRECO PRE_REQUISITO
1
Curso1
32
800
(nulo)

10. Desabilite a restrio do exerccio 8.


11. Insira o curso:
COD_CURSO NOME_CURSO CARGA_HORARIA PRECO PRE_REQUISITO
2
C2
-1
90
(nulo)

1. Tente habilitar a restrio.


Explique a razo do fracasso.
12. Alm dos estados enable ou disable, um constraint ainda pode estar
como validate ou novalidate.
Enquanto o estado validate assegura que os dados j presentes esto
de acordo com a restrio, o novalidate permite que existam "furos".
Como exerccio, teste as quatro combinaes possveis (enable,
validate, enable, novalidate, etc.) e anote suas concluses, isto ,
quais seriam as conseqncias de um constraint estar enable,
novalidate?
13. Execute o script Monta_Tabelas.sql.
14. Confirme a criao das tabelas.
Em vez de emitir vrios DESCRIBEs, utilize o comando:
select * from cat;

Oracle 9i Fundamental

40

REFERNCIA RPIDA
Tarefa

Como fazer

Conectar-se ao Oracle
Server

Ative o SQL*Plus Worksheet e fornea um username


e password vlidos. Se o Servidor no for a prpria
m-quina, deve-se digitar tambm o servio. Em
caso de pro-blemas, contacte o DBA.

Mostrar usurio corrente

Comando SQL*Plus Worksheet: show user.

Criar tabela

Utilize o comando create table. Veja sintaxe e exemplos em 2.2.

Mostrar estrutura de uma


tabela

Comando SQL*Plus Worksheet: describe. Pode ser


abreviado como desc.

Listar tabelas criadas

select * from cat;

Listar constraints de uma


tabela qualquer, digamos,
cursos

select constraint_name
from user_constraints
where table_name = 'CURSOS';

Executar comandos que


constem em um script

Comando SQL*Plus Worksheet: start. Pode ser


abreviado como @.

Alterar uma tabela

Utilize o comando
exemplos em 2.3.

alter

table.

Veja

sintaxe

Excluir uma tabela

Utilize o comando
exemplos em 2.4.

drop

table.

Veja

sintaxe

Inserir uma linha em uma


tabela

Utilize o comando insert. Veja sintaxe e exemplos em


2.5.

Listar registros de uma


tabela qualquer, digamos
Alunos

Select * from alunos;

Oracle 9i Fundamental

41

Captulo 3 SELEO DE DADOS


OBJETIVOS

Realizar consultas aos dados previamente armazenados em uma


ou mais tabelas;
Mostrar dados com filtros por coluna e linha;
Mostrar dados ordenados segundo algum critrio;
Mostrar dados que estejam em tabelas diferentes;
Utilizar operadores relacionais, aritmticos, lgicos ou de
conjuntos;
Exibir dados transformados por funes embutidas do SQL;
Criar consolidaes;
Recorrer documentao do Oracle;
Pesquisar metadados.

ARQUIVOS NECESSRIOS

Monta_Cursos_Velhos.sql;
Cria_Alimenta_Historico.sql;
Saida_Nao_Formatada.sql.

PR-REQUISITOS

Conectar-se ao Servidor via SQL*Plus Worksheet;


Criar tabelas (comando CREATE TABLE);
Alterar a estrutura de tabelas previamente criadas (comando ALTER
TABLE);
Eliminar tabelas (comando DROP TABLE);
Inserir dados em tabelas.

TEORIA
3.1 - Selees Simples
Com tabelas criadas e devidamente alimentadas, pode-se realizar uma srie
de consultas base de dados. Os resultados podem ser desde lista simples

Oracle 9i Fundamental

42

de registros de uma tabela, at uma complexa interseo envolvendo vrios


campos de tabelas diferentes e com critrios diversos. Por exemplo:
Fornea os cursos disponveis;
Informe quais alunos foram matriculados em turmas de Oracle;
Calcule a mdia paga a instrutores em agosto; etc.
Consultas respondem a questes cruciais. Na verdade, cria-se um Banco
de Dados para que "perguntas" possam ser respondidas.
Em qualquer consulta utiliza-se o comando SQL select cuja sintaxe
simplificada mostrada em seguida:
SELECT [DISTINCT] {*, colunas [alias], expresses, funes, ...}
FROM {tabelas [alias],}
[WHERE condio]
[GROUP BY colunas]
[HAVING condio]
[ORDER BY colunas [ASC | DESC]];

Os colchetes representam clusulas opcionais, as chaves indicam que os


elementos podem aparecer repetidas vezes e a barra vertical indica que as
opes so mutuamente exclusivas (ou uma ou outra).
A tabela seguinte explica a sintaxe do comando:
Opes

Descrio

Distinct

Informa que os valores no sero mostrados repetidas vezes. Isto


ocorre, por exemplo, ao listar tabelas que nasceram de
relacionamentos (HISTORICO) ou aquelas que possuam valores
repetidos (TURMAS ter vrios cdigos de cursos iguais).

Indica que todos os campos da tabela especificada na clusula from


devem ser mostrados.

Alias

Trata-se de um "apelido" para uma tabela, campo ou expresso.


Usado para melhorar a legibilidade do comando.

Expresses

Expresses aritmticas que envolvem um ou mais campos das


tabelas citadas na clusula from. No Banco de Dados do estudo do
caso sero usadas expresses para revelar quanto foi pago a um
instrutor em um curso (preco_hora_instrutor * carga_horaria).

Funes

Funes embutidas do SQL. Mais adiante, ainda neste captulo,


sero mostrados vrios exemplos.

Tabelas

Uma ou mais tabelas cujas colunas deseja-se pesquisar.

where
condio

Especifica um filtro que deve ser aplicado sada. Em vez de


mostrar todos os registros das tabelas citadas, mostram-se apenas
aqueles que obedeam a determinadas regras.

group by
colunas

Indica que o resultado final ser agrupado


especificadas. Cria uma espcie de "quebra".

having
condio

Limita os grupos a serem mostrados. Semelhante clusula where,


mas aplicando filtros a colunas que tenham valores agrupados.

Oracle 9i Fundamental

pelas

colunas

43

Opes

Descrio

Order by

Determina a ordenao que ser aplicada ao resultado da consulta.


Ela pode ser crescente (asc) ou descendente (desc).

Primeiro exemplo: Mostra os registros da tabela instrutores8


select * from instrutores;
COD_INSTRUTOR
------------1
2
3
4
5
6
7
8
9
10

NOME_INSTRUTOR
------------------------Maria Carolina Srio
Pedro Paulo Canopo
Augusto Lemos Vega
Mnica Silveira Capela
Almir Altair
Leonardo Guimares Rigel
Beatriz Bellatrix
Carlos Regulos
Joana Aldebaran
Matias Agena

TEL_INSTRU
---------344-8788
274-9018
722-1300
212-7938
220-6022

ADMISSAO
--------01-FEB-97
03-AUG-96
12-NOV-98
30-DEC-97
03-OCT-96
17-JUL-97
18-SEP-98
01-MAR-97
12-FEB-00
12-FEB-00

Segundo exemplo: Mostra nome e carga horria da tabela cursos


Esta consulta no mostra todos os campos da tabela CURSOS e sim
apenas dois:
select nome_curso, carga_horaria from cursos;
NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Introduo Lgica de Programao
32
Fundamentos da Modelagem de Dados
40
Redes I
Introduo a Sistemas Operacionais
Anlise Orientada por Objetos
Delphi: Recursos Bsicos
24
Delphi: Acesso a Bancos de Dados
24
Oracle: SQLPlus e SQL
32
Oracle: PL/SQL
24
Redes II
10 linhas selecionadas.

Observao
Os campos nome_curso e carga_horaria podem ser mostrados de forma concatenada:
... nome_curso || ' com carga horria: ' || carga_horaria

E, com um alias, o resultado seria este:


CURSOS

Os exemplos
sucesso via
executado.

deste captulo presumem que realizou-se uma conexo


SQL*Plus Worksheet e que o Script Monta_Tabelas.sql

Oracle 9i Fundamental

com
foi

44

-------------------------------------------------------Introduo Lgica de Programao com carga horria: 32


Fundamentos da Modelagem de Dados com carga horria: 40
Redes I com carga horria:
Introduo a Sistemas Operacionais com carga horria:
Anlise Orientada por Objetos com carga horria:
Delphi: Recursos Bsicos com carga horria: 24
Delphi: Acesso a Bancos de Dados com carga horria: 24
Oracle: SQLPlus e SQL com carga horria: 32
Oracle: PL/SQL com carga horria: 24
Redes II com carga horria:

Note a presena dos campos com contedo nulo. Este problema


contornado com a utilizao da funo embutida de converso nvl.

3.2 - Ordenaes e Filtros


O resultado de um comando select, caso no se informe algo diferente,
mostra os registros na ordem em que foram inseridos na tabela. Alm de
mudar a ordenao, tambm possvel especificar condies que filtrem os
dados.

Primeiro exemplo: Cursos ordenados decrescentemente por carga


horria
select nome_curso, carga_horaria
from cursos
order by carga_horaria desc;
NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Redes I
Introduo a Sistemas Operacionais
Anlise Orientada por Objetos
Redes II
Fundamentos da Modelagem de Dados
40
Introduo Lgica de Programao
32
Oracle: SQLPlus e SQL
32
Delphi: Recursos Bsicos
24
Oracle: PL/SQL
24
Delphi: Acesso a Bancos de Dados
24

Oracle 9i Fundamental

45

A clusula order by pode ser substituda por:


order by 2 desc;

E j se sabe que a ordenao dar-se-ia pela segunda coluna especificada


(carga_horaria).

Observe que valores nulos so considerados maiores que qualquer nmero.

Segundo exemplo: Mostra a lista anterior, mas para cursos que


durem mais de 30 horas
select nome_curso, carga_horaria
from cursos
where carga_horaria > 30
order by carga_horaria desc;
NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Fundamentos da Modelagem de Dados
40
Introduo Lgica de Programao
32
Oracle: SQLPlus e SQL
32

Note que a ordem das clusulas (primeiro where, depois order by) deve ser
obedecida.
A clusula where apresenta um operador relacional. Como esse (>) existem
outros:
Operador

Descrio

Igual

<>

Diferente

>

Maior

<

Menor

>=

Maior
igual

ou

<=

Menor
igual

ou

Alm dos operadores relacionais, existem os aritmticos (+, -, *, /), lgicos


(and, or, not) e miscelnea:
Between

Entre um valor e outro, inclusive.

Like

Usado para pesquisar subcadeias de caracteres.

In

Pertence a algum conjunto. J foi utilizado na definio


do constraint CHECK e ser novamente usado mais adiante,
no captulo que trata sobre Subqueries.

Terceiro exemplo: Uso do operador between


Oracle 9i Fundamental

46

Como j mencionado, esse operador revela um intervalo em que os limites


inferior e superior so includos:
select nome_curso, carga_horaria
from cursos
where carga_horaria between 30 and 40
order by carga_horaria desc;

A clusula where tambm apresenta um operador lgico. Como esse (and),


operador restritivo eqivalendo a uma interseo, existem outros:
Operador

Descrio

Or

Operador
unio.

Not

Negao.

Is null

Verifica se o campo nulo. Cuidado: 1


+ nulo = nulo.

associativo.

Eqivale

uma

Note que a expresso restritiva poderia tambm ter sido escrita como:
where carga_horaria >= 30 and carga_horaria <= 40

Quarto exemplo: Uso do operador like


O operador like tem a funo de encontrar uma cadeia de caracteres em um
campo. Sua sintaxe :
Sintaxe

Descrio

Like "%cadeia"

Encontra valores que contenham a cadeia precedida por


nenhum ou vrios caracteres.

Like "_cadeia%"

Localiza campos em que a cadeia precedida por apenas um


caractere e sucedida por nenhum ou vrios.

Like "cadeia%"

Encontra valores que contenham a cadeia sucedida por


nenhum ou vrios caracteres.

Deve-se observar que o texto entre aspas simples deve coincidir exatamente
com a cadeia procurada, ou seja, maisculas e minsculas so
consideradas.
O exemplo seguinte mostra os cursos cujos nomes comecem pela cadeia
Oracle ou Delphi:
select nome_curso
from cursos
where nome_curso like 'Oracle%' or nome_curso like 'Delphi%';
NOME_CURSO
----------------------------------Delphi: Acesso a Bancos de Dados
Delphi: Recursos Bsicos
Oracle: PL/SQL
Oracle: SQLPlus e SQL

Oracle 9i Fundamental

47

Quinto exemplo: Mostrando campos com contedo nulo


Listando os registros da tabela CURSOS, pode-se constatar que h vrias
linhas cujo campo carga_horaria est vazio. Isto pode ser facilmente
destacvel utilizando o comando seguinte:
select * from cursos where carga_horaria is null;

H muita confuso quanto ao real sentido da palavra nulo. Muitas vezes


pensa-se que Zero ou uma cadeia com brancos representam valores nulos,
quando, na verdade, nulo representa a ausncia de contedo (Zero e Cadeia
com brancos so contedos).

3.3 - Visualizando Dados em Tabelas Diferentes


Devido ao carter relacional dos Bancos criados em Oracle,
freqentemente devem ser consultadas informaes que esto em tabelas
distintas. Por exemplo, caso fosse necessrio listar turmas com respectivos
nomes de instrutores: o primeiro dado est em TURMAS e o segundo, em
INSTRUTORES.
Denomina-se Join o relacionamento entre duas tabelas. Existem quatro
tipos:
2. Equijoin
3. OuterJoin
4. Non-Equijoin
5. SelfJoin

3.3.1 - Relacionamento EquiJoin


O mais usual: rene campos iguais de tabelas diferentes. Por exemplo:
unindo as tabelas TURMAS e INSTRUTORES, que tm em comum o campo
CodInstrutor, poderiam ser mostrados os nomes de instrutores e respectivas
salas em que ministraram cursos.
Imagine, por simplicidade, que a tabela INSTRUTORES possua apenas
dois campos e trs linhas:

Cod_instrutor

Nome_instrutor

Ambrsio

Lomncio

Zebedeu

E que a tabela TURMAS tivesse trs colunas e oito linhas:

Oracle 9i Fundamental

48

Cod_Turma Cod_Instrutor

Sala

Para mostrar, digamos, o nome do instrutor e a sala na qual ministrar o


curso, acontecem duas etapas. Na primeira, cria-se uma tabela contendo a
soma das colunas e o produto das linhas:
I.Cod_instrutor

I.Nome_instrutor

T.Cod_turma

T.Cod_instrutor

T.sala

Ambrsio

Ambrsio

Ambrsio

Ambrsio

Ambrsio

Ambrsio

Ambrsio

Ambrsio

Lomncio

Lomncio

Lomncio

Lomncio

Lomncio

Lomncio

Lomncio

Lomncio

Zebedeu

Zebedeu

Zebedeu

Zebedeu

Zebedeu

Zebedeu

Oracle 9i Fundamental

49

I.Cod_instrutor

I.Nome_instrutor

T.Cod_turma

T.Cod_instrutor

T.sala

Zebedeu

Zebedeu

As colunas so denominadas em duas partes: o indicativo da tabela (I ou T)


e o nome do campo.
Na segunda etapa so eliminadas as linhas em que a chave primria seja
diferente da chave estrangeira, isto , o cdigo de instrutor proveniente da
tabela INSTRUTORES seja diferente do cdigo de instrutor da tabela
TURMAS. Observe que a relao apresentada destaca as linhas que sero
preservadas.
Como era de se esperar, o resultado final ser constitudo de tantas linhas
quanto houver na tabela relacionada. E supondo que somente
desejssemos visualizar os campos nome_instrutor e sala, teramos:
I.Nome_instrutor

T.sala

Ambrsio

Lomncio

Lomncio

Lomncio

Zebedeu

Zebedeu

Zebedeu

Zebedeu

O que acabamos de ver foi um join do tipo mais comum: o equijoin. A


instruo ao Oracle que produziria lista sada com base nos dados das
tabelas TURMAS e INSTRUTORES, seria:
select cod_turma, nome_instrutor, sala
from instrutores, turmas
where instrutores.cod_instrutor=turmas.cod_instrutor;
COD_TURMA
--------1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

NOME_INSTRUTOR
SALA
------------------------------ --------Maria Carolina Srio
2
Pedro Paulo Canopo
5
Augusto Lemos Vega
4
Mnica Silveira Capela
4
Almir Altair
6
Leonardo Guimares Rigel
2
Leonardo Guimares Rigel
1
Carlos Regulos
8
Almir Altair
9
Pedro Paulo Canopo
3
Joana Aldebaran
5
Leonardo Guimares Rigel
2
Beatriz Bellatrix
2
Almir Altair
4
Maria Carolina Srio
9

Oracle 9i Fundamental

50

16
17
18
19
20

Beatriz Bellatrix
Joana Aldebaran
Almir Altair
Augusto Lemos Vega
Carlos Regulos

1
2
3
6
1

Uma simplificao usando aliases para tabelas:


select cod_turma, nome_instrutor, sala
from instrutores i, turmas t
where i.cod_instrutor=t.cod_instrutor;

A forma como escrito o ltimo comando segue o padro SQL-86. A


Ateno verso 9i permite que joins possam ser escritos seguindo o padro SQL92, mais claro e eficiente. Compare:
select cod_turma, nome_instrutor, sala
from instrutores i inner join turmas t using(cod_instrutor)

Nada impede que haja mais de duas tabelas:


select cod_turma, nome_curso, nome_instrutor
from instrutores i, cursos c, turmas t
where i.cod_instrutor = t.cod_instrutor
and c.cod_curso = t.cod_curso;
COD_TURMA
--------1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

NOME_CURSO
----------------------------------Introduo Lgica de Programao
Introduo Lgica de Programao
Fundamentos da Modelagem de Dados
Redes I
Redes I
Introduo Lgica de Programao
Delphi: Acesso a Bancos de Dados
Anlise Orientada por Objetos
Fundamentos da Modelagem de Dados
Introduo a Sistemas Operacionais
Oracle: SQLPlus e SQL
Delphi: Recursos Bsicos
Anlise Orientada por Objetos
Redes I
Introduo Lgica de Programao
Introduo a Sistemas Operacionais
Fundamentos da Modelagem de Dados
Oracle: SQLPlus e SQL
Delphi: Recursos Bsicos
Fundamentos da Modelagem de Dados

NOME_INSTRUTOR
-----------------------Maria Carolina Srio
Pedro Paulo Canopo
Augusto Lemos Vega
Mnica Silveira Capela
Almir Altair
Leonardo Guimares Rigel
Leonardo Guimares Rigel
Carlos Regulos
Almir Altair
Pedro Paulo Canopo
Joana Aldebaran
Leonardo Guimares Rigel
Beatriz Bellatrix
Almir Altair
Maria Carolina Srio
Beatriz Bellatrix
Joana Aldebaran
Almir Altair
Augusto Lemos Vega
Carlos Regulos

Nem que uma das tabelas envolvidas no possua campos mostrados:


select nome_aluno
from turmas t, historico h, alunos a
where t.cod_turma = h.cod_turma
and a.matricula = h.matricula
and t.cod_turma = 1
order by 1;
NOME_ALUNO
-----------------------------Carla Cassiopeia
...

Oracle 9i Fundamental

51

Zebedeu Silva Hydra


10 linhas selecionadas.

Para que o comando apresentado devolva dez linhas, deve-se previamente


alimentar a tabela HISTORICO com 100 linhas. Para isto execute o script
Cria_Alimenta_ Historico.sql e depois a rotina por ele criada:
exec AlimentaHistorico (10, 10);

No captulo 8 voc entender plenamente o que acabou de fazer.

3.3.2 - Relacionamento OuterJoin


Alm de mostrar registros cujos campos em comum estejam presentes nas
duas tabelas, ainda mostra os que faltam. Se no exemplo anterior foram
mostrados apenas os instrutores que ministraram cursos, um
relacionamento OuterJoin mostrar tambm aqueles que no ministraram
cursos:
select cod_turma, nome_instrutor, sala
from instrutores i, turmas t
where i.cod_instrutor=t.cod_instrutor(+)
order by 1;
COD_TURMA
--------1
...
20

NOME_INSTRUTOR
SALA
------------------------- ----Maria Carolina Srio
2
Carlos Regulos
Matias Agena

21 linhas selecionadas.

Perceba o tratamento dispensado ao instrutor desturmado: faltam-lhe


cdigo da turma e sala.
Deve-se notar que o operador de adio est junto ao campo em cuja tabela
"faltam" registros, isto , a tabela relacionada. A clusula where seguinte
anloga:
where t.cod_instrutor(+) = i.cod_instrutor

Ateno Seguindo o padro SQL-92, agora admitido pela verso 9i, teramos:
select cod_turma, nome_instrutor, sala
from instrutores i left outer join turmas t using(cod_instrutor)
order by 1;

3.3.3 - Relacionamento NonEquiJoin


Usado quando for necessrio reunir campos de tabelas que no tenham
nada em comum. Suponha que exista uma tabela, Faixas, cujos registros
fossem os listados em seguida:
Oracle 9i Fundamental

52

Descri
o

Mnim
o

Mxim
o

Barato

3.99

Mdio

4.00

6.99

Caro

7.00

10.00

O comando seguinte classificaria os preos hora de instrutores na tabela de


turmas, segundo sua faixa de preo:
select nome_instrutor, cod_turma, descricao
from instrutores i, turmas t, faixas f
where i.cod_instrutor=t.cod_instrutor and preco_hora_instrutor between minimo and
maximo;

Deve ser observado o operador relacional between. Alis, pode-se utilizar


qualquer operador relacional, exceto = (igual).

3.3.4 - Relacionamento SelfJoin


til quando houver dois campos em uma mesma tabela que sejam do
mesmo tipo. A relao seguinte mostra o pr-requisito de cada curso que
possua um:
select p.nome_curso curso, c.nome_curso "PR-REQUISITO"
from cursos c, cursos p
where p.pre_requisito = c.cod_curso;
CURSO
--------------------------------Delphi: Recursos Bsicos
Delphi: Acesso a Bancos de Dados
Oracle: SQLPlus e SQL
Oracle: PL/SQL
Redes II

PR-REQUISITO
-----------------------------------Introduo Lgica de Programao
Introduo Lgica de Programao
Fundamentos da Modelagem de Dados
Oracle: SQL*Plus Worksheet e SQL
Redes I

Pelo padro SQL-92:


Ateno select p.nome_curso curso, c.nome_curso "PR-REQUISITO"
from cursos c inner join cursos p on p.pre_requisito = c.cod_curso;

Note que no pudemos utilizar a palavra reservada USING, pois os


campos responsveis pelo join tm nomes diferentes.

3.4 - Expresses Calculadas


Muitas vezes preciso incluir em consultas um resultado aritmtico
referente a toda uma tabela, ou realizar uma quebra por campos
especficos. Isto possvel por meio de algumas funes e, opcionalmente,
por intermdio das clusulas group by (efetuar quebras por campos) ou
having (efetuar filtros segundo o resultado de funes).

Oracle 9i Fundamental

53

Por funo entende-se uma ferramenta interna do SQL que agiliza os


clculos. Existem vrias categorias, das quais destacam-se cinco:
Tipo

Descrio

1. Caracteres

Transformam letras em maisculas ou minsculas,


concatenam cadeias, acham subcadeias em outras maiores,
fornecem tamanhos de cadeias.

2. Datas

Informam perodos entre datas ou a partir de uma data


especfica.

3. Numricas

Arredondam, truncam ou retornam o resto da diviso entre


dois nme-ros.

4. Converso
de Dados

Converte valores em Data, Nmero e Caractere. Neste grupo,


tambm encontra-se a funo especial CASE.

5. Grupo

As funes das categorias anteriores fornecem um resultado


por linha. As funes de grupo geram resultados por grupos
de linhas. Por exemplo: selecione a mdia de Custos Unitrios
por Categoria.

A seguir, sero mostrados alguns exemplos de funes pertencentes s


categorias citadas.

3.4.1 - Funes de Caracteres


Por "cadeia" entende-se um grupo de caracteres que pode at pertencer a
uma coluna de tabela.
Funo

Descrio

lower (cadeia)

Converte caracteres alfabticos em letras minsculas.

upper (cadeia)

Converte caracteres alfabticos em letras maisculas. Ela


muito utilizada, pois maisculas e minsculas fazem
diferena em clusulas where.

initcap (cadeia)

Converte o primeiro caractere de cada


maiscula e o restante em minsculas.

Concat
(cadeia1, cadeia2)

Concatena duas colunas ou cadeias de


Semelhante ao operador de concatenao "||".

substr (cadeia,
posio, tamanho)

Extrai uma subcadeia de outra cadeia ou coluna.

length (cadeia)

Retorna a quantidade de caracteres da coluna ou expresso


forne-cida.

Lpad (campo, n, c)

Preenche esquerda com o caractere c at o tamanho no


campo especificado.

Replace (cadeia,
velho, novo)

Em cadeia, troca velho por novo. Caso este ltimo seja


omitido, simplesmente elimina velho em cadeia.

Oracle 9i Fundamental

palavra

em

caracteres.

54

Exemplo
select nome_curso, lpad(preco,11, '*') Custo
from cursos
where upper(nome_curso) like 'ORACLE%'
or upper(nome_curso) like 'DELPHI%';
NOME_CURSO
----------------------------------Delphi: Recursos Bsicos
Delphi: Acesso a Bancos de Dados
Oracle: SQLPlus e SQL
Oracle: PL/SQL

CUSTO
----------********400
********400
********750
********750

3.4.2 - Funes de Datas


O tipo DATE do Oracle armazena internamente sculo, ano, ms, dia, hora,
minuto e segundo. O formato default DD-MMM-AA. Em seguida esto
algumas funes de data:

Funo

Descrio

add_months (data, n)

Adiciona n meses data especificada.

months_between
data1,data2)

Retorna o nmero de meses entre duas datas.

next_day (data,
'dia_semana')

Retorna uma data, aps a data especificada, em que o dia


da se-mana seja igual a dia_semana. Os nomes
dependero do idioma utilizado na instalao do Oracle
Server. Assim, se for o ingls, os dias da semana sero:
SUNDAY, MONDAY, TUESDAY, etc.

last_day (data)

Retorna a data do ltimo dia do ms em que se encontra


a varivel data.

round (data, formato)

Arredonda a data especificada para o primeiro ou ltimo


dia do ms (quando formato for 'MONTH') ou do ano
(quando formato for 'YEAR').

trunc (data, formato)

Trunca a data especificada para o primeiro ou ltimo dia


do ms (quando formato for 'MONTH') ou do ano (quando
formato for 'YEAR').

Sysdate

Retorna a data corrente do Servidor que abriga o Banco


ao qual est-se conectado.

Dbtimezone

Informa o fuso horrio em que se encontra o Banco. O


resul-tado d-se em horas em que valores negativos
indicam fusos a oeste de Londres e os positivos leste. O
fuso de um Banco pode ser alterado em sua criao ou
via comando ALTER DATABASE9.

Para que a mudana surta efeito, deve-se reiniciar o Banco. Mais detalhes
no Captulo 19.

Oracle 9i Fundamental

55

Funo

Descrio

Sessiontimezone

Informa o fuso horrio em que se encontra a sesso.


Valem as observaes quanto a leste/oeste. O fuso de
uma sesso pode ser alterado via comando ALTER
SESSION.

Current_Date

Retorna a data corrente da sesso. Leva em considerao


mudanas realizadas via ALTER SESSION.

Extract

Permite extrair um campo de uma data (ano, ms, hora,


etc.).

O Oracle possui uma tabela, de uso comum a todos os usurios,


denominada DUAL, que contm uma nica coluna, dummy, e uma nica
linha, com o valor "X". Esta tabela utilizada quando se deseja retornar um
valor em uma nica ocorrncia, como o de uma constante ou expresso
que no seja derivada de uma tabela de dados do usurio. No se deve
esquecer, entretanto, que cada acesso tabela DUAL provoca uma
chamada ao Servidor.

Primeiro exemplo: Mostrando a data corrente e a do prximo


domingo
select sysdate hoje, next_day(sysdate,'domingo') Domingo from dual;
HOJE
DOMINGO
-------- -------21/01/02 27/01/02

Segundo exemplo: Mudanas no fuso horrio da sesso


alter session set time_zone = 'africa/cairo';
select sessiontimezone Fuso, to_char(current_date,'hh:mm:ss') Hora_Fuso,
to_char(sysdate,'hh:mm:ss') Hora_Servidor from dual;
FUSO
-----Africa/Cairo

HORA_FUS
-------10:01:46

HORA_SER
-------06:01:46

Observao
A funo TO_CHAR (explicada no tem 3.4.4) permite formatar campos
data.

Terceiro exemplo: Exibindo anos de contratao de instrutores


select nome_instrutor, extract(year from admissao) Ano from instrutores
order by 2 desc
NOME_INSTRUTOR
ANO
------------------------------ ---------Joana Aldebaran
2002

Oracle 9i Fundamental

56

Matias Agena
Augusto Lemos Vega
Beatriz Bellatrix
Maria Carolina Sirio
Mnica Silveira Capela
Carlos Regulos
Leonardo Guimares Rigel
Pedro Paulo Canopo
Almir Altair

2002
1998
1998
1997
1997
1997
1997
1996
1996

3.4.3 - Funes Numricas


Funo

Descrio

round (coluna,d)

Arredonda o valor ou coluna especificada, em que d indica o


nmero de casas decimais desejado. Se d for negativo,
significa que o valor esquerda do ponto decimal ser
arredondado.

trunc (coluna,d)

Trunca o valor ou coluna especificada, em que d indica o


nmero de casas decimais desejado. Se d for negativo,
significa que o valor esquerda do ponto decimal ser
truncado.

mod (a,b)

Retorna o resto da diviso de a por b, em que a e b podem ser


constantes, colunas ou expresses.

power (n1, n2)

Calcula n1 elevado a n2.


Por exemplo: select power(3,2) from dual; retornaria 9.

sqrt (n)

Calcula a raiz quadrada.

ceil(num)

Arredonda para cima.

floor (num)

Arredonda para baixo.

Exemplo
select nome_curso, preco*1.33 preco, floor(1.33*preco) Baixo, ceil(1.33*preco) Alto
from cursos
where upper(nome_curso) like 'ORACLE%';
NOME_CURSO
PRECO
BAIXO
ALTO
------------------------ --------- --------- --------Oracle: SQLPlus e SQL
997.5
997
998
Oracle: PL/SQL
997.5
997
998

3.4.4 - Funes de Converso de Dados


Funo

Descrio

to_char(nmero ou data,
'formato')

Converte um campo numrico ou data em uma cadeia de


carac-teres do tipo varchar2, com o formato definido pela
varivel formato.

to_number(char)

Converte uma cadeia de caracteres numrica em nmero


inteiro.
Oracle 9i Fundamental

57

Funo

Descrio

to_date(char,['formato'])

Converte uma cadeia de caracteres, especificando uma


data, no tipo date, de acordo com a varivel formato (se
omitida, assumido 'DD-MMM-AA').

nvl (coluna, valor)

Converte um null que encontre na coluna em um valor


especi-ficado.

Case

Realiza processamento condicional, isto , dependendo da


entra-da, pode retornar um ou outro valor.

Em seguida, descrevem-se os formatos para campos de data da funo


to_char:
Formato

Descrio

CC

Sculo.

YYYY, YYY, YY

Ano completo ou os ltimos 3 ou 2


dgitos.

Trimestre (quarta parte do ano).

MM

Ms com dois dgitos.

MONTH

Nome do ms (9 caracteres).

MON

Nome do ms com trs letras.

RM

Ms em algarismo romano.

WW ou W

Semana do ano ou do ms.

DDD ou DD ou D

Dia do ano, ou do ms, ou da semana.

DAY ou DY

Nome do dia com 9 caracteres ou 3


caracteres.

AM ou PM

Indicador meridiano.

HH ou HH12 ou HH24

Hora do dia, ou hora (1-12), ou hora (023).

MI

Minuto (0-59).

SS ou SSSSS

Segundo (0-59) ou
86399).

desde zero hora (0-

Primeiro exemplo
No exemplo seguinte so exibidas a data e a hora correntes, e outra
data/hora, 28 horas aps a primeira.
select to_char(sysdate,'dd/mm/yy hh24:mi') "hoje",
to_char(sysdate+28/24, 'dd/mm/yy hh24:mi') "amanh + 4 horas"
from dual;
hoje
amanh + 4 hor
-------------- -------------21/01/02 18:41 22/01/02 22:41

Oracle 9i Fundamental

58

Em seguida descrevem-se os formatos para campos numricos da funo


to_char para o nmero 1234:
Formato

Exemplo

Resultado

Observaes

999999

1234

Foram utilizadas seis casas.

099999

001234

idem

$999999

$1234

999999.
99

1234.00

999,999

1,234

MI

999999
MI

1234-

Somente mostra o operador de


subtrao direita do nmero para
valores negativos.

Segundo exemplo
select nome_curso, to_char(preco, '9,999.99') custo from cursos;
NOME_CURSO
CUSTO
---------------------------------------- --------Introduo Lgica de Programao
800.00
Fundamentos da Modelagem de Dados
950.00
Redes I
.00
Introduo a Sistemas Operacionais
.00
Anlise Orientada por Objetos
.00
Delphi: Recursos Bsicos
400.00
Delphi: Acesso a Bancos de Dados
400.00
Oracle: SQL*Plus Worksheet e SQL
750.00
Oracle: PL/SQL
750.00
Redes II
.00
10 linhas selecionadas.

Terceiro exemplo: Funo nvl


select nome_curso, nvl(to_char(carga_horaria,99), 'Sem carga horria') "Carga
Horria" from cursos;
NOME_CURSO
---------------------------------------Introduo Lgica de Programao
Fundamentos da Modelagem de Dados
Redes I
Introduo a Sistemas Operacionais
Anlise Orientada por Objetos
Delphi: Recursos Bsicos
Delphi: Acesso a Bancos de Dados
Oracle: SQLPlus e SQL
Oracle: PL/SQL
Redes II

Carga Horria
----------------32
40
Sem carga horria
Sem carga horria
Sem carga horria
24
24
32
24
Sem carga horria

Quarto exemplo: to_date


Oracle 9i Fundamental

59

select * from instrutores where admissao >


to_date('31-1-1998', 'dd-mm-yyyy');
COD_INSTRUTOR
------------3
7
9
10

NOME_INSTRUTOR
TEL_INSTRU ADMISSAO
------------------------------ ---------- -------Augusto Lemos Vega
722-1300
12/11/98
Beatriz Bellatrix
18/09/98
Joana Aldebaran
06/09/01
Matias Agena
06/09/01

Observe que a data fornecida na funo to_date deve obedecer ao formato


fornecido DD-MM-YYYY, a no ser que seja especificado outro:
select * from instrutores
where admissao > to_date('9-1-1998','mm-dd-yyyy');

3.4.4.1 - Processamento Condicional


A funo nvl recm-mostrada oferece, de certa forma, processamento
condicional. Entretanto, problemas mais complexos que exijam tratamento
de vrias hipteses requerem a utilizao da funo case. Ela pode ser
empregada de duas formas: testando vrias expresses lgicas ou
avaliando apenas uma.
O exemplo seguinte avalia duas expresses lgicas e ainda oferece uma
terceira possibilidade, quando as duas anteriores resultarem falsas:
select nome_curso Curso, preco,
case
when preco < 400 then 'Barato'
when preco > 900 then 'Caro'
else 'Mdio'
end Classificao
from cursos;

E a sada:
CURSO
PRECO CLASSI
---------------------------------------- ---------- -----Introduo Lgica de Programao
800 Mdio
Fundamentos da Modelagem de Dados
950 Caro
Redes I
0 Barato
Introduo a Sistemas Operacionais
0 Barato
Anlise Orientada por Objetos
0 Barato
Delphi: Recursos Bsicos
400 Mdio
Delphi: Acesso a Bancos de Dados
400 Mdio
Oracle: SQLPlus e SQL
750 Mdio
Oracle: PL/SQL
750 Mdio
Redes II
0 Barato
10 linhas selecionadas.

3.4.5 - Funes de Grupo


Finalmente, existem as funes de grupo que, ao contrrio das outras,
afetam vrias linhas. Nesta categoria esto aquelas que contam, calculam
mdia, acham um valor mximo, etc. Com estas funes freqentemente

Oracle 9i Fundamental

60

utilizam-se as clusulas group by e having para agrupar linhas e aplicar


filtros a grupos respectivamente.
Algumas representantes:
Funo

Descrio

avg (coluna)

Mdia dos valores de uma


coluna.

Count (coluna)

Total de linhas selecionadas.

max (coluna)

Valor mximo de uma coluna.

min (coluna)

Valor mnimo de uma coluna.

sum (coluna)

Soma dos
coluna.

valores

de

uma

Todas as funes desconsideram valores nulos, exceto count, quando o


argumento for *.

Primeiro exemplo: count


select count(carga_horaria) from cursos;
COUNT(CARGA_HORARIA)
-------------------6
select count(*) from cursos;
COUNT(*)
--------10

Segundo exemplo: sum


select nome_curso, sum(preco) Arrecadado
from cursos c inner join turmas t using(cod_curso)
inner join historico h using(cod_turma)
group by nome_curso
order by 2 desc;
NOME_CURSO
ARRECADADO
---------------------------------------- ---------Introduo Lgica de Programao
24000
Fundamentos da Modelagem de Dados
19000
Delphi: Acesso a Bancos de Dados
4000
Anlise Orientada por Objetos
0
Introduo a Sistemas Operacionais
0
Redes I
0
6 rows selected.

Perceba que qualquer coluna no especificada na clusula group by deve


constar associada a uma funo de grupo.

Terceiro exemplo: Limitando valores


Oracle 9i Fundamental

61

select nome_curso, sum(preco) Arrecadado


from cursos c inner join turmas t using(cod_curso)
inner join historico h using(cod_turma)
group by nome_curso
having sum(preco) > 10000
order by 2 desc;
NOME_CURSO
ARRECADADO
---------------------------------------- ---------Introduo Lgica de Programao
24000
Fundamentos da Modelagem de Dados
19000

Em caso de dvidas, deve-se recorrer documentao Oracle instalada ou,


melhor, na Internet. Por exemplo, supondo a necessidade de localizar mais
detalhes sobre a clusula group by, deve-se fazer o seguinte10:
Acesse o site http://technet.oracle.com. Se voc ainda no for
usurio cadastrado, registre-se aps clicar em Membership;
Uma vez cadastrado, de volta pgina inicial, clique em
Documentation;
Dentre os quatro grupos exibidos, selecione Oracle 9i Database;
Neste ponto voc deve selecionar a documentao especfica do seu
Sistema Operacional, ou ativar a genrica clicando em HTML ou PDF
sob General Documentation;
Agora h vrios caminhos possveis. Por exemplo, voc poderia clicar em
books;
Surgir uma lista de "livros". O assunto que estamos procurando est
no livro SQL Reference, como, alis, a grande maioria dos assuntos
tratados nos captulos um a sete. Sendo assim, localize o tal livro e
clique em Search;
Digite group by. Para otimizar a busca, selecione Only Examples na
Caixa de Combinao Display Topics. Sero mostrados vrios
tpicos. Localize GROUP BY Examples NOWAIT | WAIT.

3.5 - Operadores de Conjunto


Comumente uma tabela vista como um conjunto. Inclusive, muito do
Modelo Relacional foi extrado da teoria de conjuntos. Sendo assim, possvel
relacionar dados em tabelas diferentes por meio dos operadores de unio,
interseo e diferena.
Os operadores so:

10

Operador

Descrio

Union

Retorna a unio entre dois conjuntos de dados com


estruturas semelhantes.

Leve em considerao que pginas de Internet so entidades volteis, portanto


sujeitas a mudanas sem prvio aviso. O roteiro ora descrito foi executado com
sucesso em janeiro de 2002.

Oracle 9i Fundamental

62

Operador

Descrio

Intersect

Retorna os dados que so comuns a dois conjuntos de


dados.

Minus

Representa o que um conjunto tem e ou outro no.

Para os exemplos seguintes, suponha que tenha sido criada uma tabela de
cursos descontinuada11:
select cod_curso, nome_curso, carga_horaria from cursos_velhos;
COD_CURSO
--------101
102
103
104
105
106
107
108
109
110

NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Windows 3.1: Recursos Bsicos
16
Windows 3.1: Recursos Avanados
16
Word 2.0: Recursos Bsicos
Word 2.0: Recursos Avanados
Excel 4.0: Recursos Bsicos
Excel 4.0: Recursos Avanados
Access 1.0: Recursos Avanados
24
Corel Draw 3.0
24
Lotus 1-2-3 for Windows
16
Delphi: Recursos Bsicos
24

Primeiro exemplo: Mostrar os cursos bsicos (novos e velhos) sem


repetio

select nome_curso, carga_horaria from cursos


where upper(nome_curso) like '%BSICOS%'
union
select nome_curso, carga_horaria from cursos_velhos
where upper(nome_curso) like '%BSICOS%'
order by 1;
NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Delphi: Recursos Bsicos
24
Excel 4.0: Recursos Bsicos
Windows 3.1: Recursos Bsicos
16
Word 2.0: Recursos Bsicos

Observe que as tabelas que esto sendo "unidas" devem ter a mesma
estrutura.

Segundo exemplo: Mostrar os cursos bsicos (novos e velhos) com


repetio
select nome_curso, carga_horaria from cursos
where upper(nome_curso) like '%BSICOS%'
union all
select nome_curso, carga_horaria from cursos_velhos
where upper(nome_curso) like '%BSICOS%'
order by 1;
11

A Tabela cursos_velhos
Monta_Cursos_Velhos.SQL.

pode

ser

montada

alimentada

Oracle 9i Fundamental

partir

do

script

63

NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Delphi: Recursos Bsicos
24
Delphi: Recursos Bsicos
24
Excel 4.0: Recursos Bsicos
Windows 3.1: Recursos Bsicos
16
Word 2.0: Recursos Bsicos

Terceiro exemplo: Mostrar os cursos bsicos (novos e velhos)


comuns s tabelas
select nome_curso, carga_horaria from cursos
where upper(nome_curso) like '%BSICOS%'
intersect
select nome_curso, carga_horaria from cursos_velhos
where upper(nome_curso) like '%BSICOS%';
NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Delphi: Recursos Bsicos
24

Quarto exemplo: Mostrar os cursos velhos que no esto na


primeira tabela
select nome_curso, carga_horaria from cursos_velhos
where upper(nome_curso) like '%BSICOS%'
minus
select nome_curso, carga_horaria from cursos
where upper(nome_curso) like '%BSICOS%'
order by 1;
NOME_CURSO
CARGA_HORARIA
----------------------------------- ------------Excel 4.0: Recursos Bsicos
Windows 3.1: Recursos Bsicos
16
Word 2.0: Recursos Bsicos

3.6 - Dicionrio de Dados


O Oracle Data Dictionary consiste em um conjunto de tabelas e views12,
tambm chamadas system tables ou metadados, que proporcionam um
acesso apenas de leitura a todos os usurios de um Banco de Dados. O
Dicionrio de Dados alterado e mantido pelo Oracle. O proprietrio de
todas essas tabelas e vises o usurio SYS. Essas tabelas e views
iniciam-se por vrios prefixos, entretanto os mais impor-tantes so:

12

Prefixo

Descrio

USER_

Contm os objetos dos quais o usurio proprietrio. Por exemplo:


user_objects, user_tables, user_constraints, user_tab_columns, user_resource_limits.

Por view entende-se uma viso envolvendo vrios campos de vrias tabelas.
A criao de views ser vista mais adiante.

Oracle 9i Fundamental

64

Prefixo

Descrio
Existem 190 na verso 9.0 e 214 na 9.2.
Objetos pblicos que podem ser vistos por todos. Exemplos: all_objects,
all_tables, all_constraints, all_tab_columns. Existem 172 na verso 9.0 e 210

ALL_

na 9.2.
DBA_

Permite que os usurios com o privilgio DBA13 acessem qualquer


objeto do Banco de Dados. Existem 244 na verso 9.0 e 297 na 9.2.

V$

Possui informaes sobre a performance do Servidor. Inicialmente


disponvel somente ao DBA. Existem 230 na verso 9.0 e 265 na 9.2.

Alm destes, existem outros objetos importantes:


Dictionary (dict)

Mostra todas as tabelas e vises do Dicionrio de


Dados.

Tab, Cat

Exibem as tabelas do usurio corrente.

Col

Colunas das tabelas do usurio corrente.

Primeiro exemplo
desc user_constraints
Nome
----------------------------------------OWNER
CONSTRAINT_NAME
CONSTRAINT_TYPE
TABLE_NAME
SEARCH_CONDITION
R_OWNER
R_CONSTRAINT_NAME
DELETE_RULE
STATUS
DEFERRABLE
DEFERRED
VALIDATED
GENERATED
BAD
RELY
LAST_CHANGE
INDEX_OWNER
INDEX_NAME
INVALID
VIEW_RELATED

Nulo?
Tipo
-------- --------------------------NOT NULL
VARCHAR2(30)
NOT NULL
VARCHAR2(30)
VARCHAR2(1)
NOT NULL
VARCHAR2(30)
LONG
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(9)
VARCHAR2(8)
VARCHAR2(14)
VARCHAR2(9)
VARCHAR2(13)
VARCHAR2(14)
VARCHAR2(3)
VARCHAR2(4)
DATE
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(7)
VARCHAR2(14)

select table_name, constraint_name, constraint_type


from user_constraints
order by 1,2;
TABLE_NAME
-------------------------ALUNOS
ALUNOS
ALUNOS
13

CONSTRAINT_NAME
-----------------------------ALUNOS_NOME_NU
ALUNOS_PK
ALUNOS_UF_CH

C
C
P
C

A concesso de privilgios a um usurio ser analisada no captulo 24.

Oracle 9i Fundamental

65

CURSOS
CURSOS
CURSOS
CURSOS_VELHOS
CURSOS_VELHOS
CURSOS_VELHOS
HISTORICO
HISTORICO
HISTORICO
INSTRUTORES
INSTRUTORES
TURMAS
TURMAS
TURMAS

CURSOS_NOME_NNU
CURSOS_PK
SYS_C00904
CURSOS_VELHOS_NOME_NNU
CURSOS_VELHOS_PK
SYS_C00934
HISTORICO_ALUNO_FK
HISTORICO_PK
HISTORICO_TURMA_FK
INSTRUTORES_NOME_NU
INSTRUTORES_PK
TURMAS_CURSO_FK
TURMAS_INSTRUTOR_FK
TURMAS_PK

Oracle 9i Fundamental

C
P
U
C
P
U
R
P
R
C
P
R
R
P

66

EXERCCIOS
1. Ligue seu equipamento, realize a conexo necessria para trabalhar
com o Oracle-Server, verifique as tabelas do controle acadmico e
alimente Histrico.
Execute o script Cria_Alimenta_Historico.sql e depois execute a
procedure criada. Por exemplo: exec AlimentaHistorico(10,10)
preencher dez turmas com dez alunos.
2. Mostre todos os alunos.
3. Mostre nome e telefone dos alunos cujos nomes comecem por A.
4. Mostre os alunos ordenados por nome.
5. Cursos com respectivas arrecadaes.
6. Alunos que cursaram a turma 1.
7. Nomes de alunos com respectivos cursos assistidos.
Elimine linhas duplicadas por meio da clusula DISTINCT.
8. Quantos alunos houve por curso?
9. Arrecadao mdia por turma.
10.
Abra o script Saida_Nao_Formatada.sql e melhore a apresentao
dos nomes (em maisculas), nmeros (formato moeda), datas (d/m/a) e
valores nulos (algum texto explicativo). No se esquea de criar ttulos
para as colunas.
select cod_turma, nome_instrutor, nome_curso, carga_horaria*preco_hora_instrutor,
admissao
from instrutores i, cursos c, turmas t
where i.cod_instrutor = t.cod_instrutor
and t.cod_curso = c.cod_curso
order by cod_turma;

Oracle 9i Fundamental

67

REFERNCIA RPIDA
Tarefa

Como fazer

Mostrar todos os
registros e campos de
uma tabela

Select * from tabela;

Filtrar campos

Select campo1, campo2,...,campoN from tabela;


select campo1, campo2,...,campoN from tabela
where condio

Filtrar linhas

Filtrar valores nulos

A condio pode envolver operadores relacionais,


aritmticos, lgicos ou miscelneos (between,
like, in).
select campo1, campo2,...,campoN from tabela
where campo is null;

Clusula ORDER BY. Exemplo:


Ordenar

select * from cursos


where carga_horaria > 24
order by nome_curso;

Clusula GROUP BY com funes de grupo.


Exemplo:

Agrupar dados

select carga_horaria, count(cod_curso)


from cursos
group by carga_horaria;

Quaisquer campos mencionados na lista de


campos, que no estejam envolvidos com
funes de grupo, devem constar na clusula
GROUP BY.
Clusula HAVING. Exemplo:
Filtrar dados
agrupados

select carga_horaria, count(cod_curso)


from cursos
group by carga_horaria
having count(cod_curso) > 1;

Oracle 9i Fundamental

68

ANOTAES

Oracle 9i Fundamental

69

Captulo 4 ATUALIZAO DE DADOS


OBJETIVOS

Realizar mudanas nos dados previamente armazenados em uma


tabela;
Excluir linhas;
Dominar o conceito de transao.

ARQUIVOS NECESSRIOS

Nenhum

PR-REQUISITOS

Conectar-se ao Servidor via SQL*Plus Worksheet;


Criar tabelas (comando CREATE TABLE);
Alterar a estrutura de tabelas previamente criadas (comando
ALTER TABLE);
Eliminar tabelas (comando DROP TABLE);
Inserir dados em tabelas (comando INSERT);
Consultar dados j armazenados (comando SELECT).

TEORIA
4.1 - Fundamentos
Uma vez criadas as tabelas e devidamente alimentadas, comum existirem
ope-raes que alterem registros ou os excluam. Este captulo detalha os
comandos SQL que efetuam tais aes, bem como explica o conceito de
transao: conjunto de comandos que so confirmados em grupo.
Os comandos vistos neste captulo so:
Comando

Descrio

Update

Atualiza valores de campos em uma ou mais linhas.

delete
truncate
table

Apaga uma ou mais linhas.

commit

Nenhuma insero, atualizao ou excluso (com delete) acontece


de verdade at que seja emitido este comando, seja de forma

Apaga todas as linhas sem possibilidade de volta.

Oracle 9i Fundamental

70

explcita ou implcita, como veremos adiante.


rollback

Desfaz explicitamente os efeitos de um insert, update ou delete.

4.2 - Alterao de Linhas


Para alterar valores em linhas de uma tabela, utilizamos o comando update.
Sua sintaxe :
UPDATE tabela
SET
coluna = valor [, coluna = valor ...]
[WHERE condio];

Se a clusula where for omitida, todas as linhas sero alteradas.

Exemplo: Atualizao do preo dos cursos de Oracle em 10%


update cursos
set preco = preco * 1.1
where upper(nome_curso) like 'ORACLE%';
2 linhas atualizadas.

No se esquea de que os dados no foram ainda gravados. Isto somente


acontecer se a transao corrente for encerrada normalmente. Detalhes
em 4.4.
Observe a praticidade da linguagem SQL. Voc imagina como seria uma
poro de cdigo procedural que realizasse algo anlogo ao exemplo
apresentado anterior-mente?

4.3 - Eliminao de Linhas


Linhas so eliminadas por meio de dois comandos: delete ou truncate table.
Sintaxe do delete:
DELETE [FROM] tabela
[ WHERE condio];

Se a clusula where for omitida, todas as linhas sero eliminadas.

Primeiro exemplo: Eliminando as matrculas da turma 10


delete historico
where cod_turma = 10;
10 linhas deletadas.

Segundo exemplo: Eliminao frustrada


Quando os registros por eliminar tm linhas associadas em outras tabelas,
isto , houver um constraint associado, a eliminao no acontece:
Oracle 9i Fundamental

71

delete from cursos;


delete from cursos
*
ERRO na linha 1:
ORA-02292: restrio de integridade (MORELLI.TURMAS_CURSO_FK) violada - registro
filho localizado

Deve-se frisar que, mesmo que alguns cursos possam ser excludos (no
possuem turmas associadas), a operao como um todo cancelada.
Outro comando para eliminar linhas em uma tabela o truncate table.
Enquanto o delete apenas remove as linhas da tabela, o truncate table
remove todas as linhas e libera a rea de armazenamento utilizada pela
tabela. Este comando no permite rollback (volta).

Terceiro exemplo: Eliminando cursos velhos


truncate table cursos_velhos;
Tabela truncada.
select * from cursos_velhos;
no h linhas selecionadas

Resulta impossvel aplicar o comando truncate table em tabelas


referenciadas por chaves estrangeiras, mesmo que as tabelas
relacionadas estejam vazias. Por exemplo, suponha que no existam
linhas em HISTORICO; o comando a seguir:
Ateno

Truncate table alunos;

provocaria o erro:
truncate table alunos
*
ERRO na linha 1:
ORA-02266: chaves exclusiva/primria na tabela referenciadas por chaves externas
ativadas

4.4 - Transaes
Uma transao representa um conjunto de comandos (um ou mais) cujo
resultado ser gravado de uma vez. Durante uma transao, as linhas
afetadas por ela ficam presas, ou locked. Ela se inicia quando se executa o
primeiro comando SQL e termina nas seguintes situaes:
Commit

Comando que grava definitivamente os efeitos dos comandos da


transa-o (insert, delete, update).

Rollback

Comando que desconsidera os efeitos dos comandos da


transao (insert, delete, update).

Fim
sesso

da

Se a sesso for encerrada sem problemas, ocorre um commit


implcito, seno h um rollback implcito.
Oracle 9i Fundamental

72

Comando
DDL
ou DCL

Todo comando DDL ou DCL provocam o fim da transao


corrente; logo, h um commit implcito. Se houver qualquer
problema durante a gravao definitiva, acontece um rollback
implcito.

O comando set transaction inicia uma transao com o Banco de Dados que
pode ser do tipo Read Only ou Read Write. Ele somente pode ser usado
aps um commit ou rollback.

Primeiro exemplo: Comando set transaction


set transaction read only name 'Tran1';

Uma transao que somente deixe visualizar os dados muito til para
efeitos de consistncia. Imagine um ambiente em que estejam conectados
os usurios A, B e C. Caso A deseje emitir um relatrio longo, envolvendo
tabelas que B e C estejam atualizando, A deve "fotografar" o estado dos
dados no incio da emisso e desconsiderar os commits que B e C derem.
Neste caso, A deve iniciar sua transao com o comando citado.
Outra vantagem consiste no maior desempenho obtido nas transaes que
sejam somente de leitura.
Em transaes de leitura/gravao, somente um usurio pode alterar uma
tabela a cada vez. Enquanto ele no encerrar sua transao, os demais
usurios somente podem ver dados como estavam antes da transao
modificadora comear. Caso algum tente emitir um insert, update ou delete
em uma tabela que outro est alterando, a sesso ficar em suspenso at
que a transao seja encerrada.
Quando o comando commit executado, as alteraes nos dados so
gravadas no Banco de Dados, os valores anteriores so perdidos e o lock
desfeito, podendo ento serem acessados os dados por outros usurios.

Segundo exemplo: Commit simples


insert into instrutores (cod_instrutor, nome_instrutor)
values(11, 'Arquimedes Horclito');
commit;

E a sada:
1 linha criada.
Validao completa.

Quando acontece o comando rollback, as alteraes nos dados so


descartadas, voltando os dados ao seu estado anterior, o lock tambm
desfeito e as linhas so liberadas para serem acessadas por outros
usurios.

Terceiro exemplo: Duas transaes


commit;

Oracle 9i Fundamental

73

set transaction read write name 'tran_grava';


insert into instrutores (cod_instrutor, nome_instrutor)
values(12, 'Mrio Alnilam');
select nome_instrutor from instrutores;

E a sada:
Validao completa.
Conjunto de transaes.
1 linha criada.
NOME_INSTRUTOR
-----------------------------Maria Carolina Sirio
...
Mrio Alnilam
12 linhas selecionadas.

Emitindo o comando:
rollback;

Sada:
Rollback completo.
select count(nome_instrutor) from instrutores;
COUNT(NOME_INSTRUTOR)
--------------------11

O Oracle permite que sejam definidas marcas, denominadas savepoints, na


transao corrente, a fim de possibilitar um rollback de apenas partes da
transao. Estas marcas so especificadas com a utilizao do comando
savepoint.

Quarto exemplo: Comando savepoint


Inserindo uma linha:
insert into instrutores (cod_instrutor, nome_instrutor)
values(12, 'Mrio Alnilam');

Estabelecendo um savepoint:
savepoint inclusao_ok;

Inserindo outra linha:


insert into instrutores (cod_instrutor, nome_instrutor)
values (13, 'Nair Mintaka');

Confirmando:
select nome_instrutor from instrutores;
NOME_INSTRUTOR
-----------------------------Maria Carolina Sirio
...
Mrio Alnilam
Nair Mintaka

Oracle 9i Fundamental

74

13 linhas selecionadas.

Voltando at o ponto previamente marcado:


rollback to inclusao_ok;

Resposta:
Rollback completo.

Confirmando:
select nome_instrutor from instrutores;
NOME_INSTRUTOR
-----------------------------Maria Carolina Srio
...
Mrio Alnilam
12 linhas selecionadas.

Salvando operaes efetuadas:


commit;

Terminada a transao, a marca eliminada. Criando uma marca com


nome que j exista, simplesmente acontece uma substituio.

EXERCCIOS14
1. Ligue seu equipamento e realize a conexo necessria para trabalhar
com o Oracle-Server.
2. Atualize os preos de todos os cursos em 20%.
3. Desfaa o ltimo comando.
4. Comprove por que no possvel eliminar turmas com alunos
matriculados. Voc saberia a razo?
5. Crie uma tabela qualquer e comprove que a transao corrente foi
encerrada.
6. Matricule alguns alunos e encerre a sesso. Comprove se a sada
provocou um commit ou rollback.
7. Faa o seguinte teste e anote as concluses ao final de cada etapa:
a. Insira um instrutor;
b. Pea que um vizinho liste sua tabela de instrutores. Ele ver o que
voc v?
c. Emita um commit;

14

Os exerccios apresentados, principalmente a partir do 7, presumem que existem


pelo menos dois usurios conectados a uma base comum. Caso isto no ocorra, efeito
semelhante pode ser obtido simplesmente abrindo duas sesses de SQLPlus Worksheet.

Oracle 9i Fundamental

75

d. Repita o segundo passo. E agora? Voc sabe explicar o motivo da


diferena?
e. Insira outro instrutor;
f. Pea que algum insira um instrutor em sua tabela. Ele
conseguiu?
Observe que ele conseguiu inserir, pois a tabela no foi
bloqueada por voc e sim apenas uma linha. Ele teria uma
surpresa se voc tivesse emitido um comando update que
"trancasse" toda a tabela.
g. Emita um rollback. O que seu vizinho v?
8. Faa outro teste e tambm anote as concluses ao final de cada etapa:
a. Insira um instrutor;
b. Pea que um vizinho insira outro instrutor;
c. Pea que o vizinho encerre a transao normalmente. Por que ele
no v o que voc v?
d. Emita um commit. E agora? Que concluses voc tira?
9. Neste exerccio voc compreender a diferena entre um constraint
deferrable e not deferrable:
a. Elimine a restrio que limita as unidades da federao dos alunos:
alter table alunos drop constraint

alunos_uf_ch;

b. Recrie a restrio, mas agora deferrable, isto , a verificao de


consistncia acontecer ao final da transao e no ao final do
comando, como normal-mente acontece.
alter table alunos
add constraint
alunos_uf_ch
check (uf in ('SP', 'MG', 'RJ', 'ES'))
deferrable initially deferred;

c. Realize testes que comprovem a mudana anterior.


Voc imagina alguma situao em que o recurso recm-aprendido ser
til? Quem sabe ganhos de performance em ambientes em que a
ocorrncia de erros seja mnima....

Oracle 9i Fundamental

76

REFERNCIA RPIDA
Tarefa

Como fazer

Atualizar campos de
uma tabela

Utilize o comando update. Veja sintaxe e exemplos em


4.2.

Eliminar linhas de
uma tabela

Utilize o comando delete. Veja sintaxe e exemplos em


4.3. Eventualmente, podem-se eliminar todos os
registros de uma tabela via comando truncate table.

Iniciar uma transao

Basta encerrar a anterior.

Finalizar uma
transao, ratificando
as mudanas

Utilize o comando commit.

Finalizar uma
transao, cancelando
as mudanas

Utilize o comando rollback.

Oracle 9i Fundamental

77

ANOTAES

Oracle 9i Fundamental

78

Captulo 5 RELATRIOS
OBJETIVOS

Melhorar os resultados de consultas no SQL*Plus Worksheet;


Trabalhar com variveis de ambiente e bind variables;
Criar scripts que gerem comandos SQL.

ARQUIVOS NECESSRIOS

Nenhum

PR-REQUISITOS

Conectar-se ao Servidor via SQL*Plus Worksheet;


Criar tabelas (comando CREATE TABLE);
Alterar a estrutura de tabelas previamente criadas (comando
ALTER TABLE);
Eliminar tabelas (comando DROP TABLE);
Inserir dados em tabelas (comando INSERT);
Consultar dados j armazenados (comando SELECT);
Alterar contedos de linhas (comando UPDATE);
Eliminar linhas (comandos DELETE e TRUNCATE TABLE);
Conhecer o conceito de transao e manipular os comandos
relacionados (COMMIT, ROLLBACK).

TEORIA
5.1 - Fundamentos
Em arquivos com extenso .sql podem ser inclusos, alm da sentena
select, comandos SQL*Plus Worksheet para configurao do ambiente,
entrada de variveis, formatao de colunas, ttulos, rodaps, etc. Isto
permite melhorar bastante a apre-sentao das queries, criando
verdadeiros relatrios. Por exemplo, ao longo deste captulo, voc far o
seguinte relatrio:
Centro Educacional de Volta Grande

Oracle 9i Fundamental

79

CEVOG
ARRECADAO dos CURSOS de INFORMTICA

Pg:

Curso
Turma
Arrecadado
---------------------------------------- ----- -----------Delphi: Acesso a bancos de Dados
7
$12,000.00
****************************************
-----------Total
$12,000.00
Delphi: Recursos Bsicos

12
19

$12,000.00
$12,000.00
-----------$24,000.00

3
9
17
20

$28,500.00
$28,500.00
$28,500.00
$28,500.00
-----------$114,000.00

1
2
6
15

$24,000.00
$24,000.00
$24,000.00
$24,000.00
-----------$96,000.00

11
18

$24,750.00
$24,750.00
-----------$49,500.00

****************************************
Total
Fundamentos da Modelagem de Dados

****************************************
Total
Introduo Lgica de Programao

****************************************
Total
Oracle: SQL*Plus e SQL
****************************************
Total

-----------$295,500.00

Total Geral
Usurio : MORELLI

5.2 - Variveis de Ambiente


Por intermdio de algumas variveis de ambiente, ou sesso, podemos
configurar a sada. Todas elas tm seu valor modificado com set e exibido
com show. As principais so:
Comando

Descrio

colsep "texto"

Define o texto ou caractere que ser exibido entre as


colunas de uma consulta. O default " ".

echo {on | off}

A opo off no exibe os comandos do arquivo na tela


quando ele for executado. O default on.

feedback
{n | off | on}

Exibe o total de linhas retornadas por uma consulta quando


o nmero de linhas igual a n ou mais. O default 6 linhas.

heading {off | on}

Determina se ser exibido o cabealho das colunas. O


default on.

linesize n

Define o nmero de caracteres por linha no relatrio. O


default 80. O comum 132.

Oracle 9i Fundamental

80

Comando

Descrio

pagesize n

Determina o nmero de linhas por pgina. O default 24. O


comum 55 ou 60.

pause
{on | off | texto}

Permite controlar o scroll da tela, pressionando enter aps


cada pausa do vdeo. O default off.

Termout {on | off}

Inibe ou ativa a sada dos comandos na tela.

wrap {on | off}

Indica que, caso a largura de linhas no relatrio ultrapasse


o tamanho de linesize, elas sero truncadas (off) ou no (on). O
default on.

A sentena show all exibe o valor de todas as variveis.


Deve-se redefinir as variveis com seu valor original aps o trmino de cada
relatrio. Lembre-se que no existe um comando para retornar todas as
variveis aos seus valores default, por isso importante conhecer seu valor
anterior ou desconectar-se e conectar-se novamente.

5.3 - Comandos SQL*Plus Worksheet de


Formatao
5.3.1 - Column
Define cabealho, largura e formato de dado para uma coluna do relatrio.
Sua sintaxe :
column

[ {coluna | alias}

[opes ...] ]

As opes disponveis so:


Opo

Descrio

cle[ar]

Elimina todas as formataes definidas.

for[mat] formato

Define a formatao do dado da coluna, podendo ser:


An - largura do campo para os tipos de dado char ou date.
9 - representao numrica com supresso de zeros no
signi-ficativos.
0 - representao numrica, forando a exibio de zeros
no significativos.
$ - representa o caractere "$" flutuante.
. - indica a posio do ponto decimal.
, - indica a posio do caractere separador de milhar.

hea[ding] "texto"

Define o cabealho para a coluna. A utilizao do caractere


"|", separando palavras no texto, fora a quebra em mais de
uma linha.

jus[tify]
alinhamento

Define o alinhamento do cabealho da coluna (no os dados).


Pode ser left, right ou center (l, r, c).
Oracle 9i Fundamental

81

Opo

Descrio

noprint | print

Oculta ou mostra uma coluna.

Null "texto"

Especifica um texto para ser exibido em caso de valores


NULL.

Truncated

Trunca o valor da coluna quando ela ultrapassar a largura


definida.

Wrapped

Continua a exibio da coluna na prxima linha quando ela


ultrapas-sar a largura definida.

Observe que vrios comandos podem ser abreviados. Assim, em vez de


digitar clear, pode-se digitar cle.

Primeiro exemplo: Listagem simples


column nome format a30 heading 'Nome' trunc
column nome

Sada:
COLUMN
nome ON
HEADING 'Nome'
FORMAT
a30
truncate
column telefone heading 'Telefone | Residencial'
column telefone clear
column telefone

Sada:
SP2-0046: COLUMN 'telefone' no definido
select nome_instrutor nome from instrutores order by 1;

Nome
-----------------------------Almir Altair
Arquimedes Horclito
Augusto Lemos Vega
Beatriz Bellatrix
Carlos Regulos
Joana Aldebaran
Leonardo Guimares Rigel
Maria Carolina Sirio
Matias Agena
Mrio Alnilam
Mnica Silveira Capela
Pedro Paulo Canopo
12 linhas selecionadas.

Segundo exemplo: Listagem numrica


column nome format a45 heading 'Nome' trunc
column ch justify right format 999 null 'Sem Carga Horria'
heading ' **** Carga Horria *****'

Oracle 9i Fundamental

82

select nome_curso nome, carga_horaria ch


from cursos order by 2 desc;
Nome
------------------------------------Redes I
Introduo a Sistemas Operacionais
Anlise Orientada por Objetos
Redes II
Fundamentos da Modelagem de Dados
Introduo Lgica de Programao
Oracle: SQLPlus e SQL
Delphi: Recursos Bsicos
Oracle: PL/SQL
Delphi: Acesso a bancos de Dados

**** Carga Horria *****


------------------------Sem Carga Horria
Sem Carga Horria
Sem Carga Horria
Sem Carga Horria
40
32
32
24
24
24

10 linhas selecionadas.

Perceba o hfen indicando que o comando em questo prosseguir na linha


seguinte.

5.3.2 - Ttitle e Btitle


Utiliza-se ttitle para definir o ttulo do relatrio, e btitle para o seu rodap.
Eles podem incluir data corrente, usurio e nmero da pgina. A sintaxe
do btitle a mesma do ttitle:
ttitle [texto ou &varivel] [off | on]

Em seguida so listados os comandos que geraram o cabealho e o rodap


do relatrio exibido no item 5.1:
...
ttitle left 'Centro Educacional de Volta Grande' skip left 'CEVOG' right 'Pg: 'format 999 sql.pno skip center 'ARRECADAO dos CURSOS de INFORMTICA'
skip center '
'

btitle center 'Usurio : ' sql.user


...
ttitle off
btitle off

5.3.3 - Break e Compute


Quando se deseja informar uma quebra com clculos no relatrio, devemse utilizar os comandos break e compute. Deve-se notar que os dados
devem ser ordenados pelas quebras.
Em seguida so listados os comandos que geraram as quebras e os
clculos do relatrio exibido no item 5.1:
compute sum label Total of ARRECADADO on CURSO
compute sum label "Total Geral" of ARRECADADO on report
break on report skip 2 on CURSO skip 2

Oracle 9i Fundamental

83

Observe a presena dos campos ARRECADADO e CURSO no comando select15:


select nome_curso CURSO, t.cod_turma TURMA, sum(preco) ARRECADADO
from cursos c inner join turmas t using(cod_curso)
join historico h on h.cod_turma = t.cod_turma
group by nome_curso, t.cod_turma
having sum(preco) >0
order by 1,2;

A referncia coluna CURSO no comando break evita que nomes de cursos


sejam emitidos vrias vezes.

5.4 - Bind Variables


Pode-se criar um script contendo uma clusula where para restringir as
linhas que sero exibidas. Para alterar a condio cada vez que for
executado o arquivo, utilizam-se as variveis de substituio (bind
variables). Elas podem alterar valores na clusula where, uma cadeia de
caracteres ou ainda nomes de tabelas ou colunas. A utilizao deste
recurso melhora a performance geral no que diz respeito compilao do
comando.
Existem dois comandos para criao de variveis: define e variable:
Comando

Descrio

define varivel=valor

Cria uma varivel do tipo char e assinala um valor


a ela.

define varivel

Exibe a varivel, seu valor e tipo de dados.

undefine varivel

Elimina varivel.

define

Exibe todas as variveis do usurio com valor e tipo


de dado.

variable varivel tipo

Declara uma varivel de um dado tipo.

Primeiro exemplo: Criando varivel UF


Define uf = RJ

Segundo exemplo: Listando variveis


Define

Sada:
DEFINE _SQLPLUS_RELEASE = "900010001" (CHAR)
DEFINE _EDITOR
= "Notepad" (CHAR)
DEFINE _O_VERSION
= "Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production
With the Partitioning option
15

Propositalmente seguiu-se o padro SQL-92 em vez do SQL-86.

Oracle 9i Fundamental

84

JServer Release 9.0.1.1.1 - Production" (CHAR)


DEFINE _O_RELEASE
= "900010101" (CHAR)
DEFINE UF
= "RJ" (CHAR)

Uma outra forma de listar variveis:


prompt uf

Sada:
Uf

Mostrando contedo:
prompt &preco_minimo

Sada:
RJ

Terceiro exemplo: Usando uma varivel para listagem


parametrizada
select count(nome_aluno) from alunos where uf = '&uf'

Sada:
antigo
1: select count(nome_aluno) from alunos where uf = '&uf'
novo
1: select count(nome_aluno) from alunos where uf = 'RJ'
COUNT(NOME_ALUNO)
----------------22

Para evitar a exibio dos valores antigos e novos, utilize a varivel de


ambiente verify:
set verify off
select count(nome_aluno) from alunos where uf = '&uf'

Sada:
COUNT(NOME_ALUNO)
----------------22
SQL> set verify on

Para retornar ao comportamento padro, basta atribuir ON varivel de


ambiente verify.

Quarto exemplo: Outra forma de declarao de variveis


variable cotacao number
exec :cotacao := 2.70
print cotacao

Oracle 9i Fundamental

85

5.5 - Gerao de SQL


Uma das grandes aplicaes dos relatrios com SQL*Plus Worksheet
consiste em montar scripts que contenham comandos SQL que gerem
outros comandos SQL. Isto resulta muito til quando for preciso
automatizar tarefas.

Primeiro exemplo: Gerando describes


set echo off
set pagesize
set linesize
set feedback
spool x.list
select 'desc
spool off

0
100
off
' || table_name from cat;

set pagesize 20
set feedback on
set echo on
start x.list

O arquivo x.list conter tantos describes quantas forem as tabelas do


usurio corrente. O efeito deste script mostrar as estruturas de todas as
tabelas.

Segundo exemplo: Gerando inserts


select 'insert into instrutores', 'values ('|| cod_instrutor ||
',' || '''' || nome_instrutor || '''' || ');' from instrutores;

tem como resultado:


'INSERTINTOINSTRUTORES'
'VALUES('||COD_INSTRUTOR||','||''''||NOME_INSTRUTOR||''''||');'
----------------------- ---------------------------------------------insert into instrutores values (1,'Maria Carolina Srio');
insert into instrutores values (2,'Pedro Paulo Canopo');
insert into instrutores values (3,'Augusto Lemos Vega');
insert into instrutores values (4,'Mnica Silveira Capela');
insert into instrutores values (5,'Almir Altair');
insert into instrutores values (6,'Leonardo Guimares Rigel');
insert into instrutores values (7,'Beatriz Bellatrix');
insert into instrutores values (8,'Carlos Regulos');
insert into instrutores values (9,'Joana Aldebaran');
insert into instrutores values (10,'Matias Agena');
insert into instrutores values (11,'Arquimedes Horclito');
insert into instrutores values (12,'Mrio Alnilam');

Este script apresentado seria muito til para preencher uma tabela vazia
com a mesma estrutura de INSTRUTORES.

Terceiro exemplo: Gerando selects


select 'select sum(data_length) from cols where table_name = ' || '''' || table_name
|| '''' || ';' from cat;

Oracle 9i Fundamental

86

resultado:
select
select
select
select
select

sum(data_length)
sum(data_length)
sum(data_length)
sum(data_length)
sum(data_length)

from
from
from
from
from

cols
cols
cols
cols
cols

where
where
where
where
where

table_name
table_name
table_name
table_name
table_name

=
=
=
=
=

'ALUNOS';
'CURSOS';
'HISTORICO';
'INSTRUTORES';
'TURMAS';

Este comando gera uma lista de selects, sendo um para cada tabela do
usurio, e permite ter uma exata noo de quanto espao est sendo gasto
por linha em cada tabela.
Observe que os valores listados diferem da soma dos tamanhos dos campos
a partir da emisso do comando describe. Isto acontece, pois, alm dos
dados pro-priamente ditos, h uma srie de informaes extras que so
gravadas em cada linha da tabela para efeitos de controle.

EXERCCIOS
1. Crie colunas para os campos Nome_Curso (Cursos), Cod_Turma
(Turmas) e Alunos (campo calculado).
2. Elabore um cabealho e um rodap para um relatrio que mostrar as
turmas, o curso e quantos alunos foram matriculados por turma.
3. Monte o SQL que mostre a relao de cursos/turmas ordenados
decrescen-temente por quantidade de alunos.
4. Totalize por curso e ao final do relatrio.
5. Rena os comandos que geraram o relatrio em um arquivo texto e
direcione a sada para outro arquivo texto.
6. Desabilite cabealho, rodap, quebras e colunas. Acrescente esses
comandos ao arquivo que gerou o relatrio.

Oracle 9i Fundamental

87

REFERNCIA RPIDA
Tarefa

Ativar variveis de
ambiente

Como fazer
Utilize o comando SQL*Plus Worksheet SET.
Exemplos:
set linesize 200
set echo off

Alternativamente,
pode-se
Environment, Options.

acessar

menu

Formatar cabealhos
de campos

Utilize o comando column. Veja sintaxe e exemplos em


5.3.1.

Formatar uma pgina

Dimensione-a com a varivel de ambiente linesize; insira


um cabealho com ttitle e um rodap com btitle.

Realizar quebras e
clculos em relatrios

Utilize os comandos break e compute. Veja sintaxe e


exemplos em 5.3.3.

Declarar uma bind


variable

variable Limite number

Atribuir um contedo
a uma varivel
declarada por
VARIABLE
Listar bind variables

Utilize os comandos variable ou define. Exemplo:

Utilize o comando exec. Exemplo:


Exec :limite := 500

Utilize os comandos variable ou define sem argumentos.


Exemplo:
DEFINE

Utilizar variveis em
comandos SQL

Exemplo:
Select * from cursos where preco > :limite;

Oracle 9i Fundamental

88

Captulo 6 OUTRAS ESTRUTURAS DE


DADOS
OBJETIVOS

Conhecer e
Conhecer e
Conhecer e
Conhecer e

implementar
implementar
implementar
implementar

objetos
objetos
objetos
objetos

do
do
do
do

tipo
tipo
tipo
tipo

ndice;
Viso;
Seqncia;
Sinnimo.

ARQUIVOS NECESSRIOS

Nenhum

PR-REQUISITOS

Conectar-se ao Servidor via SQL*Plus Worksheet;


Criar tabelas (comando CREATE TABLE);
Alterar a estrutura de tabelas previamente criadas (comando
ALTER TABLE);
Eliminar tabelas (comando DROP TABLE);
Inserir dados em tabelas (comando INSERT);
Consultar dados j armazenados (comando SELECT);
Pesquisar o Dicionrio de Dados;
Alterar contedos de linhas (comando UPDATE);
Eliminar linhas (comandos DELETE e TRUNCATE TABLE);
Conhecer o conceito de transao e manipular os comandos
relacionados (COMMIT, ROLLBACK);
Elaborar relatrios com SQL*Plus Worksheet;
Gerar scripts de comandos SQL a partir de outros comandos
SQL.

Oracle 9i Fundamental

89

TEORIA
6.1 - Fundamentos
At o momento foi criado explicitamente apenas um tipo de objeto: tabela.
O Oracle oferece inmeras outras estruturas de dados que so muito teis
no dia-a-dia do banco, a comear pelos ndices, j criados via constraints,
que aceleram bastante o acesso aos dados.
Depois de criar explicitamente ndices, ser visto como construir views que
permi-tem visualizar, de uma forma simples, dados que esto em tabelas
diferentes. Por exemplo, seria interessante que o nome dos instrutores e os
alunos de suas turmas pudessem estar "juntos".
Seguem as sequences que geram nmeros seqenciais. Isto
particularmente til quando existem campos cujos contedos, geralmente
chaves primrias, so nmeros que no podem ser repetidos. A utilizao
de sequences permite que o contedo dessas chaves seja gerado
automaticamente.
O captulo termina com synonyms que representam uma forma mais
econmica de referncia a tabelas que pertenam a outros usurios e at a
outros bancos.

6.2 - ndices
Imagine o seguinte comando que cria uma tabela com 26 campos com 30
bytes cada um:
create
a char
b char
...
z char

table grande (
(30)
(30)
(30));

Ao acessar o campo d, o Oracle precisa carregar as colunas a, b, c, ..., z. Como


cada registro ocupa 26 x 30 = 780 bytes mais o identificador de cada linha
(rowid) que possui 10 bytes, a cada 10 registros seriam necessrios 7,7 Kb.
Agora imagine que fosse possvel criar uma estrutura "auxiliar" que
contivesse dois campos: d e outro com endereos para as linhas da tabela
(rowid). Cada registro ocuparia 40 bytes, assim os mesmos 7,7 Kb
permitiriam carregar 197 linhas! Quase vinte vezes mais!
ndices (index) so estruturas especiais inseridas no banco de dados com o
objetivo de melhorar o desempenho de acesso s tabelas. Sua funo
reduzir o I/O em disco utilizando uma estrutura de rvore-B (B*Tree) para
localizar rapidamente os dados. Ao varrer a rvore-B, ele identifica a chave
e recupera o seu rowid, ponteiro para acesso ao dado, localizando o registro
rapidamente. O Oracle cria automaticamente um ndice do tipo unique ao
criar uma chave primria, o qual recebe o mesmo nome da constraint.
Oracle 9i Fundamental

90

ndices so utilizados durante comandos select (clusulas where order by e


group by), portanto, quando houver ndices compostos, deve-se colocar
primeiro a coluna mais usada.
Uma analogia clara para ndices seriam ndices remissivos de livros.
O comando para a criao de ndices o create index, cuja sintaxe :
CREATE [UNIQUE] INDEX ndice
ON tabela (coluna [ASC | DESC] [,coluna,...);

Os colchetes representam clusulas opcionais. A tabela seguinte explica a


sintaxe do comando:
Opes

Descrio

Unique

Informa que o ndice em questo no aceitar valores repetidos.

ndice

Nome do ndice a ser criado.

Tabela

Nome da tabela sobre a qual ser criado o ndice.

Coluna

Nome das colunas que comporo o ndice. Este ser usado


automaticamente em clusulas where, order by ou group by sempre
que a primeira coluna for mencionada.

asc | desc

Especifica a classificao: ascendente (asc), default, ou descendente


(desc).

Primeiro exemplo: Criao de um ndice para turmas


create index turmas_cod_curso_idx on turmas (cod_curso);

Pode-se confirmar a existncia de ndices por meio de uma viso do


dicionrio de dados do Oracle user_indexes, que armazena informaes
sobre os ndices do usurio. Tambm podem-se verificar as colunas
envolvidas em um ndice utilizando user_ind_columns.

Segundo exemplo: Confirmando a existncia de ndices


select index_name from user_indexes;
INDEX_NAME
-----------------------------ALUNOS_PK
...
TURMAS_COD_CURSO_IDX
TURMAS_PK

E para verificar as colunas:


select index_name, column_name, column_position, column_length
from user_ind_columns
where table_name = 'TURMAS';
INDEX_NAME
COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH
-------------------- ----------- --------------- ------------TURMAS_PK
COD_TURMA
1
22

Oracle 9i Fundamental

91

TURMAS_COD_CURSO_IDX COD_CURSO

22

Para eliminar um ndice, usa-se o comando drop index.

Terceiro exemplo: Eliminando um ndice


drop index turmas_cod_curso_idx;

Deve-se lembrar que este comando no elimina ndices criados a partir de


constraints.
Concluindo, deve-se criar um ndice quando:
A tabela volumosa, muito consultada e pouco atualizada;
A coluna ou colunas so utilizadas freqentemente em clusulas
where, order by, group by ou em joins;
A coluna contm uma grande quantidade de valores nulos;
A tabela grande e a maior parte das queries retorna menos de 2
a 4% das linhas. Na verdade, isto significa que, quando houver
muitos valores diferentes (a maior incidncia como 2 a 4%),
bom indexar. A situao tima para indexar ocorre quando no
h valores repetidos (ndices nicos);
Deve-se considerar tambm a possibilidade de criar ndices em
campos cujos contedos sejam consultados em forma de
intervalo. Por exemplo: datas, siglas, cdigos de chaves
estrangeiras, etc.
Quando uma tabela for muito consultada segundo um determinado
critrio, vale a pena pensar em Index-Organized Tables (IOTs), que
consistem em objetos capazes de armazenar dados como acontece nos
ndices, ou seja, em forma de rvore. H ganhos de performance pois a
tabela o prprio ndice. Veremos este recurso em detalhes no captulo
22.
E no se deve criar ndice quando:
A tabela muito atualizada;
A tabela pequena;
A coluna ou colunas so pouco utilizadas como condio em
queries;
A coluna ou colunas j possuem um constraint primary key ou
unique;
A maior parte das queries retorna mais de 2 a 4% das linhas;
A coluna do tipo raw, lob, long ou long raw. O Oracle no permite
indexar campos destes tipos.

6.3 - Views
Uma view (viso) uma tabela virtual na qual os dados no esto
fisicamente armazenados. Ela apenas uma viso de um grupo de colunas
Oracle 9i Fundamental

92

de uma ou mais tabelas do banco. A utilizao de vises proporciona as


seguintes vantagens:
Evitar que usurios no autorizados tenham acesso a todos os dados de
uma tabela. Para isto, cria-se uma viso com apenas alguns campos
necessrios;
Associar a uma viso consultas que utilizam critrios de seleo
complexos, e assim, facilitar ao usurio.
Para criar uma viso, deve-se utilizar o comando create view. Sua sintaxe
simplificada :
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW nome_viso
[alias,...] AS subquery
[WITH CHECK OPTION [CONSTRAINT nome_constraint]
[WITH READ ONLY];

em que:
Opes

Descrio

Replace

Recria a view, se ela j existir.

Force

Cria a view, mesmo que a tabela base no exista.

Noforce

S cria a view se a tabela base existir. Opo default.

Subquery

Sentena select na qual ser baseada a view. No possvel


especificar a clusula order by.

with check
option

Caso exista algum filtro especificado na clusula WHERE do


comando SELECT, a condio ser utilizada para impedir
atualizaes realizadas diretamente sobre a View que contrariem
este filtro. Sem esta clusula, as alteraes poderiam ser feitas,
porm no seriam vistas ao listar o contedo retornado pela View.
Opcionalmente pode-se especificar o nome do constraint que
determina a restrio alterao.

with read
only

Indica que no podem ser executados comandos de DML (insert,


delete, update) sobre a view.

Os dados de uma view nem sempre podem ser alterados. Vejamos


situaes em que as atualizaes normalmente so proibidas:
Tentativa de insero em uma view que no possua todos os
campos obrigatrios da tabela base (chave primria e no nulos);
Tentativa de atualizao de um campo calculado ou chave da
tabela primria;
Excluso de registros que possuam outros relacionados.
Como veremos em breve, essas restries podem ser burladas graas aos
Triggers do tipo Instead of. Mais detalhes no captulo 16.

Primeiro exemplo: Criao de uma view


create view arrecadado
as

Oracle 9i Fundamental

93

select nome_curso CURSO, t.cod_turma TURMA, sum(preco) ARRECADADO


from cursos c inner join turmas t using (cod_curso)
join historico h on t.cod_turma = h.cod_turma
group by nome_curso, t.cod_turma
having sum(preco) >0;

E para visualizar os dados por meio da view:


select * from arrecadado order by arrecadado desc;
Sada16:
CURSO
TURMA ARRECADADO
---------------------------------------- ---------- ---------Fundamentos da Modelagem de Dados
3
9500
Fundamentos da Modelagem de Dados
9
9500
Introduo Lgica de Programao
1
8000
Introduo Lgica de Programao
6
8000
Introduo Lgica de Programao
2
8000
Delphi: Acesso a Bancos de Dados
7
4000
6 linhas selecionadas.

Quando o comando select que gera a View possuir grande complexidade, a


performance nas consultas poder ser consideravelmente degradada. Neste
caso, seria aconselhvel criar um outro tipo de objeto: Materialized View.
Trata-se de uma tabela temporria contendo os dados da Viso. No
captulo 22 veremos como criar e alimentar tal objeto.
A estrutura da view pode ser vista pelo j conhecido comando describe ou
pela tambm viso user_views.

Segundo exemplo: Confirmando a existncia de views


desc arrecadado
Name
Null?
---------------------------- -------CURSO
NOT NULL
TURMA
ARRECADADO

Type
---VARCHAR2(60)
NUMBER(3)
NUMBER

O corpo:
select view_name, text_length, text from user_views;
VIEW_NAME
TEXT_LENGTH TEXT
----------------- ----------- ------------------------ARRECADADO
219 select nome_curso CURSO,...

Para eliminar uma viso, usa-se o comando drop view.

Terceiro exemplo: Eliminando uma view


drop view arrecadado;

16

Os dados seguintes foram obtidos aps a execuo dos Scripts Monta_Tabelas.sql e


Cria_Alimenta_Historico.sql. A Stored Procedure AlimentaHistorico foi executada
com os argumentos: 10, 10.

Oracle 9i Fundamental

94

Quarto exemplo: Clusula WITH CHECK OPTION


Imagine que se tenha criado uma viso representando os cursos com carga
horria igual ou maior que 32:
CREATE view vCursosLongos
as
select cod_curso, nome_curso, carga_horaria
from cursos
where carga_horaria >= 32
with check option;

Note que a clusula with check option impedir que, por meio da view, sejam
inseridos ou alterados cursos com carga horria menor que 32. De fato:
insert into vCursosLongos (cod_curso, nome_curso, carga_horaria)
values ('Outro Curso', 10);

Produzir a mensagem seguinte:


insert into vCursosLongos (cod_curso, nome_curso, carga_horaria)
*
ERRO na linha 1:
ORA-01402: violao da clusula where da view WITH CHECK OPTION

6.4 - Sequences
Muitas aplicaes necessitam utilizar um valor numrico seqencial como
chave primria em uma tabela. Com o uso de Sequences (seqncias)
esses valores podem ser gerados automaticamente pelo Oracle. A sequence
gera valores para o mnemnico nextval, que pode ser utilizado no comando
insert. A sintaxe do comando para criao de sequences :
CREATE SEQUENCE seqencia
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];

em que:
Opo

Descrio

Seqencia

Nome da seqncia que no pode ser o mesmo de uma


tabela ou view.

Increment by n

Especifica de quanto ser o incremento ou decremento da


seqn-cia. O default 1.

start with n

Especifica o primeiro nmero a ser gerado. O default 1.

maxvalue n

Especifica o valor mximo que a seqncia pode assumir. O


default nomaxvalue, indo at 1027.

minvalue n

Especifica o valor mnimo para seqncias que estejam


sendo decrementadas. mutuamente exclusiva anterior.
Oracle 9i Fundamental

95

Opo

Descrio

cycle | nocycle

Indica que, quando atingir o valor mximo, a numerao


continuar a partir do valor inicial. O default nocycle.

Cache n | nocache

Especifica quantos valores o Oracle pr-aloca e mantm em


memria. O default 20.

Primeiro exemplo: Criao de uma sequence


create sequence id_curso
increment by 1
start with 11
maxvalue 999
nocycle;

Segundo exemplo: Confirmando a existncia de sequences


select sequence_name, increment_by,max_value, last_number
from user_sequences;

E a sada:
sequence_name
increment_by max_value last_number
----------------- ------------ ---------- ---------id_curso
1
999
11

Observao
Se for executado um rollback, o nmero da seqncia no volta atrs!
Duas pseudocolunas so utilizadas nas seqncias: nextval, que retorna o
prximo nmero da seqncia, e currval, valor corrente.

Terceiro exemplo: nextval


insert into cursos (cod_curso, nome_curso)
values (id_curso.nextval, 'Oracle: Administrao');

Constatando:
select cod_curso, nome_curso from cursos;

Sada:
COD_CURSO NOME_CURSO
--------- -----------------------------------------1 Introduo Lgica de Programao
...
11 Oracle: Administrao

Quarto exemplo: currval

Oracle 9i Fundamental

96

select id_curso.currval from dual;

Sada:
CURRVAL
--------11

Quinto exemplo: Eliminando uma sequence


drop sequence id_curso;

Outra forma de gerar valores automaticamente consiste em utilizar o tipo


raw para garantir unicidade, e a funo sys_guid() para obter novos
valores. Por exemplo, o comando seguinte cria uma tabela com dois
campos e depois insere-lhe uma linha.
create table gerada (cod raw(32), num int);
insert into gerada (cod, num) values (sys_guid(),1);
select * from gerada;

O resultado do ltimo comando seria:


COD
NUM
-------------------------------- ---------906499066237483298EDB761D9A88182
1

O contedo retornado pela funo sys_guid() resulta da concatenao de


vrios dados e ocupa 16 bytes. Sua utilizao recomendada quando a
unicidade for crtica, ou seja, uma linha deve possuir contedo nico no
Database.

6.5 - Synonyms
Tipicamente, um Banco de Dados Oracle utilizado por dezenas de
usurios que tm vrios objetos. Acontece freqentemente que um usurio
precisa de uma tabela, ndice, view ou sequence de outro e, para facilitar a
manipulao desses objetos, cria synonyms (sinnimos).
O comando que cria synonyms o seguinte:
CREATE [PUBLIC] SYNONYM sinnimo FOR objeto

em que:
Opo

Descrio

public

Especifica que o synonym pode ser usado por todos. O default que
somente o criador possa utiliz-lo.

objeto

Informa o nome do objeto sobre o qual se aplica o sinnimo. Pode


ser tabela, ndice, view ou sequence.

Oracle 9i Fundamental

97

Ateno

Para que seja possvel criar um sinnimo pblico, o usurio deve ter
recebido explicitamente o privilgio para tal. Este assunto ser detalhado
no captulo 24, que trata sobre segurana.

Primeiro exemplo: Criao de um synonym


create public synonym cursos_dba for cursos;

Supondo que o usurio corrente se chamasse DbaAcad e houvesse outro


usurio denominado Pedro, este poderia fazer referncia tabela cursos de
DbaAcad como:
select * from cursos_dba

em vez de:
select * from dbaacad.cursos

Isto, claro, aps terem sido concedidas as permisses adequadas. Este


assunto tambm ser tratado no captulo 24, Segurana.

Segundo exemplo: Confirmando a existncia de synonyms


Os synonyms pblicos podem ser vistos em all_synonyms e os privativos, em
user_synonyms:
select synonym_name, table_owner
from all_synonyms
where table_name = 'CURSOS';

Sada:
SYNONYM_NAME
TABLE_OWNER
-------------------------- -----------------------------CURSOS_DBA
DBAACAD

Terceiro exemplo: Eliminando um synonym


drop public synonym cursos_dba;

EXERCCIOS
1. Crie um ndice com as caractersticas seguintes e depois confirme sua
existncia:
Tabela Alunos;
Campos uf (ascendente), nome_aluno (decrescente).

Oracle 9i Fundamental

98

2. Em quais comandos seguintes o ndice recm-criado seria utilizado?


a. select uf, nome_aluno from alunos order by 1,2 desc;
b. select nome_aluno from alunos order by 1;
c. select nome_aluno from alunos order by uf;
3. Crie uma view que informe o quanto cada instrutor arrecadou.
4. Monte uma view que revele alunos, cursos e total pago por cada um.
5. Faa uma view que mostre a mdia vendida por curso.
6. Crie sequences para que os cdigos nas chaves primrias das tabelas
"de ponta" possam ser gerados automaticamente.
7. Monte uma view que sirva como base para a Lista de Presenas. Devem
constar: nome do aluno, nome do curso, carga horria, nome do
instrutor e sala.

REFERNCIA RPIDA
Tarefa

Como fazer

Criar ndices

Utilize o comando create index. Para comprovar o sucesso


da operao, investigue IND ou USER_INDEXES.

Eliminar ndices

Utilize o comando drop index.

Criar views

Utilize o comando create view. Para comprovar o sucesso da


ope-rao, investigue USER_VIEWS.

Eliminar views

Utilize o comando drop view.

Criar sequences

Utilize o comando create sequence. Para comprovar o


sucesso da operao, investigue USER_SEQUENCES.

Eliminar
sequences

Utilize o comando drop sequence.

Criar synonyms

Utilize o comando create synonym. Para comprovar o


sucesso da operao, investigue USER_SYNONYMS.

Eliminar
synonyms

Utilize o comando drop synonym.

Oracle 9i Fundamental

99

ANOTAES

Oracle 9i Fundamental

100

Captulo 7 SUBQUERIES
OBJETIVOS

Conhecer o conceito de subquery;


Identificar situaes em que a utilizao de uma subquery
necessria;
Construir subqueries de uma linha;
Construir subqueries de mltiplas linhas;
Construir subqueries de mltiplas colunas;
Construir subqueries correlatas.

ARQUIVOS NECESSRIOS

Monta_Tabelas_Salas.sql.

PR-REQUISITOS

Conectar-se ao Servidor via SQL*Plus Worksheet;


Criar tabelas (comando CREATE TABLE);
Alterar a estrutura de tabelas previamente criadas (comando ALTER
TABLE);
Eliminar tabelas (comando DROP TABLE);
Inserir dados em tabelas (comando INSERT);
Consultar dados j armazenados (comando SELECT);
Pesquisar o Dicionrio de Dados;
Alterar contedos de linhas (comando UPDATE);
Eliminar linhas (comandos DELETE e TRUNCATE TABLE);
Conhecer o conceito de transao e manipular os comandos
relacionados (COMMIT, ROLLBACK);
Criar e manipular views.

TEORIA
7.1 - Fundamentos
Uma subquery consiste em uma consulta utilizada dentro de um comando
SQL. H vrias situaes em que as subqueries so necessrias:
Mostrar cursos cujo preo seja maior que a mdia dos preos;
Oracle 9i Fundamental

101

Atualizar em 10% o preo do curso mais caro;


Selecionar os alunos cujo estado de origem seja o mesmo de
qualquer aluno de sobrenome "Silva";
Atualizar contedos de campos com base em outros;
Mostrar nomes de instrutores que no ministraram cursos17; etc.
Uma subquery pode ser utilizada dentro de um comando select, update,
create table, delete ou insert.
Existem os seguintes tipos de subqueries:

Tipo

Descrio

Uma Linha

Retorna apenas um valor.

Mltiplas Linhas

Podem retornar um ou mais valores, mas em uma


coluna.

Mltiplas Colunas

Retornam um ou mais valores em mais de uma coluna.

Correlatas

Utilizam campos da consulta externa.

Trabalhando com subqueries, possvel utilizar vrios operadores:


Operador

Descrio

=, <>, >, >=, <,


<=

Relacionais usados em subqueries do tipo Uma Linha.

in

Testa se um valor pertence a um conjunto de valores.

not in

Testa se um valor no pertence a um conjunto de valores.

any

Verifica se um determinado argumento casa com qualquer


membro de um conjunto.

all

exists

not exists

Verifica se um determinado argumento casa com todos os


membros de um conjunto.
Usado em subqueries correlatas, v se um dado valor existe em
um conjunto, levando em conta valores nulos. Este fato no
considerado pelo operador in.
Negao do anterior.

7.2 - Subqueries de Uma Linha


Primeiro exemplo: select
select nome_curso, preco
from cursos
where preco = (select max(preco) from cursos);

Sada:
17

Este problema, assim como outros, pode ser resolvido sem subqueries, por meio de
um Outer Join, e normalmente mais eficiente faz-lo por Outer Join.

Oracle 9i Fundamental

102

NOME_CURSO
-----------------------------------------Fundamentos da Modelagem de Dados

PRECO
--------950

Esta consulta mostra o nome do curso mais caro.


Observe:
A presena do operador relacional =;
Que, de fato, a subquery somente retorna um valor;
Como a subquery colocada entre parnteses.
O Servidor executa primeiro as consultas mais internas.
Cuidado

Uma subquery no pode conter clusula order by.

Segundo exemplo: update


Atualiza(m)-se o(s) curso(s) mais caro(s) em 10%:
update cursos
set preco = 1.1 * preco
where preco = (select max(preco) from cursos);

Terceiro exemplo: create table


Cria uma tabela na qual constem os cursos cujo preo seja maior que a
mdia:
create table maiores as
select nome_curso, preco
from cursos
where preco > (select avg(preco) from cursos);

Observe que, caso existam constraints associados aos campos nome_curso e


preco, eles NO sero incorporados nova tabela. Note tambm que, apesar
de existirem dois comandos SELECT, apenas um representa subquery.

Quarto exemplo: delete


Na nova tabela, elimina o mais barato dos maiores:
delete from maiores
where preco = (select min(preco) from maiores);

Quinto exemplo: insert


Alimenta a nova tabela com os cursos cujo preo seja menor que a mdia.
insert into maiores (nome_curso, preco)
select nome_curso, preco from cursos
where preco < (select avg(preco) from cursos);

Oracle 9i Fundamental

103

A construo de subqueries constitui tarefa claramente mais intuitiva do


que a de joins. Isto pode levar ao mau costume de tentar resolver todo e
qualquer problema via subqueries, esquecendo-se da melhor
Cuidado performance de joins. Portanto, antes de imaginar qualquer subquery,
pergunte ao problema se um join cai bem.
O que h de errado com este comando?
select nome_curso
from cursos where cod_curso in
(select cod_curso from turmas t inner join instrutores i using(cod_instrutor)
where nome_instrutor like '%Sirio')

7.3 - Subqueries de Mltiplas Linhas


Primeiro exemplo: select com in
select nome_curso, carga_horaria
from cursos
where carga_horaria in
(select carga_horaria
from cursos where upper(nome_curso) like 'ORACLE%')
and upper(nome_curso) not like 'ORACLE%';

Sada:
NOME_CURSO
CARGA_HORARIA
--------------------------------------------- ------------Delphi: Recursos Bsicos
24
Delphi: Acesso a bancos de Dados
24
Introduo Lgica de Programao
32

A consulta anterior mostra os cursos que tm a mesma carga horria de


qualquer um que tenha "Oracle" em seu nome.

Segundo exemplo: select com not in


select nome_curso, carga_horaria
from cursos
where carga_horaria not in
(select carga_horaria
from cursos where upper(nome_curso) like 'ORACLE%'
and carga_horaria is not null)
and upper(nome_curso) not like 'ORACLE%';

Sada:
NOME_CURSO
CARGA_HORARIA
--------------------------------------------- ------------Fundamentos da Modelagem de Dados
40

Oracle 9i Fundamental

104

A consulta anterior mostra os cursos que no tm a mesma carga horria


de qualquer um que tenha "Oracle" em seu nome. Observe que precisamos
excluir os valores nulos para que a comparao possa acontecer.

Terceiro exemplo: select com any


select nome_curso, preco
from cursos
where preco < Any
(select preco from cursos where upper(nome_curso) like 'DELPHI%')
and upper(nome_curso) not like 'DELPHI%';

Sada:
NOME_CURSO
PRECO
--------------------------------------------- --------Redes I
0
Introduo a Sistemas Operacionais
0
Anlise Orientada por Objetos
0
Redes II
0

A consulta anterior retorna os cursos que no sejam de Delphi, que


tenham preo menor que qualquer curso de Delphi.

Quarto exemplo: select com all


select nome_curso, preco
from cursos
where preco > all
(select preco from cursos where upper(nome_curso) like 'DELPHI%')
and upper(nome_curso) not like 'DELPHI%';

NOME_CURSO
PRECO
--------------------------------------------- --------Introduo Lgica de Programao
800
Fundamentos da Modelagem de Dados
950
Oracle: SQL*Plus Worksheet e SQL
825
Oracle: PL/SQL
825

A consulta anterior retorna os cursos que no sejam de Delphi, que


tenham preo maior que todos os cursos de Delphi.
Ateno para o quadro comparativo:
A expresso eqivale a:
< any
menor
que
o
maior
< all
menor
que
o
menor
> any
maior
que
o
menor
> all
maior que o maior
Oracle 9i Fundamental

105

<> any
= any

not in
In

7.4 - Subqueries de Mltiplas Colunas


Primeiro exemplo: update
update cursos
set (carga_horaria, preco) =
(select carga_horaria, preco from cursos where cod_curso = 2)
where cod_curso = 1;

Este comando atualiza o curso de cdigo 1 com valores do curso 2.


No se esquea de verificar se as colunas especificadas em set conferem
com as da subquery.

Segundo exemplo: select com in


select nome_curso, carga_horaria, preco, pre_requisito
from cursos
where (carga_horaria, preco) in
(select carga_horaria, preco from cursos
where pre_requisito is not null);

Sada:
NOME_CURSO
CARGA_HORARIA
PRECO PRE_REQUISITO
------------------------------- ------------- --------- ------------Delphi: Recursos Bsicos
24
400
1
Delphi: Acesso a bancos de Dados
24
400
1
Oracle: PL/SQL
24
825
8
Oracle: SQL*Plus Worksheet e SQL
32
825
2

Observe que so retornados cursos cujo par carga horria-preo esteja no


conjunto de cursos que possuam pr-requisito. Para facilitar a
compreenso, execute-as em separado, visualize o resultado, e depois
emita o comando anterior.

7.5 - Subqueries Correlatas18


Supondo que existam mais duas tabelas, SALAS e TIPOS_SALAS, e uma
view, V_SALAS, que mostrem a mdia de alunos por tipo de sala. Eis
V_SALAS:
create view v_salas
as
select s.descricao sala, t.descricao tipo_sala, count(matricula) Alunos
from tipos_salas t inner join salas s on t.cod_tipo_sala = s.tipo_sala
join turmas tu on s.cod_sala = tu.sala

18

As tabelas SALAS e TIPOS_SALA podem ser montadas e alimentadas a partir do script


Monta_Tabelas_Salas.sql.

Oracle 9i Fundamental

106

join historico h on tu.cod_turma = h.cod_turma


group by s.descricao, t.descricao;

Listando seus dados:


SALA
-----------------------------Ceres
Jupiter
Marte
Mercurio
Netuno
Terra
Urano
Venus

TIPO_SALA
ALUNOS
------------------------------ ---------Luxo
10
Bsica
10
Padro
20
Bsica
10
Padro
10
Luxo
10
Padro
10
Bsica
20

A mdia de alunos por tipo de sala seria assim obtida:


select tipo_sala, avg(alunos) Media
from v_salas
group by tipo_sala;
TIPO_SALA
MEDIA
------------------------------ ---------Bsica
13,3333333
Luxo
10
Padro
13,3333333

Teramos como visualizar as salas cuja quantidade de alunos supera a do


tipo:
select sala, tipo_sala, alunos
from v_salas v
where alunos >
(select avg(alunos) from v_salas where tipo_sala = v.tipo_sala);
SALA
-----------------------------Marte
Venus

TIPO_SALA
ALUNOS
------------------------------ ---------Padro
20
Bsica
20

Observe que a utilizao do campo v.tipo_sala na subquery caracteriza a


correlao e determina uma forma de execuo diferente: para cada linha
externa executa-se a subquery interna.
Ao lidar com grandes tabelas, pode ocorrer que a execuo da subquery
correlata seja mais lenta que a criao de uma tabela auxiliar e execuo
de uma consulta com join. Pode-se facilmente comprovar isto ativando a
opo timing do SQL*Plus Worksheet: set timing on/off.

Segundo exemplo: update


A prxima seqncia de comandos tem por objetivo desnormalizar a tabela
de salas, acrescentando-lhe uma nova coluna:
alter table salas add (tipo varchar2(30));
update salas
set tipo =
(select descricao from tipos_salas
where cod_tipo_sala =salas.tipo_sala);

Oracle 9i Fundamental

107

A confirmao e a sada esto em seguida:


select descricao, tipo from salas;
DESCRICAO
-----------------------------Mercrio
Vnus
Terra
Marte
Ceres
Jpiter
Saturno
Urano
Netuno
Pluto
10 rows selected.

TIPO
------------------Bsica
Bsica
Luxo
Padro
Luxo
Bsica
Bsica
Padro
Padro
Luxo

Terceiro exemplo: exists


No exemplo seguinte, caso cod_cliente tivesse valores nulos, seria mais
confivel utilizar o operador exists em lugar de in. Em vez de:
select nome_instrutor
where cod_instrutor
(select cod_instrutor
where t.cod_instrutor

from instrutores i
not in
from turmas t
= i.cod_instrutor);

NOME_INSTRUTOR
----------------------------Matias Agena

seria melhor:
select nome_instrutor from instrutores i
where not exists (select cod_instrutor from turmas t
where t.cod_instrutor = i.cod_instrutor);

ou, mais eficiente:


select nome_instrutor from instrutores i
where not exists (select 1 from turmas t
where t.cod_instrutor = i.cod_instrutor);

EXERCCIOS
1. Atualize o campo Nota do Sr. Zebedeu para 8.5 na turma 1.
2. Atualize o campo Nota dos Srs. Yamandu, Wellington e Tadeu para 7
em todas as turmas.
3. D nota 8 a todos os alunos que cursaram Delphi.
4. Aumente 20% o preo do curso que teve mais alunos.
5. Acrescente um campo em Cursos que mostre o total arrecadado.
6. Mostre os pares instrutor-curso que pertenam ao grupo de instrutores
que ministra Delphi.

Oracle 9i Fundamental

108

ANOTAES

Oracle 9i Fundamental

109

Captulo 8 PROGRAMAO CLIENTE/


SERVIDOR
OBJETIVOS

Destacar a evoluo da atividade de criar programas sob enfoque


Cliente/Servidor;
Apresentar as principais caractersticas da linguagem de
programao PL/SQL;
Diferenciar as unidades de programa PL/SQL: procedures,
functions, packages e triggers;
Criar Procedures e Functions com SQL*Plus Worksheet.

ARQUIVOS NECESSRIOS

08_Ex_Proc.sql;
08_Ex_Func.sql.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso bases Oracle;
Conhecer os principais objetos Oracle: tabela, ndice, constraint,
viso e se-qncia;
Programar em qualquer linguagem que comporte tipos bsicos de
proces-samento: seqncia, deciso, iterao.

MOTIVAO
Criando Programas sob Enfoque Cliente-Servidor
Com a exploso do poder computacional dos microcomputadores, as
mquinas clientes passaram a ter uma performance prxima dos
Servidores. Com isto, as aplicaes comearam a ser divididas, sendo
que parte era executada no Servidor, parte era executada nos
19

Consulte no Apndice C, Bibliografia Comentada,


Application Server e assuntos correlatos.

livros

Oracle 9i Fundamental

que

tratam

do

Oracle

110

Clientes. O que parecia ser uma grande idia (Servidor mais "livre")
trouxe tambm srios problemas: os processos de instalao e
manuteno tornaram-se atividades extremamente vulnerveis.
Na verdade, essa discusso ainda gera muita polmica. H os que
preferem Clientes "gordos" e h os que exaltam as vantagens dos
"magros". Sugiro um meio termo: algo como 70% no Servidor e 30% nos
Clientes.
Hoje aplicaes nascem no apenas em duas camadas, mas em
vrias. Por exemplo: existe a interface, magrrima, em browser que se
conecta a um Servidor HTTP. Este, por sua vez pode se conectar a um
Servidor de Aplicaes que, por sua vez, far acessos ao Servidor de
Dados.
Com a exploso da Internet, nos ltimos anos ganharam fora
produtos que criam uma completa infra-estrutura para
desenvolvimento de portais, aplicaes voltadas para o comrcio
eletrnico, etc. Um belo exemplo o Oracle Application Server (O9iAS),
que j est na segunda verso. Infelizmente, esse interessante
produto est alm do escopo desta obra19.
A programao predominantemente no Servidor consiste na criao
de novos objetos de Banco de Dados: Stored Procedures, Functions e
Triggers, que proporcionam algumas vantagens:

Se muitos programas compartilharem um Banco de


Dados e houver funcionali-dades que lidem com o
banco, comuns a eles, ento possvel implement-las
no Servidor, evitando redundncia de cdigo;
Caso seja necessrio executar vrias vezes um grupo de
comandos SQL consecu-tivos, convm criar um bloco,
compil-lo e armazen-lo no Servidor. Isto trar um
evidente ganho de performance, j que sero realizados
menos acessos pela rede;
De uma forma geral, o software de Banco de Dados
mais estvel do que uma ferramenta de programao,
ou seja, mais provvel uma determinada empresa
mudar de um Visual Basic para um Delphi do que de
um Oracle para um SQL Server;
O trfego de rede pode ser drasticamente reduzido.
Imagine um grupo de coman-dos PL/SQL (SELECTs,
INSERTs, etc.) que, juntos, possuem 200 caracteres.
Chamados por, digamos, vinte usurios trinta vezes ao
dia, isto representa pouco mais de 1 MB onerando a
rede. Agora imagine que pudssemos "empacotar" os
200 caracteres em uma Stored Procedure com 10 letras.
O trfego cairia para pouco menos que 6 KB;
Oracle 9i Fundamental

111

O problema recm-mencionado levanta outro ponto importantssimo: a


simpli-cidade. O que deve ser mais legvel para um programa: um
grupo de comandos com 200 caracteres ou uma simples ativao de
Stored Procedure?
Finalmente, a Segurana pode ser bastante incrementada j que
programas no precisariam emitir comandos, tais como: INSERTs ou
DELETEs. Isto ficaria a cargo de Stored Procedures ou Functions que,
de quebra, ainda poderiam realizar crticas sofisticadas.
A linguagem PL/SQL gera rotinas compiladas no Servidor Oracle;
portanto, os prximos captulos giram em torno da programao no
Servidor.

TEORIA
8.1 - PL/SQL
A linguagem de programao Procedural Language/Structured Query
Language (PL/SQL) une o estilo modular de linguagens, como Pascal e C,
versatilidade no acesso a bancos de dados obtida via SQL. Trata-se de uma
escolha bvia para quem deseja programar parte de uma aplicao no
Servidor Oracle.
Alm do ganho de performance j discutido, a utilizao da PL/SQL
apresenta outras vantagens:
Modularidade: no existe o conceito de programa nico e
monoltico. Qualquer poro de cdigo deve residir em blocos,
geralmente pequenos. Isto facilita o desenvolvimento de grandes
projetos feitos por vrios profissionais;
Tipos de Processamento: como toda linguagem dita procedural,
a PL/SQL permite criar estruturas de programao, tais como:
deciso (if/else) e repe-tio (loop, while e for);
Variveis: podem-se utilizar desde as de tipos primitivos (char,
number, boolean) at as compostas (registros e vetores).
Inclusive, pode-se associar o tipo de uma varivel ao de um
campo de tabela;
Packages: vrias rotinas afins podem ser agrupadas fisicamente
de maneira que os detalhes da implementao fiquem
encapsulados do mundo exterior. O prprio Oracle Server oferece
diversos packages prontos que estendem a funcionalidade da
PL/SQL;
Excees: quando ocorrerem erros de execuo (diviso por zero,
contedo de chave primria duplicado), mensagens explicativas
podem ser emitidas para que o usurio tome as medidas
corretivas necessrias.
Oracle 9i Fundamental

112

A criao de rotinas PL/SQL pode ser realizada em diversas ferramentas:


desde a simples SQL*Plus, passando por uma melhoria (SQL*Plus
Worksheet), at grficas como SQL Navigator ou Oracle Forms. Por criao
entende-se a compilao e armazenamento no Servidor. A seguir,
discutimos as principais caractersticas dessas quatro ferramentas:

SQL*Plus

Interface de linha, geralmente os cdigos so editados


parte em um editor como Bloco de Notas. No possui
facilidades de depurao (breakpoints, execuo passo a
passo, etc.) e a compilao feita no Servidor. Mais
detalhes no Apndice A.

SQL*Plus
Worksheet

Verso melhorada da tradicional SQL*Plus, possui mais


facilida-des de edio.

SQL Navigator

Interface grfica, editor poderoso, depurao e vasto


material de ajuda para desenvolver em PL/SQL. Compila
no cliente. Muito utilizado para desenvolvimento de
Stored Procedures e Triggers. Obtenha uma verso trial
em www.quest.com

Oracle Forms

Integrante
do
pacote
Developer,
desenvolvimento de aplicaes completas.

permite

Nos prximos captulos sero utilizadas as ferramentas SQL*Plus


Worksheet e SQL Navigator.

8.2 - PL/SQL ou Java?


Um freqente argumento utilizado contra a utilizao da linguagem
PL/SQL reside no fato de ela ser "proprietria" do ambiente Oracle, isto ,
se por acaso for necessria uma migrao para outro SGBDR, todo o
trabalho realizado na criao de Stored Procedures, Triggers ou Functions
ter sido praticamente em vo. Pensando nesta pouca propenso
portabilidade da sua linguagem de programao, a Oracle apresentou uma
importante novidade na verso 8 de seu SGBDR: a possibilidade de criar
"programas" tambm na popularssima e portvel por excelncia, Java.
Java foi criada a partir de outra famosa linguagem: a C++, cuja principal
caracterstica consiste em criar linhas de cdigo que facilmente possam ser
integradas em qualquer ambiente. Utilizando Java, pode-se tirar pleno
proveito do Paradigma da Orientao por Objetos20 e assim desenvolver
componentes que sigam o padro CORBA, por exemplo.
A questo, portanto, no est em escolher PL/SQL ou Java. Ambas
representam poderosas linguagens e cada uma atende muito bem a um
grupo especfico de problemas. Para atender a requisitos intrinsicamente

20

Para saber mais detalhes sobre o POO, no deixe de ler a Motivao do captulo 17,
muito bem escrita por Luiz Paulo Maia.

Oracle 9i Fundamental

113

ligados a Bancos de Dados, PL/SQL! Para criar pores de cdigo


genricas, que precisem ser executadas em diferentes ambientes, Java!
Evidentemente, a Oracle fez o possvel para que a integrao entre as duas
linguagens acontea da forma mais branda possvel, assim, facilmente
pode-se chamar uma rotina Java a partir de uma unidade de programa
escrita em PL/SQL e vice-versa.
Como a linguagem Java possui aplicaes mais distantes dos Bancos de
Dados, no a discutiremos neste livro. Mas, no deixe de consultar o
Apndice C no qual consta uma extensa bibliografia comentada, inclusive
com livros abordando Java.

8.3 - Unidades de Programa


Como j foi mencionado, trabalhar em PL/SQL consiste basicamente em
criar pequenos e coesos blocos de cdigo denominados Unidades de
Programa. De uma forma geral, um bloco possui a seguinte estrutura:
[declare]

Seo de declaraes de variveis, constantes e cursores (grupo de linhas


de uma ou mais tabelas). Tambm acontecem inicializaes.
begin

Seo em que so colocados os comandos SQL e as estruturas de


programao (if, while, etc.).
exception

(opcional)

Identificao dos erros e emisso de mensagens.


end;

Existem quatro tipos de Unidades de Programa:


Procedure

Bloco de comandos que pode receber parmetros de entrada ou de


sada. Ativado como se fosse um comando da linguagem. Veja item
8.4 para maiores detalhes.

Function

Bloco de comandos que pode receber parmetros apenas de entrada e,


necessariamente, retorna um valor em seu nome. A ativao ocorre em
expresses. Veja item 8.5 para maiores detalhes.

Package

Reunio fsica de procedures, functions e cursores. Dividido em duas


partes: especificao e corpo. Na primeira realizam-se as declaraes
de membros pblicos e na segunda implementa-se o cdigo dos blocos
e declaram-se variveis privativas. Mais detalhes no captulo 15.

Trigger

Rotina disparada automaticamente antes ou depois de comandos


UPDATE, INSERT ou DELETE. Muito utilizados para auditoria,
crticas sofisticadas e controle de integridade referencial. Veja o
captulo 16 para obter mais informaes.
Oracle 9i Fundamental

114

Eventualmente podem existir blocos dentro de outros blocos. So os ditos


Annimos e servem para destacar uma determinada funcionalidade do
resto.

8.4 - Procedures
Pequenas pores de cdigo que realizam tarefas especficas e ativadas
como comandos. Elas podem receber parmetros de entrada, sada ou
entrada e sada.
Para criar uma procedure no SQL*Plus Worksheet, devemos digitar ou
abrir um arquivo texto contendo a seguinte estrutura:
CREATE OR REPLACE NOME_PROCEDURE (lista de parmetros opcional)
IS
Declaraes locais
BEGIN
Comandos
END;

Exemplo
create or replace procedure AlimentaHistorico
(ultima_turma in number, ultimo_aluno in number)
is
begin
delete historico; /*comentrio: elimina registros atuais */
for i in 1..ultima_turma loop
for j in 1..ultimo_aluno loop
insert into historico (cod_turma, matricula) values (i,j);
end loop;
end loop;
commit;
End;
/

Observaes

As palavras or replace so opcionais, entretanto, caso no sejam


utilizadas e a procedure j existir, devemos exclu-la
explicitamente antes de recri-la;
A rotina anterior recebe dois parmetros numricos de entrada.
Caso ela devolva outro, a segunda linha mudaria para:

(ultima_turma in number, ultimo_aluno in number, afetadas out number)

Quando um parmetro for de entrada e sada, utilizam-se as


palavras in out.
Deve-se frisar que tanto nas passagens de parmetro por valor (in) como
por referncia (in out ou out), o contedo do argumento ser copiado

Oracle 9i Fundamental

115

para uma rea em memria. Isto pode se tornar um problema para


argumentos que contenham muitos bytes. Uma alternativa seria a
utilizao da palavra reservada nocopy que procura, sempre que
possvel, no fazer uma cpia do argumento passado:
(ultima_turma in number, ultimo_aluno in number, afetadas out NOCOPY
number)

A execuo da rotina apresentada pode ser:


exec alimentahistorico (10, 10);

Para verificar a existncia de uma procedure, deve-se investigar a viso


user_objects:
select object_name
from user_objects where object_type = 'PROCEDURE';

E a sada:
OBJECT_NAME
---------------------------------------------------------ALIMENTAHISTORICO

Observe que foi utilizado o comando delete em vez de truncate table,


como talvez fosse mais aconselhvel. Isto acontece pela
impossibilidade de utilizar comandos que encerrem transaes, tais
como: create, alter, drop e o prprio truncate table. Esta limitao ser
contornada utilizando SQL dinmica, como veremos no captulo 11.

8.5 - Functions
Enquanto procedures podem receber vrios parmetros de entrada, sada
ou entrada--sada, functions apenas recebem parmetros de entrada e
devolvem um valor em seu nome.
Para criar uma function no SQL*Plus Worksheet, devemos editar um
arquivo texto contendo a seguinte estrutura:
CREATE OR REPLACE NOME_FUNCTION (lista de parmetros de entrada opcional)
RETURN tipo de retorno
IS
Declaraes locais
BEGIN
Comandos
END;

Exemplo
create or replace function ValorEmDolar
(reais in number, cotacao in number)

Oracle 9i Fundamental

116

return number
is
begin
return reais/cotacao;
end;
/

Observaes
As palavras or replace so opcionais, entretanto, caso no sejam utilizadas e
a function j existir, devemos exclu-la explicitamente antes de recri-la.
A execuo da funo anterior pode ser:
column nome_curso format a40
select nome_curso, preco "Em R$", ValorEmDolar(preco, 2.70) "Em US$"
from cursos;

E a sada:
NOME_CURSO
Em R$
Em US$
---------------------------------------- ---------- ---------Introduo Lgica de Programao
950 351,851852
Fundamentos da Modelagem de Dados
950 351,851852
...
Redes II
0
0

Para verificar a existncia de uma function, deve-se investigar a viso


user_objects:
select object_name
from user_objects where object_type = 'FUNCTION';
OBJECT_NAME
---------------------------------------------------------VALOREMDOLAR

Uma funo pode ser ativada a partir de um comando SQL do tipo DML
(DDL, no) nas clusulas where, having, order by, group by em select; values
em insert; set em update e where em delete. Quando isto ocorrer, a funo
no pode ter comandos SQL e os tipos passados ou de retorno devem ser
compatveis com o Oracle Server.
Tambm deve-se observar que quem emitir um comando SQL possuindo
uma function e no for o dono dela, deve possuir privilgio de execuo.
Mais detalhes no Captulo 24, Segurana.
A seguir, veremos outras formas de execuo. Primeiro declaramos duas
variveis:
variable cotacao number
variable em_dolares number

Atribuindo valores:
exec :cotacao := 2.70

Oracle 9i Fundamental

117

exec :em_dolares := ValorEmDolar(1000, :cotacao)

Exibindo:
print em_dolares
EM_DOLARES
---------370,37037

Outra forma:
select ValorEmDolar(2000, 2.70) from dual;
VALOREMDOLAR(2000, 2.70)
----------------------740,740741

O cdigo-fonte de uma function (ou procedure tambm) pode ser


visualizado a partir da viso user_source:
select text from user_source where name = 'VALOREMDOLAR';
TEXT
----------------------------------------------------------function ValorEmDolar
(reais in number, cotao in number)
return number
is
begin
return reais/cotao;
end;

EXERCCIOS
1. Construa uma function que receba um nmero e devolva-o dobrado.
Por exemplo, se a entrada for 5, a sada dever ser 10.
Caso existam erros, mostre-os com SHOW ERRORS.
2. Faa uma procedure que receba um nmero e mostre seu dobro.
Ative a funo j criada.
Para exibir um valor, utilize a procedure embutida put_line que
pertence ao package embutido DBMS_OUTPUT. Por exemplo:
dbms_output.put_line(to_char(6));

No se esquea de ligar a varivel de ambiente SERVEROUTPUT.

Oracle 9i Fundamental

118

3. Permita que a procedure seja ativada sem argumentos.


Para que isto seja possvel, o argumento deve aceitar valor
default. Por exemplo:
create or replace procedure ChamaDobra
(ent in number default 150)

4. Mostre o dobro dos preos dos cursos.


5. Constate o armazenamento no Servidor dos objetos recm-criados.
Investigue as vises USER_OBJECTS e USER_SOURCE.

REFERNCIA RPIDA
Tarefa

Como fazer

Criar uma procedure

Utilize o comando create or replace procedure. Veja


exem-plo no item 8.4.

Eliminar uma
procedure

Utilize o comando drop procedure.

Criar uma function

Utilize o comando create or replace function. Veja exemplo no item 8.5.

Eliminar uma
function

Utilize o comando drop function.

Listar procedures ou
functions criadas

Inspecione a viso USER_OBJECTS, filtrando o campo


OBJECT_TYPE para PROCEDURE ou FUNCTION.

Listar o cdigo-fonte
das procedures ou
functions criadas

Inspecione a viso USER_SOURCE, filtrando o campo


NAME para o nome da procedure ou function desejada.

Oracle 9i Fundamental

119

Captulo 9 SQL NAVIGATOR


OBJETIVOS

Carregar em memria a ferramenta SQL Navigator e conectar-se


ao Servidor;
Identificar os elementos do ambiente do SQL Navigator;
Criar procedures e functions no SQL Navigator;
Utilizar o help do SQL Navigator.

ARQUIVOS NECESSRIOS

08_Ex_Proc.sql;
08_Ex_Func.sql.

PR-REQUISITOS

Compreender as conseqncias da programao no Servidor;


Diferenciar os tipos de Unidades de Programa da linguagem
PL/SQL;
Criar procedures e functions com SQL*Plus Worksheet.

TEORIA
9.1 - Fundamentos
SQL Navigator um software que permite o desenvolvimento de Unidades
de Programa PL/SQL. Trata-se de uma ferramenta cliente ao Servidor
Oracle, assim como o SQL*Plus Worksheet, entretanto, ao contrrio deste,
possui um ambiente de desenvolvimento completo. Assim, no h
necessidade de recorrer a editores de texto externos, como o Bloco de
Notas.
Existe uma srie de vantagens adicionais em relao ao SQL*Plus
Worksheet:
A interface grfica, organizada em janelas, portanto bem mais
amigvel;
O desenvolvimento de Unidades de Programa pode ser efetuado
localmente, j que possui um compilador PL/SQL embutido;
H recursos que permitem realizar depurao de Unidades de
Programa, ou seja, possvel interromper a execuo em uma
Oracle 9i Fundamental

120

determinada linha (breakpoint), inspecionar valores de variveis,


alter-los, etc.
Infelizmente, o SQL Navigator deve ser adquirido de forma independente do
Servidor, entretanto possvel obter uma verso demo com validade de
trinta dias no stio www.quest.com21. Em fevereiro de 2002, estava
disponvel a verso 4.2.
O SQL Navigator pode ser utilizado em
qualquer Windows. Uma vez instalado em
um ambiente Windows 2000, por exemplo,
devemos localizar o comando: Start,
Programs, Quest Software, SQL Navigator
4, SQL Navigator 4.
Antes que seja possvel manipular qualquer
objeto do Servidor, deve-se realizar uma
conexo como mostra a figura ao lado.

9.2 - Elementos do Ambiente


9.2.1 - DB Navigator
A janela mais importante do ambiente a do
DB Navigator, ativada teclando F12:
Esta janela mostra uma conexo ativa, por
isso, caso seja fechada, encerra-se a sesso
correspondente. Ela permite o acesso a
qualquer objeto "visvel" da sesso corrente:
tabelas com seus campos, vises, unidades de
programa, etc.
Por exemplo, poderamos editar o contedo da
tabela ALUNOS! Siga o caminho: expanda My
Schema, depois Tables. Clique com o boto
direito sobre Alunos e escolha a opo Edit
Data. O resultado pode ser algo assim:

21

Consulte o Apndice F para conhecer outros stios de fabricantes de


ferramentas similares ao SQL Navigator. Por exemplo, no deixe de visitar
www.precise.com nem www.leccotech.com.

Oracle 9i Fundamental

121

O SQL Navigator pode manter vrias sesses simultaneamente, cada uma


com sua janela DB Navigator.
Procedures ou Functions j criadas podem ser visualizadas ativando o item
My Schema, Procedures ou My Schema, Functions. Clicando com o
boto direito do mouse sobre o nome da procedure ou function e
escolhendo o comando Open, ativa-se o Stored Program Editor, um dos
tantos ambientes de edio responsveis pela criao e alterao de
objetos.

9.2.2 - Stored Program Editor


Alm do DB Navigator, o SN trabalha com vrios editores que podem ser
acessados pelo menu View, Visual Object Editor. Um dos mais
importantes o editor de programas que serve para trabalhar procedures,
functions ou Packages.
A figura seguinte mostra a edio da procedure AlimentaHistorico que foi
previa-mente criada pelo SQL*Plus Worksheet.

Observe a variedade de cores apresentada no cdigo, cada uma revelando


uma ca-racterstica do texto editado.
Oracle 9i Fundamental

122

Uma vez selecionada a Unidade de Programa, possvel edit-la e compilla. Como o SQL Navigator possui um compilador PL/SQL embutido, o
Servidor no onerado nesta atividade.
Para executar o cdigo mostrado, tecle F9. Ser mostrado um miniassistente que permitir caracterizar a execuo da rotina. Neste caso em
particular, pea para editar o resultado final, pois argumentos devem ser
informados. O resultado final, j editado, poderia ficar assim22:

9.2.3 - SQL Editor


A ltima figura mostra o SQL Editor (View, New SQL Editor) que permite
testar pores de cdigo isoladas. Veja outro exemplo:

9.2.4 - Trigger Editor


22

A clusula EXCEPTION ser explicada em detalhes no captulo 14.

Oracle 9i Fundamental

123

Finalmente, existe um editor especfico para Triggers, assunto visto em


detalhes no captulo 16:

Para chegar janela mostrada na figura anterior, siga o caminho: menu


View, Visual Object Editor, Trigger Editor; depois escolha o dono das
tabelas (Parent Schema) e a tabela (ALUNOS, por exemplo). Aguarde o
captulo 16 para saber mais!

EXERCCIOS
1. Ative o SQL Navigator e conecte-se ao Servidor.
Novas conexes podem ser obtidas pelo comando
Session.

Session, New

2. Analise as possibilidades de ajuda oferecidas pelo SQL Navigator.


No menu Help esto, entre outras, trs possibilidades: Contents,
Context Help e How to use Help.
Aprenda um pouco mais sobre o DB Navegador.
3. Abra a funo criada no captulo anterior.
Pelo DB Navegador, item My Schemas, localize-a no item Functions.
Clique com o boto direito sobre ela e selecione Open.
Provoque um erro de compilao e tente salv-la.
4. Execute a funo.
Pelo SQL Editor ative-a: select (to_char(dobra(10))) from dual
5. Altere a funo para que aceite um parmetro default.
Utilize o Stored Program Editor.

Oracle 9i Fundamental

124

REFERNCIA RPIDA
Tarefa

Como fazer

Ativar o SQL Navigator

Localize-o pelos menus a partir do Iniciar (Start) ou


execute o arquivo SQLNAV4.EXE.

Conectar-se ao Servidor

Ao carregar o SQL Navigator, fornecer usurio, senha


e host string. Novas conexes podem ser obtidas pelo
comando Session, New Session. Em caso de dvidas,
consulte o administrador.

Ativar
editores
ambiente

Ative comandos do menu View, Visual Object Editor.

do

Localizar um objeto

DB Navigator; My Schema. possvel inspecionar


tabelas, vises, seqncias, sinnimos, procedures,
funes e Packages.

Ativar o Help

Menu Help, Contents ou tecle F1.

Oracle 9i Fundamental

125

Captulo 10 VARIVEIS
OBJETIVOS

Compreender como PL/SQL implementa o conceito de varivel;


Declarar variveis de tipos escalares ou compostos;
Identificar o escopo de uma varivel;
Manipular variveis.

ARQUIVOS NECESSRIOS

10_Vetores.sql;
10_Escopo.sql.

PR-REQUISITOS

J ter trabalhado com variveis em alguma linguagem de


programao;
Diferenciar os tipos de Unidades de Programa da linguagem
PL/SQL;
Criar procedures e functions com SQL*Plus Worksheet ou SQL
Navigator.

TEORIA
10.1 - Fundamentos
Variveis possuem inestimvel valor em qualquer linguagem de
programao. Com elas possvel, temporariamente, armazenar valores
para que possam ser manipu-lados depois. Para que uma varivel exista,
deve possuir quatro caractersticas:

Nome

Identificao da varivel na Unidade de Programa. Deve ser


claro, isto , revelar a funo da varivel.
Exemplos: nome_cliente, valorTotal, media_salarios

Tipo

Conjunto de valores que pode assumir (numrico, texto, data,


lgico). H os embutidos e os criados. Veja prximo item para
obter uma lista detalhada dos tipos fornecidos pela PL/SQL.

Endereo

Posio em memria ocupada pela varivel. Esse dado


Oracle 9i Fundamental

126

transparente ao programador.
Contedo

Valor que uma varivel possui em um determinado instante.

Para que uma varivel possa ser utilizada, ela deve ser previamente
declarada. Esta operao consiste na especificao de nome, tipo e,
eventualmente, contedo inicial. Toda declarao ocorre na seo de
declaraes da Unidade de Programa (entre is e begin).
A linguagem PL/SQL trabalha tanto com alocao esttica quanto
dinmica. No primeiro caso, o espao de memria previamente reservado
antes da execuo e, no segundo, podem acontecer requisies durante a
execuo. Este livro trata do primeiro caso, apenas.
Quanto ocupao de memria, variveis podem ser simples (escalares) ou
compostas. Enquanto variveis simples ocupam uma posio de memria,
as compostas consistem em grupos de variveis, como, por exemplo:
vetores (todas do mesmo tipo e identificadas por ndice), registros (tipos
diferentes, identificadas por nome) ou objetos (dados e procedimentos
definidos na mesma estrutura).
Deve-se ainda destacar a presena de tipos voltados para dados extensos
(Large Objects). Assim, existem: CLOB e NCLOB (grandes cadeias de
caracteres), BLOB (dados binrios) e BFILE (referncia a um arquivo
externo).

10.2 - Tipos Escalares


Como j mencionado, variveis de tipos escalares caracterizam-se por
conterem apenas um valor de cada vez. Existem quatro subtipos:
numricos, textos, data e lgico. A tabela seguinte destaca os mais
importantes:
Tipo

Descrio

Char (n)

Cadeia de caracteres com tamanho fixo n. O default 1 e o


mximo, 32.767. Deve-se observar que o tipo equivalente no
Servidor armazena at 2.000 posies.

Varchar2 (n)

Cadeia contendo caracteres de tamanho varivel com o mximo


de n, em que n pode ter o valor de at 32.767. Novamente h
uma limitao: no se pode atribuir o contedo de uma varivel
deste tipo a um campo varchar2, j que este somente aceita at
4.000 posies. Para que duas variveis desse tipo sejam
consideradas iguais, elas devem possuir, alm do mesmo
contedo, o mesmo tamanho.

Long

Antigo tipo, em vias de extino. Armazena at 32.760


caracteres.

Raw e
Long raw

Tipos antigos que devem ser migrados para blob assim que
possvel.

Oracle 9i Fundamental

127

Tipo

Descrio

Number (p,e)

Valores numricos em que p indica a preciso (mximo de 38); e


indica a escala (nmero de casas decimais) que varia de 84 a
+127. Por exemplo, number (5,2) especifica um nmero na faixa
entre -999,99 e +999,99.

Binary_
Integer

Valores numricos inteiros com sinal. Faixa: -231 a +231

Date

Armazena data e hora, incluindo sculo, ano, ms, dia, hora,


minuto e segundo. Intervalo: 1/1/4712 a.C. at 31/12/9999.
Campos deste tipo ocupam 7 bytes.

Timestamp

Permite armazenar datas/horas com maior preciso (mxima:


9, default: 6). Por exemplo, caso seja necessrio especificar
milsimos de segundo, a preciso deve ser 3.

Interval Year
(p) to month

Armazenam intervalos de tempo em anos/meses. P representa a


quantidade de dgitos para o ano (possveis: 0 a 9, default: 2).
Intervalos podem ser obtidos, por exemplo, ao subtrair uma
data de outra.

Interval Day
(dp) to second
(sp)

Armazenam intervalos de tempo em dias, horas, minutos e


segundos. DP representa a quantidade de dgitos para o dia
(possveis: 0 a 9, default: 2). SP representa a quantidade de
dgitos para o segundo (possveis: 0 a 9, default: 6).

Boolean

Aceita apenas os valores: TRUE, FALSE ou NULL.

Alguns tipos possuem especializaes (subtipos). Por exemplo, em vez de


number podem ser utilizados: integer, int ou smallint (nmeros inteiros com
at 38 dgitos); real, double precision ou float (representao em ponto
flutuante); dec, decimal ou numeric (armazenados em ponto fixo).
A declarao de uma varivel escalar se faz especificando:
nome da varivel;
modificador constant (opcional), caso o valor no possa mudar
durante a execuo;
tipo;
modificador not null (opcional), caso a varivel no possa receber
null;
atribuio (opcional).
Veja alguns exemplos:
total_arrecadado
number(7,2) := 100;
idade
number(3) := 50;
max_alunos
constant
number(4) := 2000;
nome
varchar2(20);
aposentado
boolean not null := false;
periodo
interval year(3) to month := '101-3';
-- A varivel acima representa um intervalo de 103 anos e trs meses.
data_corrente
date :=sysdate;

Oracle 9i Fundamental

128

O SQL Navigator procura facilitar o ato de declarar variveis de alguns


tipos. Execute. View, Code Assistant. Na pequena janela aberta, clique em
Sintax and Web Catalog, depois expanda: Sintax, PL/SQL Syntax e Data
Types. Finalmente, basta localizar o tipo desejado e arrast-lo para a
janela de cdigo.
Uma varivel pode ser declarada como sendo do mesmo tipo que um campo
de tabela:
preco

cursos.preco%type := 200;

Durante a execuo, variveis que no tiverem sido caracterizadas como


constant podem mudar de valor:
...
total_arrecadado
aposentado

:= total_arrecadado + 300;
:= (idade >=65);

10.3 - Tipos Compostos


10.3.1 - Vetores (Tables)
Um vetor, ou table para PL/SQL, representa um conjunto, a princpio
ilimitado, de variveis do mesmo tipo. Cada componente identificado por
um ndice, entretanto as posies no precisam ser imediatamente
consecutivas.
Veja o exemplo seguinte:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

create or replace function ContaMaioresQueMedia


return number
is
type tipo_vetor is table of number(2) index by binary_integer;
lista
tipo_vetor;
i
integer;
soma
integer :=0;
qtos
number := 0;
media
integer;
begin
lista(1) := 78;
lista(2) := 60;
lista(3) := 47;
lista(4) := 50;
lista(5) := 21;
for i in 1..lista.count loop
soma := soma + lista(i);
end loop;
media := trunc(soma/lista.count);
for i in 1..lista.count loop
if lista(i) > media then
qtos:=qtos+1;
end if;
end loop;
return qtos;
end;

Oracle 9i Fundamental

129

Observaes
Os elementos do vetor no precisam ser consecutivos, isto , podemos
criar a posio 3 e depois a 5;
Para criar um vetor, temos previamente que definir um tipo (linha 4).
Obriga--se a utilizao de um indexador, sempre do tipo binary
integer
Ao criar um vetor, no existe limite de componentes. Eles so inseridos
dinamicamente;
As estruturas de programao for e if sero vistas com mais detalhes
no captulo 12.

10.3.2 - Registros (Records)


Freqentemente nos vemos s voltas com a necessidade de manipular
alguns registros de uma tabela, ou parte dela, em memria. Neste caso,
podemos criar um tipo que espelhe a estrutura de uma tabela:
...
type tipo_reg_curso is record
(cod_curso
number(3),
nome_curso
varchar2(60),
carga_horaria number(3),
preco
number(7,2),
pre_requisito
number(3));
reg_curso tipo_reg_curso;

O acesso aos campos pode ser assim:


reg_curso.carga_horaria := 20;

Caso a varivel em memria seja exatamente o registro da tabela, podemos


ter:
reg_curso

cursos%rowtype;

Finalmente, podemos ter a prpria tabela em memria:


...
type tipo_tab_cursos is table of cursos%rowtype
index by binary_integer;
reg_curso tipo_tab_cursos;
...

e um possvel acesso a campos:


reg_curso(1).carga_horaria := 20;

No captulo 13 abordaremos o assunto Cursores que oferece uma forma


alternativa de manipular registros de tabelas em memria.
No captulo 17 trataremos dos Objetos que representam formas
alternativas de armazenamento de dados.
Oracle 9i Fundamental

130

10.4 - Escopo
Toda varivel pode ser manipulada em uma determinada rea de cdigo
que chamamos de escopo. Em princpio, o escopo de uma varivel
compreende as linhas entre o begin e o end de uma Unidade de Programa,
mas h ocasies em que se transcende esta regio. Como veremos no
captulo referente a Packages e depois no de Objetos, uma varivel pode ser
vista por vrias rotinas internas ou at mesmo externas estrutura na
qual est declarada.
Problemas referentes a escopo surgem na utilizao de blocos annimos.
Veja um exemplo extremo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

create or replace procedure EscopoComplicado


is
valor number(2) := 30;
v2
number(3) := 100;
begin
declare /* Aqui comea o Segundo Bloco */
valor
varchar2(15) := 'Agora Texto';
begin
declare /* Aqui comea o Terceiro Bloco */
valor
date := sysdate;
begin
valor := valor +30;
v2:= v2+1;
end;
valor := 'Outro Texto';
v2 := v2+1;
end;
valor := valor + 1;
v2 := v2 +1;
end;

Observaes
O cdigo mostrado apresenta trs blocos aninhados;
No h conflito entre variveis, pois nos bloco no existem declaraes
redundantes;
O escopo da varivel v2 maior que o da de valor declarada nos blocos
internos, que, por sua vez, nada tem a ver com a varivel valor mais
externa;
Qual o valor final de v2?
Para executar o script anterior no SQL Navigator, ative o comando
View, New SQL Editor, carregue o arquivo em questo, e execute-o
com F9. Para executar a rotina criada, abra uma nova janela e
digite:
begin
EscopoComplicado;
end;

Nenhuma sada ser mostrada.

Oracle 9i Fundamental

131

EXERCCIOS
1. As declaraes apresentadas em seguida esto corretas? Se no
estiverem, explique a razo.
a. v1, v2 number(2);
b. v3
number(3) := 1000;
c. v4
boolean := 1=1;
d. msg varchar2(100) := 'Ol, ' || user;
2. Crie uma funo que receba um nmero entre 1 e 12 e mostre o nome
do ms equivalente.
Assuma que a entrada ser correta.
Utilize um vetor para armazenar o nome dos meses.
3. Faa uma procedure que receba dois nmeros por parmetro,
armazene-os em duas variveis, depois troque o contedo de uma
varivel pelo contedo da outra.
Os parmetros no podem ser apenas IN ou apenas OUT.
Para ativ-la, utilize o script seguinte no SQL*Plus Worksheet:
var n1 number
var n2 number
exec :n1 := 1
exec :n2 := 4
exec troca (:n1, :n2)
print n1
print n2

4. Qual o erro do cdigo seguinte?


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

create or replace procedure AcheErro


is
valor number(2) := 30;
v2
number(2) := 40;
begin
declare /* Aqui comea o Segundo Bloco */
valor
varchar2(15) := 'Agora Texto';
v3
number;
begin
valor := 'Outro Texto';
v2 := v2+1;
end;
valor := valor + 1;
v2 := v2 +1;
v3 :=4;
end;

5. Crie uma funo que receba trs nmeros por parmetro e retorne a
mdia.

Oracle 9i Fundamental

132

REFERNCIA RPIDA
Tarefa
Declarar
es-calar

uma

Como fazer
varivel

Especifique nome seguido de tipo. Opcionalmente


informe os modificadores constant ou not null e
realize uma atribuio com o operador :=.

Atribuir um valor a uma


va-rivel escalar

Utilize o operador :=.

Declarar uma
com-posta

Inicialmente crie um tipo que revele a estrutura da


varivel, depois faa como se fosse uma varivel
escalar.

varivel

Atribuir um valor a uma


varivel composta (vetor
ou registro)

Para elementos de um vetor, identifique-o pelo


ndice. Por exemplo: vetor(i) := valor;
Duas variveis que sejam do mesmo tipo vetor
podem ter seus contedos trocados.
Para campos de um registro, identifique-o pelo
nome. Exemplo:
registro.campo := valor;

Duas variveis que tenham a mesma estrutura de


registro podem ter seus contedos trocados.

Oracle 9i Fundamental

133

Captulo 11 PL/SQL: SQL


OBJETIVOS

Retornar valores que estejam no Servidor, via Unidades de


Programa;
Incluir dados em tabelas;
Alterar dados;
Eliminar linhas de tabelas;
Executar comandos SQL de forma dinmica.

ARQUIVOS NECESSRIOS

11_Retorna_Info_Curso.sql;
11_Calcula_Total_Arrecadado.sql;
11_Insere_Instrutor.sql;
11_Atualiza_Telefone_Instrutor.sql;
11_Elimina_Inst_Sem_Turmas.sql;
11_Exemplos_SQL_Dinamica.sql.

PR-REQUISITOS

Dominar comandos SQL do tipo DML (Select, Insert, Delete, Update);


Diferenciar os tipos de Unidades de Programa da linguagem
PL/SQL;
Criar procedures e functions que manipulem variveis escalares
ou compostas.

TEORIA
11.1 - Seleo (Select/Into)
Via rotinas PL/SQL possvel manipular os dados de um banco. Na
verdade, PL/SQL a juno de comandos SQL (os de definio, DDL,
somente podem ser executados via SQL Dinmica, como veremos no item
11.5) com PL (fluxo de programao, vistos no prximo captulo). Relembre
o ganho de performance obtido ao "aglutinar" comandos SQL em Unidades
de Programa: o trfego de rede diminui e guardam-se pores "executveis".
Oracle 9i Fundamental

134

A seleo de dados obtida por uma variao do comando select. Veja um


exemplo extrado do arquivo 11_Retorna_Info_Curso.sql:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

create or replace procedure retorna_info_curso


(v_ch in cursos.carga_horaria%type)
is
v_nome cursos.nome_curso%type;
v_preco cursos.preco%type;
begin
select nome_curso, preco
into v_nome, v_preco
from cursos
where carga_horaria = v_ch;
dbms_output.put_line ('curso: '|| v_nome);
dbms_output.put_line ('preo: '|| to_char(v_preco));
end;

No SQL Navigator, para que a rotina put_line do package embutido


dbms_output tenha o efeito esperado, deve-se emitir o comando Session,
Server Output. Uma provvel ativao :
begin
Retorna_Info_Curso(40);
end;

e a sada que surgir na guia Spool, em azul:


Curso: Fundamentos da Modelagem de Dados
Preo: 950

Infelizmente, caso haja mais de um curso com a carga horria fornecida ou


nenhum tenha a carga horria em questo, ocorrem problemas, j que o
comando select/into somente funciona se houver um e apenas um dado por
retornar.
Assim:
Retorna_Info_Curso(32);

resultaria no erro ORA-01422 (retorna-se mais de uma linha). J o


comando:
Retorna_Info_Curso(99);

resultaria no erro ORA-01403 (nenhuma linha retornada).


Estes dois problemas (ORA-01422 e ORA-01403) sero resolvidos com a
utilizao de Cursores, assunto visto no captulo 13. As mensagens
emitidas podem ser mais amistosas, caso estes erros possam ser tratados
(mais detalhes no captulo 14).
Existem situaes em que no h como acontecerem os erros citados.
Analise o exemplo extrado do arquivo 11_Calcula_Total_Arrecadado.sql.
1.
2.
3.
4.
5.

create or replace function calcula_total_arrecadado


return number
Is
v_soma number;
Begin

Oracle 9i Fundamental

135

6.
7.
8.
9.
10.
11.
12.
13.
14.

select sum(preco)
into v_soma
from cursos c, turmas t, historico h
Where c.cod_curso = t.cod_curso
and
t.cod_turma = h.cod_turma;
return v_soma;
end;

Uma possvel execuo no SQL*Plus Worksheet pode ser:


var num number
exec :num := Calcula_Total_Arrecadado

Supondo que a tabela HISTORICO tivesse 100 linhas, o resultado seria:


print num
NUM
--------47000

Observaes
Note que todas as variveis locais (declaradas e parmetros) possuem
prefixo v_. Isto foi feito para diferenci-las de campos de tabelas no
banco. Caso tenham o mesmo nome, o Oracle assume que o campo
est sendo utilizado;
Para que um usurio, que no seja o dono da tabela CURSOS nem da
funo, possa execut-la, deve receber privilgio de execuo. Veja:
nenhuma per-misso na tabela precisa ser concedida!
No SQL Navigator, podemos realizar a seguinte execuo:
begin
dbms_output.put_line(Calcula_Total_Arrecadado);
end;

11.2 - Insero (Insert)


Uma interessante forma de incrementar a segurana de acesso aos dados
de uma tabela consiste em criar pequenas Unidades de Programa, cada
uma realizando uma operao especfica (insero, atualizao, excluso).
Desta forma, o usurio no precisa aprender SQL para manipular os dados
de uma tabela: basta chamar rotinas adequadas.
O arquivo 11_Insere_Instrutor.sql oferece um exemplo de insero:
1.
2.
3.
4.
5.
6.
7.
8.

create or replace procedure insere_instrutor


(v_nome in instrutores.nome_instrutor%type,
v_tel in instrutores.tel_instrutor%type,
v_adm in instrutores.admissao%type)
Is
Begin
insert into instrutores
values (gera_cod_instrutor.nextval, v_nome, v_tel,v_adm);

Oracle 9i Fundamental

136

9.
10.
11.

commit; -- sem este comando, a gravao efetiva no ocorre


end;

E uma possvel execuo:


exec Insere_Instrutor('Luis Becrux','455-7877',sysdate)
select * from instrutores;
COD_INSTRUTOR
------------1
2
3
4
5
6
7
8
9
10
50

NOME_INSTRUTOR
-----------------------------Maria Carolina Sirio
Pedro Paulo Canopo
Augusto Lemos Vega
Mnica Silveira Capela
Almir Altair
Leonardo Guimares Rigel
Beatriz Bellatrix
Carlos Regulos
Joana Aldebaran
Matias Agena
Luis Becrux

TEL_INSTRU
---------9647-1622
274-9018
722-1300
212-7938
220-6022

455-7877

ADMISSAO
-------01/02/97
03/08/96
12/11/98
30/12/97
03/10/96
17/07/97
18/09/98
01/03/97
21/01/02
21/01/02
29/01/02

11 linhas selecionadas.

Observe que foi criada uma sequence para que cdigos possam ser gerados
automaticamente.

11.3 - Alterao (Update)


Em vez de utilizar o comando update para realizar uma atualizao na
tabela de instrutores, podemos desenvolver uma rotina que receba os
dados necessrios por parmetro e realize a mudana. Haver um grande
ganho em simplicidade, como podemos ver no exemplo que consta no
arquivo 11_Atualiza_Telefone_Instrutor.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

create or replace procedure atualiza_telefone_instrutor


(v_cod in instrutores.cod_instrutor%type,
v_novo_tel in instrutores.tel_instrutor%type)
Is
Begin
update instrutores
set tel_instrutor = v_novo_tel
where cod_instrutor = v_cod;
commit;
end;

E uma possvel execuo:


exec atualiza_telefone_instrutor(50,'399-58-73');
select * from instrutores where cod_instrutor = 50;
COD_INSTRUTOR NOME_INSTRUTOR
TEL_INSTRU ADMISSAO
------------- ------------------------------ ---------- --------

Oracle 9i Fundamental

137

50 Luis Becrux

399-58-73

29/01/02

Observaes
A rotina anterior no apresenta nenhum mecanismo de segurana, isto
, caso o cdigo fornecido no exista, a execuo NO ser
interrompida. Este problema ser resolvido no captulo que trata de
Cursores (13);
O inconveniente dessa abordagem a exploso da quantidade de
procedures/functions de um banco. H que se encontrar um meiotermo.

11.4 - Excluso (Delete)


A eliminao de linhas tambm pode ser inserida em uma Unidade de
Programa. Basta utilizar o comando delete, que funciona de forma idntica
ao da linguagem SQL. Veja um exemplo extrado do arquivo
11_Elimina_Inst_Sem_Turmas.sql:
1.
2.
3.
4.
5.
6.

Create or replace procedure elimina_instrutores_sem_turmas is


Begin
delete instrutores
where cod_instrutor not in
(select distinct cod_instrutor from turmas);
end;

E uma possvel execuo:


select nome_instrutor from instrutores
where cod_instrutor not in (select distinct cod_instrutor from turmas);
NOME_INSTRUTOR
-----------------------------Matias Agena
Luis Becrux
exec Elimina_Instrutores_Sem_Turmas;
select nome_instrutor from instrutores
where cod_instrutor not in (select distinct cod_instrutor from turmas);
no h linhas selecionadas

Observao
Perceba que NO foi emitido o commit na rotina. Neste caso, ficou a
cargo do usurio confirmar ou cancelar a operao.

Oracle 9i Fundamental

138

11.5 - SQL Dinmica


Uma limitao apresentada pela linguagem PL/SQL consiste em proibir a
execuo de comandos DDL (Creates, Drops, Alters, Truncate Table, etc.).
Graas ao mecanismo denominado NDS (Native Dynamic SQL), contornase tal restrio. Veja o exemplo seguinte, extrado do arquivo
11_Exemplos_SQL_Dinamica.sql:
1
2
3
4
5
6
7

create or replace procedure LimpaHistorico


Is
comando varchar(200);
Begin
comando := 'truncate table historico';
execute immediate comando;
end;

E uma possvel execuo:


exec LimpaHistorico;

Observaes
O grande responsvel pela SQL dinmica o comando execute
immediate;
Observe que no foi necessrio efetuar um commit, j que o comando
truncate table j encerra uma transao em si.
Um segundo exemplo extrado do mesmo 11_Exemplos_SQL_Dinamica.sql
revela como contar linhas de uma tabela qualquer, cujo nome seria
passado por parmetro:
1.
2.
3.
4.
5.
6.
7.
8.
9.

create or replace function linhastabelas


( tab in varchar2)
return integer
Is
linhas integer;
Begin
execute immediate 'select count(*) from ' || tab into linhas;
return linhas;
end;

E uma possvel execuo no SQL Navigator:


select linhastabelas('alunos') from dual;

As possibilidades oferecidas pelo recurso NDS so esplndidas. Por


exemplo, possvel utilizar parmetros (bind variables) no comando execute
immediate. Analise este terceiro exemplo, tambm extrado de
11_Exemplos_SQL_Dinamica. Ele permite atualizar qualquer campo de
qualquer tabela:
1.
2.

create or replace function atualizagenerico


( tab in varchar2,

Oracle 9i Fundamental

139

3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

col in varchar2,
valor in varchar2,
condicao in varchar2 := null)
return integer
Is
comando varchar(300);
Begin
comando := 'update '|| tab || ' set ' || col || ' = :valor where ' ||
nvl(condicao, '1=1');
execute immediate comando using valor;
commit;
return sql%rowcount;
end;

Observaes
Perceba, na dcima linha, a presena da bind variable como :valor. Ela
ser utilizada na linha seguinte, clusula using;
A expresso sql%rowcount, presente na dcima terceira linha, representa
a quantidade de linhas afetada pelo ltimo comando DML, no caso,
update. Voltaremos a mencion-la no captulo 13, Cursores;
Exemplo de execuo pelo SQL Navigator:
declare linhas integer;
begin
linhas:= atualizagenerico('instrutores', 'tel_instrutor', '9647-1622',
'cod_instrutor=1');
dbms_output.put_line('Atualizadas='||linhas);
end;

EXERCCIOS
1. Construa uma funo que receba um cdigo de curso e devolva o
total arreca-dado pelas turmas do curso em questo.
Assuma que todo cdigo fornecido existe.
2. Elabore uma funo que receba um cdigo de instrutor e devolva a
quantidade de alunos treinados por ele.
Idem exerccio 1.
3. Crie uma procedure que insira um novo aluno.
Crie uma sequence para gerao automtica de matrculas.
Assuma que a cidade ser sempre Rio de Janeiro e o estado RJ.
4. Construa uma procedure que permita alterar a cidade de um aluno.
5. Crie uma procedure que aumente, em uma dada porcentagem
fornecida, os preos dos cursos que contenham uma dada cadeia de
caracteres.
Por exemplo, o seguinte comando:
Oracle 9i Fundamental

140

Aumenta_Precos(20, Oracle);

aumenta em 20% todos os cursos que contenham a palavra Oracle.


6. Faa uma procedure que exclua alunos que no freqentaram curso
algum.
7. Construa uma procedure que cria um ndice qualquer. Deve receber
trs parmetros de entrada: o nome do ndice, o nome da tabela ao
qual ser associado e uma cadeia de caracteres representando a
lista de campos.

REFERNCIA RPIDA
Tarefa

Como fazer

Selecionar uma linha de


uma tabela ou viso

Utilize o comando select/into. Caso no seja


retor-nada nenhuma linha ou mais de uma,
ocorrero pro-blemas. Veja item 4.1 para maiores
detalhes.

Inserir dados em tabelas

Comando insert. Veja item 11.2.

Atualizar um ou mais
campos em uma ou mais
linhas

Comando update. Veja 11.3.

Excluir uma ou mais linhas


de uma tabela

Comando delete. Veja 11.4.

Habilitar a sada em rotinas


es-critas
com
SQL
Navigator

No menu Session, escolha Server Output. Isto


far
com
que
os
resultados
de
dbms_output.put_line sejam mos-trados em
janelas parte. No SQL*Plus Worksheet obtm-se
efeito anlogo alterando a varivel de ambiente
serveroutput para on. Exemplo: set serveroutput
on.

Executar comandos
inter-namente
a
procedure ou funo

Comando execute immediate. Veja 11.5.

DDL
uma

Oracle 9i Fundamental

141

Captulo 12 pl/sql:pl
OBJETIVOS

Expandir as possibilidades de processamento utilizando


estruturas de programao que provoquem execuo condicional
ou repetitiva;
Trabalhar com os comandos IF, FOR, WHILE, LOOP e FORALL,
alm de expresses CASE;
Realizar depuraes de Unidades de Programa com SQL Navigator.

ARQUIVOS NECESSRIOS

10_Escopo.sql;
11_Retorna_Info_Curso.sql;
12_Classifica_Arrecadado.sql;
12_Alimenta_Historico_For.sql;
12_Alimenta_Historico_While.sql;
12_Alimenta_Historico_Loop.sql;
12_Alimenta_Historico_Forall.sql.

PR-REQUISITOS

Utilizar comandos SQL do tipo DML (Select, Insert, Delete, Update) em


Unidades de Programa;
J ter trabalhado com processamento condicional ou repetitivo
em alguma linguagem de programao;
Conhecer a diferena entre testar e depurar.

TEORIA
12.1 - Processamento Condicional
At o presente momento, toda execuo foi seqencial, ou seja, todos os
comandos de uma Unidade de Programa eram executados uma vez. Como
qualquer linguagem de programao, a PL/SQL permite relacionar a
execuo de uma ou mais linhas a condies.

Oracle 9i Fundamental

142

O comando if implementa o processamento condicional. A forma mais


elementar :
if condio then
comandos executados caso a condio seja Verdadeira
end if;

Quando tambm houver necessidade de processamento, quando a condio


for falsa, pode-se utilizar a seguinte variao:
if condio then
comandos executados caso a condio seja Verdadeira
else
comandos executados caso a condio seja Falsa
end if;

Finalmente, quando houver mais de duas hipteses (V ou F), existe uma


terceira variao:
if condio1 then
comandos executados caso a condio1 seja Verdadeira
elsif condio2 then
comandos executados caso a condio2 seja Verdadeira
...
else
comandos executados caso nenhuma condio testada for Verdadeira
end if;

Veja um exemplo extrado do arquivo 12_Classifica_Arrecadado.sql:


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

create or replace function classifica_arrecadado


return varchar2
Is
v_total number := 0;
Begin
select sum(preco)
into v_total
from cursos c, turmas t, historico h
where c.cod_curso = t.cod_curso
and t.cod_turma = h.cod_turma;
if v_total < 30000 then
return 'Fraco';
elsif v_total < 50000 then
return 'Medio';
Else
return 'Alto; ';
end if;
end;

Uma provvel ativao seria:


begin
dbms_output.put_line(Classifica_Arrecadado);
end;

Sendo a sada:
Medio

Observaes
Oracle 9i Fundamental

143

Os comandos "subordinados" s condies no foram escritos mais


direita por acaso. Isto se chama indentao23 e representa uma
tcnica crucial para tornar legveis os cdigos de Unidades de
Programas;
Uma vez armazenada a funo apresentada anteriormente no Servidor,
podemos ativ-la pelo SQL*Plus Worksheet:
select classifica_arrecadado from dual;
CLASSIFICA_ARRECADADO
--------------------------------------------------Medio

A condio pode ser expressa por meio de uma varivel lgica:


...
condicao_fraca boolean;
begin
...
condicao_fraca := v_total < 3000;
if condicao_fraca then
return 'Fraco';
elsif ...

Pelo SQL Navigator, a estrutura do comando if pode ser copiada a


partir do Code Assistant (menu View, comando Code Assistant),
abrindo as pastas Syntax and Web Catalog, PL/SQL Syntax e
Conditional Control;
Existe um problema na rotina anterior: o que aconteceria se a tabela
HISTORICO estivesse vazia?
A expresso case, vista no captulo 3 como responsvel pelo
processamento condicional em um select, tambm pode ser utilizada
em PL/SQL. Veja uma variante da funo anterior, presente no
mesmo arquivo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
23

create or replace function classifica_arrecadado_case


return varchar2
Is
v_total number := 0;
v_resultado varchar2(10);
Begin
select sum(preco)
into v_total
from cursos c, turmas t, historico h
where c.cod_curso = t.cod_curso
and t.cod_turma = h.cod_turma;
v_resultado
case

:=

Segundo o Dicionrio Aurlio, o termo indentar significa "... Espacejar


linha, pargrafo, etc. da margem esquerda para a direita...". Assim,
devem ser evitadas variaes inexistentes, tais como edentao
ou
identao.

Oracle 9i Fundamental

144

15.
16.
17.
18.
19.
20.

when v_total < 30000 then


when v_total < 50000 then
else 'Alto; '
end ;
return v_resultado;
end;

'Fraco'
'Medio'

Muito j se discutiu sobre qual forma (if ou case) seria mais adequada para
cada situao. Na verdade, trata-se mais de uma questo de estilo de
programao do que propriamente adequao. Quando o processamento
consistir em apenas uma atribuio, a estrutura case pode ser utilizada em
qualquer caso, porm no podemos utilizar o comando if dentro de um
select, como vimos no captulo 3. Lembre, entretanto, que a estrutura case
no permite executar um bloco de comandos em seu interior.

12.2 - Processamento Repetitivo


A linguagem PL/SQL oferece quatro formas de implementar o
processamento repetitivo. Isto acontece por meio das estruturas for, while,
loop e forall. Enquanto a primeira repete um bloco de comandos n vezes,
sendo n conhecido, a segunda efetua a iterao mediante um teste. J a
forma loop repete infinitas vezes at que explicitamente seja forado o fim
do lao. Finalmente, a variante forall permite ganhos de performance, como
veremos em breve.
Em seguida so mostrados cdigos de quatro procedures idnticas quanto
aos objetivos, porm cada uma utiliza uma forma de repetio diferente.

12.2.1 - FOR
O exemplo seguinte consta no arquivo 12_Alimenta_Historico_For.sql.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

create or replace procedure alimenta_historico_for


(ultima_turma in number, ultimo_aluno in number)
Is
Begin
delete historico;
for i in 1..ultima_turma loop
for j in 1..ultimo_aluno loop
insert into historico (cod_turma, matricula) values
(i,j);
end loop;
end loop;
commit;
end;

E uma possvel execuo:


exec Alimenta_Historico_For (5,4)

Comprovando:
select count(*) from historico;
COUNT(*)

Oracle 9i Fundamental

145

--------20

Observaes
As variveis que controlam o nmero de repeties (i,j) no precisam ser
declaradas nem incrementadas;
Opcionalmente, podemos ter uma contagem regressiva. A sexta linha
pode ser assim escrita:
for i in reverse ultima_turma..1 loop

Veja como a indentao deixa evidente a subordinao de comandos;


Pelo SQL Navigator, a estrutura do comando for pode ser copiada a
partir do Code Assistant pastas Sintax and Web Catalog, PL/SQL
Syntax, Iterative Control, item For Loop.

12.2.2 - WHILE
O exemplo seguinte consta no arquivo 12_Alimenta_Historico_While.sql.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

create or replace procedure alimenta_historico_while


(ultima_turma in number, ultimo_aluno in number)
Is
v_turma number(2) :=1;
v_aluno number(2) :=1;
Begin
delete historico;
while v_turma <= ultima_turma loop
while v_aluno <= ultimo_aluno loop
insert into historico (cod_turma, matricula)
values (v_turma,v_aluno);
v_aluno := v_aluno +1;
end loop;
V_turma := v_turma +1;
V_aluno := 1;
end loop;
commit;
end;

E uma possvel execuo:


exec Alimenta_Historico_While(6,5)

Comprovando:
select count(*) from historico;
COUNT(*)
--------30

Observaes
As variveis que controlam o nmero de repeties (v_aluno e v_turma)
devem ser declaradas e explicitamente incrementadas;
Oracle 9i Fundamental

146

Utilizamos o while quando a execuo de um bloco de comandos


depende de uma condio que no permite antever o nmero de
iteraes;
Caso no haja comandos que alterem a condio e a tornem falsa,
teremos um lao eterno (looping);
Pelo SQL Navigator, a estrutura do comando while pode ser copiada a
partir do Code Assistant pastas Sintax and Web Catalog, PL/SQL
Syntax, Iterative Control, item While Loop.

12.2.3 - LOOP
O exemplo seguinte consta no arquivo 12_Alimenta_Historico_Loop.sql.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

create or replace procedure alimenta_historico_loop


(ultima_turma in number, ultimo_aluno in number)
Is
v_turma number(2) :=1;
v_aluno number(2) :=1;
Begin
delete historico;
Loop
Loop
insert into historico (cod_turma, matricula)
values (v_turma,v_aluno);
v_aluno := v_aluno +1;
exit when v_aluno> ultimo_aluno;
end loop;
v_turma := v_turma +1;
v_aluno := 1;
exit when v_turma> ultima_turma;
end loop;
commit;
end;

E uma possvel execuo:


exec Alimenta_Historico_Loop(3,4)

Comprovando:
select count(*) from historico;
COUNT(*)
--------12

Observaes

As variveis que controlam o nmero de repeties (v_aluno e


v_turma) devem ser declaradas e explicitamente incrementadas;
Utilizamos o loop quando a execuo de um bloco de comandos
depende de uma condio que no permite antever o nmero de
iteraes, mas houver pelo menos uma repetio;
Condio a oposta da utilizada pelo while;
Caso no seja utilizado o comando exit when, teremos um lao
eterno. Isto tambm ocorreria se a condio nunca fosse satisfeita;
Oracle 9i Fundamental

147

Pelo SQL Navigator, a estrutura do comando loop pode ser copiada a


partir do Code Assistant pastas Sintax and Web Catalog, PL/SQL
Syntax, Iterative Control, item Loop. Note que nenhuma estrutura
do tipo Exit When ser inserida.

12.2.4 - FORALL
Durante a execuo de um bloco de comandos PL/SQL, dependendo da
instruo vigente, ora o controle passado para o ncleo PL/SQL (PL/SQL
engine), ora para o ncleo SQL (SQL Engine). Nas rotinas vistas neste
captulo, h, no pior dos casos 31 mudanas de ncleo24. Isto pode se
tornar um srio problema de performance, quando a quantidade de
mudanas alcanar valores excessivos.
Existe um mecanismo capaz de minimizar essa perda de performance.
Trata-se da tcnica Bulk Binds, que consiste em pr-armazenar um
conjunto de comandos DML (insert, update ou delete) e envi-los de uma vez
ao ncleo SQL. Ela pode ser obtida por meio do comando forall, como visto
no exemplo seguinte, que consta no arquivo
12_Alimenta_Historico_ForAll.sql.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

create or replace procedure alimenta_historico_forall


(ultima_turma in number, ultimo_aluno in number)
is
type tlista is table of number index by binary_integer;
lista tlista;
begin
for j in 1..100 loop
lista(j) := j;
end loop;
delete historico;
for i in 1..ultima_turma loop
forall j in 1..ultimo_aluno
insert into historico (cod_turma, matricula) values
(i,lista(j));
end loop;
commit;
end;

E uma possvel execuo:


exec Alimenta_Historico_ForAll(6,5)

Comprovando:
select count(*) from historico;
COUNT(*)
--------30

Observaes
24

Isto ocorreu em Alimenta_Historico_While, pois ela foi chamada com os


argumentos 6 e 5. Alm dos trinta inserts, ainda ocorreu um delete.

Oracle 9i Fundamental

148

Para os argumentos utilizados, acontecero apenas sete


mudanas entre ncleos. Isto porque os alunos de cada turma
sero inseridos de uma s vez;
A estrutura forall admite apenas um comando insert, update ou
delete;
A utilizao de uma varivel composta obrigatria. Note que ela
foi inicialmente preenchida e depois seus membros utilizados no
insert.

12.3 - Depurao
Uma vez concluda a digitao de uma Unidade de Programa e eliminados
os erros de compilao (variveis no declaradas, falta de ponto-e-vrgula,
etc.), podem ocorrer erros de lgica, isto , o resultado da execuo difere
do que era esperado. Para resolver as anomalias "lgicas", ajuda muito
depurar o cdigo.
A depurao objetiva identificar a fonte do erro por meio de vrios
procedimentos: acompanhar a execuo comando a comando; verificar o
contedo de variveis, eventualmente alterando seus contedos;
interromper o fluxo em um determinado ponto; etc.
Infelizmente, o SQL*Plus Worksheet no oferece nenhuma facilidade de
depurao; entretanto, o SQL Navigator possui um conjunto de
ferramentas que propicia esta atividade investigativa.
Tudo comea pelo estabelecimento do modo de depurao. Isto acontece
graas ao comando Session, PL/SQL Debugging. Aps carregar a rotina
por investigar no Stored Program Editor e recompil-la, podem-se
estabelecer breakpoints (pontos de parada) pelo comando Debug, Toggle
Breakpoint.
Uma vez disparada a execuo e fornecidos os argumentos necessrios, os
elementos de depurao sero mostrados. A partir da, utilizando
comandos do menu Debug ou pela barra de ferramentas Debug, pode-se
executar passo a passo ou at o prximo ponto de parada.
Os contedos de variveis podem ser investigados acrescentando watches
(Debug, Add Watch). Na figura apresentada em seguida, vemos que a
varivel v_aluno no teve valor inicial atribudo e um ponto de parada foi
estabelecido no segundo while:

Oracle 9i Fundamental

149

Perceba que, ao final da execuo, a tabela HISTORICO no ter os alunos


da primeira turma, j que o cdigo do aluno era nulo e, por conseqncia,
a insero no pde ocorrer.
Alm do comando que dispara a execuo (Session, Run), h outros muito
teis sob o menu Debug. Veja um resumo deles:
Comando

O que faz

Atalho

Continue

Execuo normal.

Run to Cursor

Executar at o cursor.

Trace Into

Mergulhar na rotina corrente o procesF7


samento desviado.

Step Over

Saltar uma procedure ou function, que so


F8
tratadas como se fossem comandos normais.

Trace Out

Voltar Unidade de Programa que invocou o


bloco corrente. Caso no exista bloco Shift + F7
chamador, a execuo interrompida.

Abort Execution

Interromper execuo.

Add Watch

Inspeo. Permite-se obter valores correntes


Ctrl + F5
de variveis e at mud-los.

Toggle
Breakpoint

Estabelecer
(Breakpoint).

Auto Step Over

Executa passo a passo, mas de forma Shift + Ctrl +


automtica.
F8

Auto Trace Into

Executa passo a passo, automaticamente, Shift + Ctrl +


mas entrando nas procedures e function.
F7

Pause Auto
Stepping

Pausa na execuo automtica.

um

F4

ponto

Shift + Ctrl +
F9

de

Oracle 9i Fundamental

parada

F5

Ctrl + Alt + P

150

Lembre-se que para cada comando apresentado anteriormente, existe


associado um boto nas barras de ferramentas.

EXERCCIOS
1. Elabore uma funo que receba dois nmeros e devolva o maior.
2. Altere a procedure Retorna_Info_Curso para que emita uma
classificao do curso mediante seu preo: Barato (menos que 300),
Mdio (entre 301 e 600) e Caro (mais que 601).
Avalie a necessidade de utilizar o comando IF com ELSIF ou no.
3. Crie uma funo que receba um nmero entre 1 e 12 e mostre o nome
do ms equivalente.
Assuma que a entrada pode ser incorreta.
Utilize um vetor para armazenar o nome dos meses.
Aproveite o exerccio 2 do captulo 3.
4. Crie uma procedure que receba um nmero por parmetro e mostre a
soma de seus divisores.
5. Faa uma procedure que receba um nmero por parmetro e mostre
quantos primos menores existem.
6. Depure a rotina que consta em 10_Escopo.sql, acompanhando o valor
das variveis.

REFERNCIA RPIDA
Tarefa

Como fazer

Efetuar processamento condicional

Utilize a estrutura de programao


if/then/elsif/else/end if.

Repetir um bloco de comandos vrias


vezes cujo nmero de iteraes
conhecido

Estrutura for/in/loop/end loop

Repetir um bloco de comandos vrias


vezes cujo nmero de iteraes NO
conhecido

Estrutura while/loop/end loop

Repetir um bloco de comandos vrias


vezes cujo nmero de iteraes NO
conhecido, porm h pelo menos uma
execuo

Estrutura loop/exit when/end loop

Aumentar a eficincia de uma iterao,


impe-dindo que o ncleo PL/SQL
(PL/SQL Engine) invoque repetidas vezes
o ncleo SQL (SQL Engine)

Comando forall

Oracle 9i Fundamental

151

Tarefa

Depurar

Como fazer
Ligue o modo de depurao
(Session,
PL/SQL
Debugging),
carregue a rotina no Stored Program
Editor, compile-a e exe-cute-a a
partir do SQL Editor. Os princi-pais
comandos de depurao encontramse sob o menu Debug.
Ao final, no se esquea de desligar
o modo de depurao (Debug,
PL/SQL Debugging).

Oracle 9i Fundamental

152

Captulo 13 CURSORES
OBJETIVOS

Compreender o conceito de cursor;


Identificar situaes em que a utilizao de cursores resulta
imprescindvel;
Trabalhar com cursores implcitos ou explcitos;
Criar um cursor dinmico;
Realizar leituras ou atualizaes em tabelas via cursores.

ARQUIVOS NECESSRIOS

13_Classifica_Cursos.sql;
13_Exemplo_Cursor_Implicito.sql;
13_Exemplo_Cursor_Implicito_2.sql; (bulk bind)
13_Exemplo_Cursor_Explicito_1.sql;
13_Exemplo_Cursor_Explicito_2.sql; (cursor parametrizado)
13_Exemplo_Cursor_Explicito_3.sql; (usando FOR)
13_Exemplo_Cursor_Explicito_4.sql; (SQL dinmica)
13_Cria_Tabela_Turmas_Cursos.sql;
13_Exemplo_Cursor_Atualizacao.sql.

PR-REQUISITOS

Utilizar comandos SQL do tipo DML (Select, Insert, Delete, Update) em


Unidades de Programa;
Resolver problemas envolvendo processamento condicional ou
repetitivo.

MOTIVAO
Exemplo de processamento precisando Cursores
A rotina seguinte classifica todos os cursos, segundo o preo:
1.
2.
3.

PROCEDURE Classifica_Cursos
IS
v_qtos_cursos number(3) := 0;

Oracle 9i Fundamental

153

4.
v_curso_corrente number(3) := 1;
5.
v_nome_curso
cursos.nome_curso%type;
6.
v_preco
cursos.preco%type;
7.
v_classifica
varchar2(10);
8.
9. BEGIN
10.
select count(*)
11.
into v_qtos_cursos
12.
from cursos;
13.
14.
for i in 1..v_qtos_cursos loop
15.
select nome_curso, preco
16.
into v_nome_curso, v_preco
17.
from cursos
18.
where cod_curso = i;
19.
if v_preco < 300 then
20.
v_classifica := 'Barato';
21.
elsif v_preco < 600 then
22.
v_classifica := 'Mdio';
23.
else
24.
v_classifica := 'Caro';
25.
end if;
26.
dbms_output.put_line ('Curso: '|| v_nome_curso ||
' ' || v_classifica);
27.
end loop;
28.
29. END;

A rotina anterior apresenta basicamente dois problemas bastante srios:


Assume que os cdigos de cursos comeam por 1 e so seqenciais;
Se houver, digamos, vinte cursos, existiro vinte acessos ao Servidor
via comando select/into.
Uma possvel "melhoria" pode ser a criao de uma tabela espelho de
cursos e a localizao do menor cdigo cujo registro deve ser eliminado
aps a classificao. O processo ser repetido at que no restem mais
registros.

TEORIA
13.1 - Fundamentos
Um cursor representa uma tabela temporariamente armazenada em
memria e criada como resultado dos comandos: select, insert, update, delete,
commit ou rollback. Ele contm os registros afetados pelo comando que
provocou sua criao.
Existem dois tipos de cursor: o implcito, que dispensa qualquer tipo de
tratamento, e o explcito, gerado apenas pelo select, que deve ser declarado
e manipulado via comandos prprios. Criando um cursor explcito,
podemos carregar o contedo de uma tabela em memria sem precisar
emitir tantos select/into quantos forem os registros da tabela.
H quatro atributos que podem ser utilizados tanto por cursores implcitos
quanto explcitos:

Oracle 9i Fundamental

154

sql%rowcount

Informa quantas linhas foram afetadas pelo comando que


gerou o cursor.

sql%found

Ser true caso alguma linha tenha sido afetada.

sql%notfound

Ser false caso alguma linha tenha sido afetada.

sql%isopen

Ser true caso o cursor esteja aberto. Somente faz sentido


para cursores explcitos.

No caso de cursores explcitos, o prefixo sql ser substitudo pelo nome da


varivel representando o cursor.
A rotina seguinte exemplifica a utilizao de um cursor implcito. Ela
consta no arquivo 13_Exemplo_Cursor_Implicito.sql:
1. create or replace function exclui_instrutores_cursor_imp
2.
return varchar2
3.
is
begin
4.
5.
delete instrutores
6.
where cod_instrutor not in
7.
(select distinct cod_instrutor from turmas);
if sql%found then
8.
return ('Foram eliminados: '|| to_char(sql%rowcount) || ' instrutores');
9.
10.
else
11.
return ('Nenhum instrutor eliminado.');
12.
end if;
13.
end;

Pelo SQL Navigator, a funo anterior pode ser invocada em uma janela
SQL Editor utilizando os comandos:
declare saida varchar2(40);
begin
saida := exclui_instrutores_cursor_imp;
dbms_output.put_line('Saida: '||saida);
end;

Quando houver bulk binds, ainda pode-se utilizar o atributo composto


sql%bulk_rowcount(n) que informa quantas linhas foram afetadas no n-simo
comando subordinado estrutura forall.
O prximo exemplo utiliza cursores impcitos junto com bulk bind. Ele
consta no arquivo 13_Exemplo_Cursor_Implicito_2.sql:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

create or replace procedure aumenta_preco_hora_instrutor


is
type lista_instrutores is table of number;
instrutores lista_instrutores:= lista_instrutores (1, 2, 5, 6);
i integer;
begin
forall i in instrutores.first..instrutores.last
update turmas set preco_hora_instrutor = preco_hora_instrutor * 1.10
where cod_instrutor = instrutores(i);
-- Mostra quantas linhas afetou cada update
for i in instrutores.first..instrutores.last loop
dbms_output.put_line ('Turmas afetadas pelo instrutor: '||
to_char(instrutores(i)) || ' ' || to_char(sql%bulk_rowcount(i)));
end loop;
end;

Oracle 9i Fundamental

155

Observaes

Existem
algumas
novidades
no
exemplo
apresentado
anteriormente. Em primeiro lugar, preencheu-se a lista de
cdigos de instrutores (linha 4) de uma forma indita, utilizando
um construtor. Mais detalhes no captulo 17;
Observe como os itens da lista foram percorridos, ou seja,
aproveitando as propriedades first e last do vetor;
Finalmente, utiliza-se o atributo composto bulk_rowcount para
identificar a n-sima linha alterada.

13.2 - Cursores Explcitos


Quando for necessrio carregar vrios registros em memria, devem-se
utilizar cursores explcitos, que so manipulados por meio de trs
comandos:
open

Cria fisicamente a tabela temporria e posiciona o ponteiro de


leitura no primeiro registro.

fetch

Carrega para variveis locais o contedo da linha indicada pelo


ponteiro de leitura.

close

Fecha o cursor.

Antes que um cursor explcito possa ser utilizado, deve-se declarar o


comando select que proporcionar o conjunto de linhas.
O exemplo seguinte resolve novamente o problema apresentado na
Motivao, porm, desta vez, com cursor explcito.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

create or replace procedure Classifica_Cursos_Cur_Exp


IS
cursor ccursos is
select nome_curso, preco from cursos;
V_nome_curso
V_preco
V_classifica

cursos.nome_curso%type;
cursos.preco%type;
varchar2(10);

begin

open ccursos;
fetch ccursos into v_nome_curso, v_preco;
while ccursos%found loop
if v_preco < 300 then
v_classifica := 'Barato';
elsif v_preco < 600 then
v_classifica := 'Mdio';
else
v_classifica := 'Caro';
end if;
dbms_output.put_line('Curso: '|| v_nome_curso ||
' ' || v_classifica);
21.
fetch ccursos into v_nome_curso, v_preco;

Oracle 9i Fundamental

156

22.
23.
24.

end loop;
close ccursos;
End;

Com SQL Navigator, um exemplo de ativao e sada pode ser:


begin
Classifica_Cursos_Cur_Exp;
end;

E a sada, na guia spool:


*** SCRIPT START : Session:MORELLI@CONTACAD(2)
Processing ...
begin
Classifica_Cursos_Cur_Exp;
end;

22-fev-2002 22:02:16 ***

Curso: Introduo Lgica de Programao Caro


Curso: Fundamentos da Modelagem de Dados Caro
Curso: Redes I Barato
Curso: Introduo a Sistemas Operacionais Barato
Curso: Anlise Orientada por Objetos Barato
Curso: Delphi: Recursos Bsicos Mdio
Curso: Delphi: Acesso a Bancos de Dados Mdio
Curso: Oracle: SQLPlus e SQL Caro
Curso: Oracle: PL/SQL Caro
Curso: Redes II Barato
*** SCRIPT END : Session:MORELLI@CONTACAD(2)
22-fev-2002 22:02:16 ***

Observaes

As linhas em destaque na procedure evidenciam as operaes:


declarao, abertura, leitura e fechamento;
Observe como o atributo %found foi utilizado para controlar o
fim do lao. Agora no necessrio conhecer de antemo o
nmero de registros, nem preocupar-se com a seqencialidade
dos cdigos;
Eventualmente, um cursor pode ser parametrizado. Por exemplo,
suponha que desejamos filtrar os cursos que no atingem um
determinado preo:

1.
create or replace procedure Class_Cursos_Cur_Exp_Param
2.
(v_valor_minimo number)
3.
IS
cursor ccursos (v_valor_minimo in number) is
4.
5.
select nome_curso, preco from cursos
6.
where preco > v_valor_minimo;
7.
8.
BEGIN
9.
open ccursos (v_valor_minimo);
fetch ccursos into v_nome_curso, v_preco;
10.

Oracle 9i Fundamental

157

A sada mostrar apenas os cursos cujo preo seja maior que o


valor for-necido via parmetro;
O
cdigo
anterior
encontra-se
em
13_Exemplo_Cursor_Explicito_2.sql;
Pelo SQL Navigator, diversos exemplos de manipulao de
cursores explcitos podem ser arrastados a partir do Code
Assistant (menu View, comando Code Assistant), abrindo as
pastas Syntax and Web Catalog, PL/SQL Syntax e Explicit
Cursor.

A procedure Classifica_Cursos_Cur_Exp pode ser reescrita utilizando um


lao for:
1.
create or replace procedure class_cursos_cur_exp_for
2.
Is
3.
cursor ccursos is
select nome_curso, preco from cursos;
4.
5.
6.
V_classifica
varchar2(10);
7.
8.
Begin
for reg_curso in ccursos loop
9.
if reg_curso.preco < 300 then
10.
11.
v_classifica := 'Barato';
12.
elsif reg_curso.preco < 600 then
13.
v_classifica := 'Mdio';
Else
14.
15.
v_classifica := 'Caro';
16.
end if;
17.
dbms_output.put_line ('Curso: '||
18.
reg_curso.nome_curso || ' ' || v_classifica);
19.
end loop;
20. end;

Observaes
Note que no foi necessrio abrir, ler ou fechar o cursor. E ainda
dispen-samos as variveis locais que receberiam contedos de
campos. Estas simpli-ficaes seriam inviveis caso o cursor fosse
parametrizado;
O cdigo apresentado anteriormente se encontra em:
13_Exemplo_Cursor_Explicito_3.sql.
Uma forma de flexibilizar rotinas que possuam cursores consiste em
utilizar a novssima tcnica NDS (Native Dynamic SQL), j vista no captulo
11. O exemplo seguinte aceita filtros que sejam baseados em um ou mais
campos da tabela CURSOS:
1.
2.
3.
4.
5.
6.

create or replace procedure class_cursos_sql_dinamica


(ent_filtro varchar2 := null)
Is
type tpCursor_Dinamico is ref cursor;
v_cursor tpCursor_Dinamico ;
v_nome_curso cursos.nome_curso%type;

Oracle 9i Fundamental

158

7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

v_preco cursos.preco%type;
v_classifica
varchar2(10);
v_comando varchar2(100);
Begin
v_comando := 'select nome_curso, preco from cursos where ' ||
nvl(ent_filtro, '1=1') ;
open v_cursor for v_comando;
fetch v_cursor into v_nome_curso, v_preco;
while v_cursor%found loop
if v_preco < 300 then
v_classifica := 'Barato';
elsif v_preco < 600 then
v_classifica := 'Mdio';
Else
v_classifica := 'Caro';
end if;
dbms_output.put_line ('Curso: '|| v_nome_curso || ' ' ||
v_classifica);
fetch v_cursor into v_nome_curso, v_preco;
end loop;
close v_cursor ;
end;

Observaes
Possveis ativaes da rotina anterior:
begin
class_cursos_sql_dinamica ('carga_horaria > 32');
end;
begin
class_cursos_sql_dinamica ('preco > 0');
end;
begin
class_cursos_sql_dinamica ;
end;

Como o comando SQL no conhecido em tempo de compilao, devese criar uma varivel dinmica, ou ponteiro. Isto explica a
declarao na quarta linha, na qual se especifica um tipo cujas
variveis sero ponteiros para outras variveis;
Note que o comando open (linha 12) apresenta uma pequena variao: a
clusula for;
O cdigo anterior se encontra em:
13_Exemplo_Cursor_Explicito_4.sql.

13.3 - Cursores de Atualizao


As linhas retornadas por um cursor explcito podem ter seus contedos
alterados tambm. Imagine que seja necessrio reajustar em 10% os preos
dos cursos que tiveram trs ou mais turmas, e dar um desconto de 10%
para aqueles que tiveram uma ou duas turmas. Como resulta impossvel
atualizar uma viso que contenha dados agrupados, criaremos uma tabela
auxiliar:
Oracle 9i Fundamental

159

create table turmas_cursos as


select c.cod_curso cod_curso, preco, count(cod_turma) turmas
from cursos c, turmas t
where c.cod_curso = t.cod_curso
group by c.cod_curso, preco;

O cdigo anterior se encontra no arquivo


13_Cria_Tabela_Turmas_Cursos.sql.
Analise a procedure responsvel pela atualizao:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.

create or replace procedure atualiza_precos_com_cursor


Is
cursor ccursos is
select cod_curso,preco, turmas
from turmas_cursos
for update of preco nowait;
Begin
for linha_corrente in ccursos loop
if linha_corrente.turmas > 2 then
update turmas_cursos set preco = preco * 1.1
where current of ccursos;
Else
update turmas_cursos set preco = preco * 0.9
where current of ccursos;
end if;
end loop;
/* Atualizao da tabela Cursos */
/* Os cursos que no tm turmas no podem ser alterados */
update cursos c
set preco = (select preco from turmas_cursos
where cod_curso = c.cod_curso)
where cod_curso in (select cod_curso from turmas_cursos);
end;

Observaes

Concluda a execuo da rotina anterior, deve-se emitir um commit


para ratificar as mudanas;
Apenas um campo pode ser atualizado;
A clusula nowait causa uma exceo tratvel caso a tabela esteja
bloqueada por outro usurio;
Alm de update, tambm pode-se utilizar o comando delete:
...
delete tabela where current of cursor;
...

Note a subquery correlata que atualiza a tabela CURSOS mediante


os valores de Turmas_Cursos. Sem o filtro da linha 23, os preos dos
cursos que no tenham turmas seriam alterados para NULL;
Um cursor no precisa ser a imagem exata de uma tabela, isto ,
podem existir menos colunas e linhas do que na tabela referenciada.
Oracle 9i Fundamental

160

EXERCCIOS
1. Faa uma procedure que atribua a nota 8 aos alunos que freqentaram
cursos de Delphi e informe quantos registros foram alterados.
2. Parametrize a procedure Classifica_Cursos_Cur_Exp para que somente
sejam tratados cursos de Oracle.
Como seria para que o usurio escolha o tipo de curso? (Oracle,
Delphi, Redes, etc.);
E como seria possvel ao usurio a escolha de qualquer filtro, sobre
qualquer campo?
3. Execute a procedure Atualiza_Precos_Com_Cursor, tendo a tabela
Turmas_Cursos bloqueada por outra sesso.
Analise a mensagem exibida. O que acontece se no houver a
clusula nowait?
4. Acrescente um novo campo tabela INSTRUTORES, denominado
OBSOLESCNCIA, depois faa uma rotina que o atualize segundo o
critrio seguinte:
BAIXA, caso o instrutor tenha ministrado mais de duas turmas;
MDIA, para uma ou duas turmas; e
ALTA, para zero turmas.
5. Aumente em 20% os preos dos cursos que forem maiores que a mdia
dos preos de todos os cursos, e abata 10% dos preos que forem
menores que essa mdia.

REFERNCIA RPIDA
Tarefa

Como fazer

Manipular um
cursor implcito

Aps algum dos comandos: select, delete, update, insert,


commit ou rollback, investigue os atributos sql%found,
sql%notfound ou sql%rowcount.

Declarar um cursor
explcito

Use o comando:
cursor nome_cursor is comando SELECT.

Abrir um cursor

Comando:
open nome_cursor (lista opcional de parmetros).

Ler contedo da
linha corrente de
um cursor

Comando:
fetch nome_cursor into lista de variveis
Deve haver tantas variveis quanto a quantidade de
campos citados no comando select.

Oracle 9i Fundamental

161

Tarefa

Como fazer

Fechar um cursor

Comando:
close nome_cursor
Para checar se o cursor est realmente aberto, podese utilizar o atributo nome_cursor%isopen.

Simplificar a
utilizao de
cursores

Utilize com a estrutura for. Veja a rotina-exemplo que


consta no arquivo
13_Exemplo_Cursor_Explicito_3.sql.

Atualizar linhas de
uma tabela via
cursor

Acrescente a clusula for update of campo declarao.


Veja a rotina-exemplo em
13_Exemplo_Cursor_Atualizacao.

Oracle 9i Fundamental

162

Captulo 14 EXCEES
OBJETIVOS

Compreender o conceito de Exceo;


Identificar situaes em que o tratamento de Excees melhora a
interatividade;
Diferenciar os tipos de Exceo trabalhados pelo Oracle;
Implementar o cdigo tratador de Exceo.

ARQUIVOS NECESSRIOS

14_Retorna_Info_Curso_Tratada.sql;
14_Insere_Instrutor_Tratada.sql;
14_Matricula_Aluno_com_Raise;
14_Matricula_com_Raise_App_Error;
14_Matricula_com_Bloco_Anonimo.

PR-REQUISITOS

Utilizar comandos SQL do tipo DML (Select, Insert, Delete, Update) em


Unidades de Programa;
Resolver problemas envolvendo processamento condicional ou
repetitivo;
Identificar tipos de erro possveis: compilao, ambiente e lgica.

TEORIA
14.1 - Fundamentos
Uma exceo representa uma interrupo anormal no processamento de
uma procedure ou funo. Por exemplo, caso tente-se inserir uma chave
duplicada em uma tabela ou dividir um nmero por zero, o Oracle no
permitir que a execuo continue e ainda emitir mensagens nada
amistosas. Felizmente, podem-se tratar esses erros, identificando-os e
produzindo mensagens mais compreensveis ao usurio.
Ao tratar excees, alm de tornar as Unidades de Programa mais
amigveis, a execuo no interrompida!
Oracle 9i Fundamental

163

Existem trs tipos de exceo:


Predefinidas

Uma vintena de erros que de to comuns,


ganharam nome;

No predefinidas

Demais erros Oracle;

Definidas pelo usurio

teis para tratar regras de negcio.

Toda exceo tratada na seo exception de um bloco:


[declare]
.
.
declaraes
.
.
begin
.
.
comandos
.
.
EXCEPTION
WHEN exc1 [or exc2 ... or excn] THEN
comandos que tratam as excees identificadas pelos nomes exc1,
exc2,...,excn.
WHEN exc3 [or exc4 ... or excn] THEN
.
.
comandos tratadores de outras excees
.
...
WHEN others
.
.
comandos que tratam erros no mencionados anteriormente
.
.
END;

14.2 - Excees Predefinidas


Erros mais freqentes tm nomes. A tabela seguinte mostra alguns dos
existentes25.

25

Erro

Nome

Observaes

ORA-00001

DUP_VAL_ON_INDEX

valor de ndice duplicado (chaves


primrias) ou campos indexados como
unique

Para conhecer todos os erros, investigue a viso all_source. O comando


seguinte pode fazer isto:
select substr(text,1,60) from all_source where name = 'STANDARD'
AND lower(TEXT) LIKE '%exception%'

Oracle 9i Fundamental

164

ORA-01403

NO_DATA_FOUND

select/into no retornou linha alguma

ORA-01012

NOT_LOGGED_ON

Tentativa de execuo de um comando


fora de uma sesso

ORA-01422

TOO_MANY_ROWS

select/into retornou mais de uma linha

ORA-01476

ZERO_DIVIDE

Diviso por zero

O exemplo seguinte, extrado do arquivo


14_Retorna_Info_Curso_Tratada.sql, reescreve a rotina
Retorna_Info_Curso com tratamento de erros:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.

create or replace function Retorna_Info_Curso_Tratada


(v_ch in cursos.carga_horaria%type)
return varchar2
Is
v_nome cursos.nome_curso%type;
v_preco cursos.preco%type;
msg varchar2(60);
Begin
select nome_curso, preo
into v_nome, v_preco
from cursos
where carga_horaria = v_ch;
return ('curso: '|| v_nome || chr(10) || 'preo: '||
to_char(v_preco));
Exception
when no_data_found then
return ('Nenhum curso possui carga horria especificada');
when too_many_rows then
return ('Muitos cursos possuem carga horria
especificada');
when others then
msg := 'Erro desconhecido: ' || to_char(sqlcode);
return (msg);
end;

Exemplo de ativao e sada no SQL*Plus Worksheet pode ser:


variable texto varchar2(60)
exec :texto := Retorna_Info_Curso_Tratada(32);
print texto

Sada:
TEXTO
-----------------------------------------------------Muitos cursos possuem carga horria especificada

Outro exemplo:
exec :texto := Retorna_Info_Curso_Tratada(0);
print texto

Sada:
TEXTO

Oracle 9i Fundamental

165

-----------------------------------------------------Nenhum curso possui carga horria especificada

Observaes

sqlcode e sqlerrm so duas funes embutidas (uma numrica e


outra textual) que retornam o cdigo de erro gerado e a respectiva
mensagem;
A funo chr(10) provoca salto de linha;
Podemos realizar a ativao por meio do SQL Navigator tambm:

BEGIN
DBMS_OUTPUT.PUT_LINE(Retorna_Info_Curso_Tratada(48));
END;

e a sada:
Nenhum curso possui Carga Horria especificada

Caso uma rotina no tenha tratamento de excees, o Oracle


verifica a rotina chamadora.

14.3 - Excees no Predefinidas


Para tratar das outras milhares de excees, devem-se conhecer de
antemo os nmeros dos provveis erros que podem ocorrer. Caso no
sejam conhecidos, podem ser utilizadas as funes sqlcode e sqlerrm, como
visto no ltimo exemplo.
A rotina seguinte, extrada do arquivo 14_Insere_Instrutor_Tratada.sql
uma verso melhorada da procedure Insere_Instrutor:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

create or replace function Insere_Instrutor_Tratada


(v_nome in instrutores.nome_instrutor%type,
v_tel in instrutores.tel_instrutor%type,
v_adm in instrutores.admissao%type)
RETURN varchar2
IS
nome_nulo exception;
pragma exception_init (nome_nulo, -1400);
BEGIN
insert into instrutores
values (Gera_Cod_instrutor.Nextval, v_nome, v_tel,v_adm);
commit;
return ('Incluso OK!');
EXCEPTION
when nome_nulo then
return ('No foi possvel incluir: nome nulo.');
when others then
return ('Erro desconhecido: ' || to_char(sqlcode));
END;

Cuidado A funo apresentada anteriormente mostra um erro de compilao,


Oracle 9i Fundamental

166

caso tenha sido concludo o quarto exerccio do captulo anterior, que


inseria uma nova coluna (OBSOLECENCIA) na tabela de instrutores.
Para corrigi-la, basta especi-ficar um valor para esse campo na linha 11;

Vejamos uma provvel ativao pelo SQL*Plus Worksheet:


var texto char(50)
exec :texto := Insere_Instrutor_Tratada(null,'455-7877',sysdate);
print texto
TEXTO
--------------------------------------------------------------No foi possvel incluir: nome nulo.

Observaes
Veja a varivel nome_nulo do tipo exceo;
Na linha 8 realizamos a conexo entre a varivel previamente declarada
e o nmero do erro (negativo) que se deseja tratar;
Caso no se conhea o erro, ele ser capturado pela clusula when
others. Por exemplo:
TEXTO
----------------------------Erro desconhecido: -nnnn

14.4 - Excees Definidas pelo Usurio


O tratamento de excees no est limitado aos erros nativos do Oracle.
Regras de Negcio tambm podem ser tratadas em stored procedures. Por
exemplo, suponha que seja decidido um limite para a quantidade de alunos
por turma, digamos, dez.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.

create or replace function Matricula_Aluno_com_Raise


(v_turma in historico.cod_turma%type,
v_matricula in historico.matricula%type,
v_nota in historico.nota%type default null)
RETURN varchar2
IS
MAX_ALUNOS
constant integer := 10;
v_alunos_na_turma integer;
turma_cheia exception;
BEGIN
select count(matricula)
Into v_alunos_na_turma
From historic
where cod_turma = v_turma;
if v_alunos_na_turma = MAX_ALUNOS then
raise turma_cheia;
Else
insert into historico values (v_turma, v_matricula,
v_nota);
commit;
return ('Incluso OK!');

Oracle 9i Fundamental

167

23.
24.
25.
26.
27.
28.
29.

end if;
EXCEPTION
When turma_cheia then
return ('No foi possvel incluir: turma_cheia.');
When others then
return ('Erro desconhecido: ' || to_char(sqlcode));
END;

E uma ativao no SQL*Plus Worksheet :


var texto varchar2(80)
exec :texto := Matricula_Aluno_com_Raise(1,20);
print texto

Assumindo que a turma de cdigo 1 j tivesse dez alunos, teramos como


sada:
TEXTO
-----------------------------------------------------No foi possvel incluir: turma_cheia.

Observaes
Esta
funo
encontra-se
no
arquivo
14_Matricula_Aluno_com_Raise.sql;
Assuma que o cdigo de turma e a matrcula fornecidos estejam
corretos;
Note como a exceo foi declarada, provocada e tratada.
Veja em seguida uma forma mais compacta de tratamento de excees de
usurio:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

create or replace function Matricula_com_Raise_App_Error


(v_turma in historico.cod_turma%type,
v_matricula in historico.matricula%type,
v_nota in historico.nota%type default null)
RETURN varchar2
IS
MAX_ALUNOS
constant integer := 10;
v_alunos_na_turma integer;
BEGIN
select count(matricula)
into v_alunos_na_turma
from historico
where cod_turma = v_turma;
if v_alunos_na_turma >= MAX_ALUNOS then
raise_application_error (-20500, 'Turma_cheia');
Else
insert into historico values (v_turma, v_matricula, v_nota);
commit;
return ('Incluso OK!');
end if;
END;

E uma ativao:
exec :texto := Matricula_com_Raise_App_Error(10,21);

Oracle 9i Fundamental

168

Sada:
begin :texto := Matricula_com_Raise_App_Error(10,21); end;
*
ERROR at line 1:
ORA-20500: Turma_cheia
ORA-06512: at "MORELLI.MATRICULA_COM_RAISE_APP_ERROR", line 14
ORA-06512: at line 1

Observaes
A funo apresentada encontra-se no arquivo
14_Matricula_com_Raise_App_Error.sql;
O nmero do erro fornecido deve ser maior que 20.000 (ltimo erro
Oracle);
Se por um lado a sada no foi muito elegante, note que no houve
necessidade de declarao da exceo, nem de tratamento.

14.5 - Excees em Blocos Annimos


medida que o corpo das rotinas cresce, percebe-se a necessidade de
realizar tratamento de erros de uma forma mais localizada, ou seja, mais
prximo causa do problema.
A rotina seguinte, extrada do arquivo
14_Matricula_com_Bloco_Anonimo.sql, evita a incluso de uma linha
cuja chave primria j exista:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

create or replace function MATRICULA_COM_BLOCO_ANONIMO


(v_turma in historico.cod_turma%type,
v_matricula in historico.matricula%type,
v_nota in historico.nota%type default 0)
RETURN varchar2
IS
MAX_ALUNOS
constant integer := 10;
v_alunos_na_turma integer;
turma_cheia exception;
BEGIN
select count(matricula)
into v_alunos_na_turma
from historico
where cod_turma = v_turma;
if v_alunos_na_turma = MAX_ALUNOS then
raise turma_cheia;
else
begin
insert into historico values (v_turma,
v_matricula,v_nota);
commit;
exception
when DUP_VAL_ON_INDEX then
update historico set nota = v_nota
where matricula = v_matricula

Oracle 9i Fundamental

169

27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.

and cod_turma = v_turma;


end;
return ('Operao OK!');
end if;
EXCEPTION
when turma_cheia then
return ('No foi possvel incluir: turma_cheia.');
when others then
return ('Erro desconhecido: ' || to_char(sqlcode));
END;

Observaes

A funo anterior objetiva inserir linhas na tabela HISTORICO,


entretanto, caso a dupla matrcula-cdigo da turma j exista,
assume-se que se deseja simplesmente atualizar uma linha
previamente carregada.

EXERCCIOS
1. Faa uma procedure que exclua um determinado aluno, mas impea a
operao, caso o aluno esteja matriculado em alguma turma.
O cdigo gerado por violaes de integridade referencial 2292.
2. Construa uma procedure que cancele a matrcula de um determinado
aluno. Caso ele no exista na turma especificada, emitir uma
mensagem.
Lembre-se que o comando DELETE no provoca erro, caso nenhum
registro tenha sido excludo.
3. Trate a procedure Atualiza_Precos_Com_Cursor de forma a emitir uma
mensagem amigvel, caso a tabela esteja bloqueada.
4. Construa a funo Matricula_Aluno_com_Raise mais robusta, prevendo
turma ou aluno inexistentes.
5. Reflita: convm pulverizar o tratamento de erros em todas as Unidades
de Programa do Banco, ou ser melhor criar uma procedure especial
que seria invocada sempre que acontecesse um erro?
6. Outra reflexo: de que maneira poderamos utilizar os conhecimentos
adquiridos neste captulo para "acompanhar" a execuo de uma longa
rotina? Imagine uma procedure com umas cem linhas; no seria
interessante incluir a cada fim de funcionalidade um bloco annimo que
emitisse "raises" para avisar que o processamento chegou em um
determinado ponto em um dado instante? Desta forma, poderamos
rapidamente identificar "gargalos" na execuo, ou seja, trechos de
cdigo cuja execuo estaria demorando mais do que o razovel. Isto
nos permitira "atacar" pores menores de cdigo com intuito de
melhorar-lhe a performance.

Oracle 9i Fundamental

170

REFERNCIA RPIDA
Tarefa

Como fazer

Identificar o cdigo de
erro

Execute a rotina sem tratamento de excees e anote os


erros que ocorrem. Uma forma alternativa utilizar a
clusula when others na seo EXCEPTION.

Tratar uma exceo


pre-definida pelo
Oracle

Aps identificar o erro predefinido que aconteceu, na


seo EXCEPTION, utilize a clusula when nome_erro
seguida de algum comando informativo.
Veja um exemplo na funo:
Retorna_Info_Curso_Tratada.

Tratar uma exceo


que no seja
predefinida pelo
Oracle

Siga o roteiro:
Declare uma varivel do tipo exception;
Associe essa varivel ao cdigo do erro que se deseja
tratar;
Crie uma entrada na seo EXCEPTION com o nome da
exceo criada.
Veja um exemplo na funo: Insere_Instrutor_Tratada.

Tratar excees que


representem Regras
de Negcio do Banco

Siga o roteiro:
Declare uma varivel do tipo exception;
Quando o erro acontecer, utilize o comando raise
nome_exceo;
Crie uma entrada na seo EXCEPTION com o nome da
exceo criada.
Veja um exemplo na funo:
Matricula_Aluno_com_Raise.

Oracle 9i Fundamental

171

ANOTAES

Oracle 9i Fundamental

172

Captulo 15 PACKAGES
OBJETIVOS

Compreender o conceito de Package;


Identificar situaes em que a utilizao de Packages melhora a
administrao de Unidades de Programa;
Construir um Package: especificao e corpo;
Ativar membros de um Package;
Avaliar os riscos de alterar objetos manipulados por membros de
um Package;
Diferenciar os tipos de Packages;
Utilizar alguns Packages embutidos, tais como DBMS_JOB e
DBMS_LOB.

ARQUIVOS NECESSRIOS

15_Especifica_Pack_Inst.sql;
15_Especifica_Pack_Body_Inst.sql;
15_Lista_Status.sql;
15_Mostra_Dependencias.sql;
Utldtree.sql;
15_Exemplos_DBMS_JOB.sql
15_Prepara_para_DBMS_LOB.sql;
15_Testa_DBMS_LOB_WRITE.sql;
15_Testa_DBMS_LOB_READ.sql;
15_Testa_DBMS_LOB_SUBSTR.sql;
15_Testa_DBMS_LOB_INSTR.sql;
15_Testa_DBMS_LOB_WRITEAPPEND.sql;
15_Testa_DBMS_LOB_ERASE.sql.

PR-REQUISITOS

Utilizar comandos SQL do tipo DML (Select, Insert, Delete, Update) em


Unidades de Programa;
Resolver problemas envolvendo processamento condicional ou
repetitivo;
Diferenciar procedure de function.
Oracle 9i Fundamental

173

TEORIA
15.1 - Fundamentos
medida que avanamos na produo de procedures e functions,
constatamos que muitas mantm algum tipo de relacionamento entre si.
Por exemplo, nos exerccios do captulo 11, foram desenvolvidas trs
rotinas que manipulavam a tabela Alunos: insero, alterao de cidade e
excluso26. Ora, seria muito mais interessante se pudssemos, de alguma
forma, "agrup-las" fisicamente.
Esse empacotamento comum em outras linguagens. Por exemplo, a C++
oferece dois tipos de arquivos: um para declaraes (extenso .H) e outro
para imple-mentaes (.CPP). J a Object Pascal possui arquivos nicos
(units), porm divididos em duas sees: interface e implementation.
PL/SQL possui os Packages que representam Unidades de Programa,
contendo uma coleo de procedures, functions, excees, estruturas de
dados (vetores, registros, tipos, objetos), cursores ou declaraes de
variveis comuns. Todo package divide-se em dois objetos de Banco:
Especificao
(Package)

Determina o que o Package oferece ao mundo exterior.


Consiste em diversas declaraes.

Corpo
(Package Body)

Informa como o Package interage com o mundo exterior, isto


, possui os cdigos das procedures e functions pblicas
(declaradas na Especificao) ou privativas (no declaradas).

As vantagens obtidas na utilizao de Packages so vrias:


1. Simplifica-se a gerncia de cdigo, j que, em vez de cinco, seis
rotinas que manipulam uma tabela, teremos apenas dois objetos:
uma Especificao e um Corpo;
2. O agrupamento de rotinas e variveis em torno de uma tabela
transforma o Projeto Fsico, tornando-o mais intuitivo, mais
prximo dos Projetos Conceitual e Lgico;
3. A manuteno facilitada, j que as conseqncias de mudanas
em tabelas podem ser facilmente "isolveis";
4. O encapsulamento ganho ao "esconder" a implementao do
mundo
exterior
proporciona
mais
flexibilidade
ao
desenvolvimento do cdigo, j que mudanas no Corpo so
imperceptveis externamente;
5. Ganha-se em performance, j que a ativao de qualquer
membro do package faz com que todo o conjunto seja carregado
em memria, ou seja, subseqentes chamadas a componentes
no causam idas a disco.

26

Consulte a seo Exerccios do captulo 11, nmeros 3, 4 e 6.

Oracle 9i Fundamental

174

Antes de criar um package, devemos reunir os elementos que manipulam


uma determinada tabela (procedures, functions, cursores, etc.). Depois, h
que se determinar quais podero ser vistos externamente e quais no.
Muito cuidado deve-se tomar quanto ao tamanho do package. Caso sejam
muito grandes, a SGA ser sobrecarregada desnecessariamente.
Existem trs tipos de Packages:
criados, embutidos (STANDARD,
DBMS_STANDARD, DBMS_OUTPUT, DBMS_JOB, etc.) e os fornecidos, que
dependem do ambiente de trabalho. Por exemplo, o Procedure Builder,
antiga ferramenta grfica semelhante ao SQL Navigator, disponibilizava o
TEXT_IO, que permite realizar operaes de entrada/sada (PUT_LINE
mostra um texto na tela).

15.2 - Criao
15.2.1 - Especificao
Aps identificar os elementos que faro parte do Package, deve-se,
inicialmente, criar a Especificao. O exemplo seguinte, presente no arquivo
15_Especifica_Pack_Inst, constri a de Pack_Instrutores, um pacote que
reunir as manipulaes tabela Instrutores.
1.
2.
3.
4.
5.
6.
7.
8.
9.

create or replace package pack_instrutores is


procedure elimina_instrutores_sem_turmas;
function insere_instrutor_tratada
(v_nome in instrutores.nome_instrutor%type,
v_tel in instrutores.tel_instrutor%type,
v_adm in instrutores.admissao%type)
return varchar2;
end pack_instrutores;

Observaes

A criao no SQL*Plus Worksheet requer a presena das palavras


reservadas create or replace antes do nome do Package. Caso
ocorram erros, emita o comando show errors;
Pelo SQL Navigator, uma estrutura genrica pode ser arrastada
para uma janela do SQL Editor a partir do Code Assistant (menu
View, comando Code Assistant), abrindo as pastas Syntax and
Web Catalog, PL/SQL Syntax, Blocks and Subprograms e
Package.

O resultado deve ser algo assim:


PACKAGE package_name IS
-- Enter package declarations as shown below
PROCEDURE procedure_name
( param1 IN datatype, param2 IN OUT datatype DEFAULT default_value);
FUNCTION function_name
( param1 IN datatype, param2 IN OUT datatype DEFAULT default_value)

Oracle 9i Fundamental

175

RETURN datatype;
END package_name ;

Para confirmar a criao do objeto anterior, investigue a viso


USER_OBJECTS:

select object_name from user_objects where object_type = 'PACKAGE';

Alm de procedures e functions, tambm podem existir


declaraes de cursores, excees ou variveis (simples ou
compostas);
O nome do Package aps o end opcional;
Para eliminar a especificao apresentada, emitimos o comando:

drop package pack_instrutores;

15.2.2 - Corpo
Uma vez criada a especificao, pode-se construir o corpo do Package. O
exemplo seguinte, presente no arquivo 15_Especifica_Pack_Body_Inst,
constri o corpo de Pack_Instrutores.
1.
2.
3.

7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.

28.
29.

create or replace package body pack_instrutores is


procedure elimina_instrutores_sem_turmas is
Begin
end;
function insere_instrutor_tratada
(v_nome in instrutores.nome_instrutor%type,
v_tel in instrutores.tel_instrutor%type,
v_adm in instrutores.admissao%type)
return varchar2
Is
nome_nulo exception;
pragma exception_init (nome_nulo, -1400);
Begin
end;
end;

Observaes

O nome de um PACKAGE BODY deve coincidir com o de um


PACKAGE (especificao) j criado;
A criao no SQL*Plus Worksheet requer a presena das palavras
reservadas create or replace antes da palavra PACKAGE. Caso
ocorram erros, emita o comando show errors;
Pelo SQL Navigator, uma estrutura genrica pode ser arrastada
para uma janela do SQL Editor a partir do Code Assistant (menu
View, comando Code Assistant), abrindo as pastas Syntax and
Oracle 9i Fundamental

176

Web Catalog, PL/SQL Syntax, Blocks and Subprograms e


Package Body.
Para confirmar a criao deste objeto, investigue a viso
USER_OBJECTS:

select object_name from user_objects where object_type = 'PACKAGE BODY';

Alm de procedures e functions previamente declaradas, tambm


podem existir outras implementaes, estas privativas, alm de
declaraes de cursores, excees ou variveis. Elas seriam
locais;
O nome do Package aps o end opcional;
Para eliminar a especificao apresentada, emitimos o comando:

drop package body pack_instrutores;

Uma vez criado o Corpo do Package, as rotinas que o constituem podem


ser eliminadas;
Aps o end da ltima rotina e antes do end do Package, podemos inserir
um bloco de comandos iniciado por begin. Ele ser executado
quando algum membro do Package for ativado pela primeira vez.

15.3 - Ativao
Criados os objetos referentes Especificao e ao Corpo, os membros do
Package j podem ser ativados normalmente, porm deve-se referenciar o
nome do Package. Vejamos um exemplo para o SQL*Plus Worksheet:
var resposta varchar2(80)
exec :resposta := pack_Instrutores.Insere_Instrutor_Tratada ('Novo','222',sysdate);
print resposta

E a sada:
RESPOSTA
-----------------------------------------------------Incluso OK!

Outro:
exec pack_Instrutores.Elimina_Instrutores_Sem_Turmas;
select nome_instrutor from instrutores;

E a sada:
NOME_INSTRUTOR
-----------------------------Maria Carolina Srio
Pedro Paulo Canopo
Augusto Lemos Vega
Mnica Silveira Capela

Oracle 9i Fundamental

177

Almir Altair
Leonardo Guimares Rigel
Beatriz Bellatrix
Carlos Regulos
Joana Aldebaran

Poderamos desfazer o efeito das ltimas excluses:


rollback;

Observe que o instrutor Novo no consta na listagem anterior, j que,


como acabou de ser cadastrado, no ministrou curso algum. No se
esquea que a chamada a qualquer membro causa a transferncia de todo
o package para a memria.

15.4 - Dependncias
As Unidades de Programa, exceto Triggers, podem estar em dois estados:
VALID ou INVALID. No primeiro caso, no existem erros de compilao.
Imagine que tivs-semos gravado a funo Calcula_Total_Arrecadado com
um erro de compilao proposital. O script seguinte, que consta no arquivo
15_Lista_Status, informa quem estaria com problemas:
column object_name format a30 heading 'OBJETO'
select object_name, object_type TIPO, status
from user_objects
where object_type in ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY')
order by 3,2,1;

E o resultado:
OBJETO
-----------------------------CALCULA_TOTAL_ARRECADADO
ATUALIZAGENERICO
CLASSIFICA_ARRECADADO
...
PACK_INSTRUTORES
PACK_INSTRUTORES
ALIMENTAHISTORICO
ALIMENTA_HISTORICO_FOR
...
LIMPAHISTORICO
RETORNA_INFO_CURSO

TIPO
-----------------FUNCTION
FUNCTION
FUNCTION

STATUS
------INVALID
VALID
VALID

PACKAGE
PACKAGE BODY
PROCEDURE
PROCEDURE

VALID
VALID
VALID
VALID

PROCEDURE
PROCEDURE

VALID
VALID

30 linhas selecionadas.

O SQL Navigator destaca as rotinas invlidas, apresentando-as em outra


cor. Pelo DB Navigator, confira em My Schema, Procedures, ou Functions,
ou Packages, ou Package Bodies.
O fato de um objeto estar invlido pode significar que existem erros de
compilao ou que um objeto (tabela, viso) referenciado teve sua estrutura
alterada (incluso de um campo, excluso, etc.). Esta relao entre objetos
Oracle 9i Fundamental

178

denomina-se dependncia que pode ser direta ou indireta (referncia a um


objeto que referencia a tabela).
O SQL Navigator mostra a quem a rotina faz referncia (Depends On) e
quem depende dela, isto , a invoca (Dependent Objects).
No caso especfico de Packages, existem trs situaes interessantes:
1. Apenas o Corpo muda: as rotinas que invocam seus membros
permanecem vlidas;
2. Apenas a Especificao muda: rotinas que invocarem quaisquer
membros so invalidadas;
3. Muda algum objeto referenciado por qualquer membro: todo o
package fica invlido.
Toda vez que uma Unidade de Programa invlida for executada, o Oracle
tenta recompil-la. Recomenda-se, entretanto, que este mecanismo seja
explicitado via comandos do tipo:
ALTER tipo_objeto nome_objeto COMPILE

Por exemplo, imagine que a rotina seguinte tivesse sido desenvolvida com a
ancens-tral Procedure Builder, que apresenta um package especfico
(text_io):
alter procedure retorna_info_curso compile;

E o erro:
Warning: Procedure altered with compilation errors.

Mostrando erros:
show errors

Sada:
Errors for PROCEDURE RETORNA_INFO_CURSO:
LINE/COL ERROR
-------- -------------------------------------------------12/2 PLS-00201: identifier 'TEXT_IO.PUT_LINE' must be declared
12/2 PL/SQL: Statement ignored
13/2 PLS-00201: identifier 'TEXT_IO.PUT_LINE' must be declared
13/2 PL/SQL: Statement ignored

O script seguinte fornece uma relao de objetos referenciados


(dependncias) a partir de um objeto/tipo:
rem
rem
rem
rem
rem
rem
rem
rem

*****************************************************
Nome:
Uso:
Exemplo:
Descrio:

15_mostra_dependencias.sql
@15_mostra_dependencias nome_objeto tipo_objeto
@15_mostra_dependencias pack_instrutores package body
Mostra dependncias para uma Unidade de Programa (exceto trigger)

*****************************************************

Oracle 9i Fundamental

179

set verify off


clear break
break on tipo_referenciado on nome
column nome
format a30
column referenciado
format a30
column tipo_referenciado
format a20
SELECT TYPE tipo, NAME nome, REFERENCED_NAME referenciado,
REFERENCED_TYPE tipo_referenciado
FROM
USER_DEPENDENCIES
WHERE NAME = UPPER('&1')
AND
TYPE = UPPER('&2')
AND
REFERENCED_TYPE IN ('PACKAGE','TABLE','VIEW')
ORDER BY 1,2,3;

E uma execuo:
@15_mostra_dependencias pack_instrutores package body
TIPO
---PACKAGE
PACKAGE

NOME
---------------PACK_INSTRUTORES
PACK_INSTRUTORES

REFERENCIADO
-----------INSTRUTORES
STANDARD

TIPO_REFERENCIADO
-----------------TABLE
PACKAGE

15.5 - Packages Embutidos


Neste tpico sero comentados alguns Packages embutidos, que ilustram
de que maneira podem ser teis no dia a dia. Muitos outros ainda sero
vistos nos prximos captulos.
DBMS_JOB

Automatiza tarefas permitindo implementar verdadeiros


procedimentos pr-ativos, ou seja, que se antecipem a
problemas em potencial. Mais detalhes em 15.5.1

DBMS_LOB

Permite a manipulao de grandes estruturas de dados (LOB Large Object). Mais detalhes em 15.5.2

DBMS_ALERT

Emite avisos quando d-se uma determinada situao. Como


trabalha em base a Triggers, veremos exemplos de utilizao
no prximo captulo.

15.5.1 - DBMS_JOB
Como j citado, este package oferece diversos recursos que permitem
automatizar tarefas. Antes que sejam analisados seus procedimentos,
convm definir trs conceitos muito importantes:
Job

Tarefa a ser executada em um momento especfico ou de forma


recorrente.

Job Queue

Conjunto de jobs executveis.

Agenda

Momento em que o job ser executado e, caso exista, intervalo de


recorrncia.
Oracle 9i Fundamental

180

Segue a lista de rotinas oferecidas por DBMS_JOB:


Submit

Cria um job, isto , insere-o na Job Queue.

Remove

Exclui um job.

Change

Altera funo ou agenda de um job. Opcionalmente pode-se


apenas alterar a funo (what), prxima ocorrncia (next_date) ou
recorrncia (interval).

Broken

Desativa ou ativa um job.

Run

Executa um job.

Imagine que seja necessrio registrar diariamente a quantidade de alunos


matricu-lada, ou seja, quantas linhas possuiria a tabela HISTORICO. Seria
criado um job que todos os dias, digamos s 17:00, gravasse um nmero
em uma dada tabela.
Em seguida resolve-se a questo a partir de exemplos extrados do arquivo
15_Exemplos_DBMS_JOB.
Criando a tabela de registros com dois campos:
CREATE TABLE log_matriculas
(Data_registro
Linhas

DATE DEFAULT sysdate NOT NULL,


NUMBER(4) DEFAULT 0 NOT NULL);

Criando Procedure que gravar a tabela:


PROCEDURE GRAVA_LOG_MATRICULAS
IS
v_linhas integer;
BEGIN
select count(*) into v_linhas from historico;
insert into log_matriculas values (sysdate,v_linhas);
commit;
END; -- Procedure

Antes que quaisquer jobs possam ser executados, preciso informar ao


sistema que ser possvel disparar tarefas mediante agenda prvia. Isto
acontece graas ao comando:
alter system set job_queue_processes = 20;

Esta instruo informa que, a partir de agora, at vinte jobs podero


acontecer simultaneamente. Inclusive, se houve disparos prvios, as
execues acontecero tambm neste momento.
Criando o job:
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno, 'GRAVA_LOG_MATRICULAS;',
trunc(sysdate, 'month') + 29 + 17/24, 'sysdate+1');
COMMIT;
END;

Oracle 9i Fundamental

181

Observaes:

A procedure submit devolve um parmetro representando a


identificao do job. Este nmero ser utilizado posteriormente
para quaisquer operaes sobre o job;
O segundo argumento representa o que dever ser executado.
Pode ser qualquer comando SQL, sempre terminado por ponto-evrgula. Nesse caso em particular, vemos que a procedure
GRAVA_LOG_MATRICULAS ser executada;
O terceiro argumento informa quando acontecer a primeira
execuo. O contedo revela que ser no dia 30 do ms corrente,
s 17 horas;

Finalmente, informa-se a recorrncia, ou seja, quando ocorrer a


prxima execuo. Neste exemplo, determinou-se que ser
exatamente um dia aps a ltima execuo. Observe que a
expresso aparece entre aspas simples e, caso houvesse um literal,
ele tambm viria cercado. Por exemplo, a expresso:
'NEXT_DAY(TRUNC(SYSDATE), ''FRIDAY'') + 10/24'

Significa que a prxima execuo ser na sexta-feira seguinte


ultima execuo, s dez da manh.
Uma vez criado o job, poderamos investigar seu histrico. Por exemplo:
select job, schema_user, to_char(next_date,
interval, what from dba_jobs

'dd/mm/yy

hh24:mi')

"PRXIMA

VEZ",

Nada impede que um job seja executado de forma independente de sua


agenda:
begin
dbms_job.run(27);
end;

Aps algumas execues, poderamos investigar o contedo da tabela de


registros:
select to_char(data_registro, 'dd/mm/yy hh24:mi') Instante , Linhas
from log_matriculas;

E uma possvel sada:


INSTANTE
LINHAS
-------------- ---------30/03/02 17:25
104
30/03/02 17:28
104

Finalmente, para eliminar um job:


Oracle 9i Fundamental

182

begin
dbms_job.remove(26);
commit;
end;

15.5.2 - DBMS_LOB
Como j visto nos Captulos 2 (Tabelas) e 10 (Variveis), o Oracle oferece
uma srie de tipos destinados ao tratamento de grandes volumes de dados.
Genericamente conhecidos por LOB Datatypes, eles permitem que campos
de tabelas ou variveis armazenem contedos to heterogneos quanto
filmes, fotos ou grandes textos.
Este tpico explora o package embutido DBMS_LOB exemplificando vrias
de suas rotinas. Os scripts fornecidos tratam todos de uma tabela
(TEXTUAL) com um campo de tipo CLOB.
Sero vistas as seguintes rotinas:
Write

Grava (bytes em BLOBs e NBLOBs e caracteres em


CLOBs e NCLOBs). Especificam-se uma posio inicial e
um tamanho, alm, claro, da sequncia a ser inserida.

Getlength

Funo que retorna o tamanho de um LOB.

Writeappend

Grava ao final do LOB.

Read

Recupera dados gravados previamente em LOBs.

Open

Abre um LOB. Ainda que no obrigatria, recomenda-se


esta operao para conferir mais robustez ao cdigo.

Close

Fecha um LOB previamente aberto.

IsOpen

Funo numrica que verifica se um dado LOB j foi


aberto.

Substr

Retorna parte de um LOB.

Instr

Realiza uma pesquisa em um LOB.

Erase

Apaga parcial ou totalmente um LOB.

Antes de mostrar exemplos destas rotinas, convm preparar o terreno. Ser


criada uma tabela:
create table Textual (
cod_item integer not null ,
nome_item varchar2(20) not null ,
detalhe_item clob null
);

Nenhum procedimento pode ser utilizado caso o campo LOB possua valor
nulo, assim, convm inici-lo na insero da linha:
insert into textual values (1, 'Tabelas', empty_clob());

Oracle 9i Fundamental

183

Em vez da funo empty_clob, tambm poderia ter sido utilizado um valor


qualquer.
O cdigo seguinte foi extrado do arquivo 15_Testa_DBMS_LOB_WRITE e
mostra como gravar caracteres em um CLOB:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.

create or replace PROCEDURE GRAVA_EM_CLOB IS


v_clob
CLOB;
v_texto
VARCHAR2(32767);
v_buffer
VARCHAR2(80);
v_qtde
BINARY_INTEGER := 20;
v_posicao
INTEGER := 1;
v_tamanho integer;
BEGIN
/* Localiza o CLOB: */
SELECT detalhe_item INTO v_clob
from textual where cod_item = 1 FOR UPDATE;
/* Abertura opcional */
DBMS_LOB.OPEN (v_clob, DBMS_LOB.LOB_READWRITE);
/* Texto
v_texto
v_texto
v_texto
v_texto
v_texto

a ser inserido */
:= 'A especificao de um tipo de campo deve ser ...
:= v_texto || 'valores candidatos ao ...
:= v_texto || 'entrada de cdigos de condomnio ...
:= v_texto || 'Integridade de Dados. Esta proteo ...
:= v_texto || 'domingos de sol enclausurados, sbados ...;

v_tamanho := length(v_texto);
while (v_posicao + v_qtde) <= v_tamanho loop
v_buffer := substr(v_texto, v_posicao, v_qtde);
DBMS_LOB.WRITE (v_clob, v_qtde, v_posicao, v_buffer);
v_posicao := v_posicao + v_qtde;
end loop;
v_posicao := v_posicao - v_qtde;
v_buffer := substr(v_texto, v_posicao, v_tamanho-v_posicao+1);
DBMS_LOB.WRITE (v_clob, v_tamanho-v_posicao +1 , v_posicao, v_buffer);
/* Se o LOB foi aberto, deve-se fech-lo */
DBMS_LOB.CLOSE (v_clob);
END;

Observaes:

27

A varivel v_clob conhecida por lob locator. Por meio dela sero
reali-zadas as gravaes. Alis, todas as rotinas de DBMS_LOB
utilizam um locator;
Note a clusula for update na linha 11. Ela indica que ocorrer
uma gravao em tabela;
A carga acontece entre as linhas 17 e 21. O Script exemplo
mostra o texto completo27;
A procedure write necessita de quatro argumentos: o locator, a
quantidade de caracteres a ser gravada, a posio inicial e a
cadeia propriamente dita. Deve-se tomar especial cuidado com a

Naturalmente, existem outras formas mais prticas de carregar grandes


volumes de texto. Em especial, recomenda-se a utilizao da ferramenta
SQL*Loader. Infelizmente, ela est alm do escopo deste livro.

Oracle 9i Fundamental

184

quantidade: caso ela revele mais caracteres do que realmente


existem por inserir, acontecer o fatdico erro ORA-21560;
As operaes de abertura e fechamento no so obrigatrias, mas
garantem que no seja processado um LOB previamente aberto,
mas no fechado.

Para verificar o tamanho de um LOB pode-se utilizar a funo getlength,


presente na poro de cdigo seguinte, extrada de
15_Prepara_para_DBMS_LOB:
35.
36.
37.
38.
39.

declare
v_texto clob; -- esta varivel conhecida por "locator"
Begin
select detalhe_item into v_texto from textual where cod_item = 1;
dbms_output.put_line ('Tamanho do texto: ' || dbms_lob.getlength
(v_texto));
end;

40.

Gravaes podem acontecer ao final do LOB, graas procedure writeappend.


O exemplo seguinte foi extrado do arquivo
15_Testa_DBMS_LOB_WRITEAPPEND:
1.
2.
3.
4.

create or replace PROCEDURE GRAVA_AO_FINAL_DO_CLOB IS


v_clob
CLOB;
v_buffer
VARCHAR2(80);
v_qtde
BINARY_INTEGER := 25; -- quantidade de caracteres
armazenada. Se houver menos, ERRO
BEGIN
/* Localiza o CLOB: */
SELECT detalhe_item INTO v_clob
from textual where cod_item = 1 FOR UPDATE;

5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

/* Abertura opcional */
DBMS_LOB.OPEN (v_clob, DBMS_LOB.LOB_READWRITE);
/* Texto a ser inserido */
v_buffer := 'Esta ser a ltima linha ';
DBMS_LOB.WRITEAPPEND (v_clob, v_qtde, v_buffer);
/* Se o LOB foi aberto, deve-se fech-lo */
DBMS_LOB.CLOSE (v_clob);
END;

Observaes

Tambm neste caso h o risco do ORA-21560, caso a quantidade


informada seja maior do que a efetivamente gravada;
A procedure writeappend, como era de se esperar, dispensa a posio
em que comear a gravao.

Uma vez carregado um LOB, pode-se acessar uma poro qualquer. O


cdigo seguinte foi extrado do arquivo 15_Testa_DBMS_LOB_READ e
mostra como ler caracteres de um CLOB:
Oracle 9i Fundamental

185

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.

create or replace PROCEDURE RECUPERA_DE_CLOB IS


v_clob
CLOB;
v_buffer
VARCHAR2(80);
v_qtde
BINARY_INTEGER := 80;
v_posicao
INTEGER := 1;
v_linhas
integer := 0;
BEGIN
/* Localiza o CLOB: */
SELECT detalhe_item INTO v_clob
from textual where cod_item = 1;
/* Abertura opcional */
if DBMS_LOB.isopen(v_clob)<> 1 then
DBMS_LOB.OPEN (v_clob, DBMS_LOB.LOB_READONLY);
end if;
LOOP
DBMS_LOB.READ (v_clob, v_qtde, v_posicao, v_buffer);
/* Exibe linha corrente: */
DBMS_OUTPUT.PUT_LINE(v_buffer);
v_posicao := v_posicao + v_qtde;
v_linhas := v_linhas + 1;
EXIT WHEN v_linhas = 10;
END LOOP;
/* Se o LOB foi aberto, deve-se fech-lo */
DBMS_LOB.CLOSE (v_clob);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Fim dos dados');
END;

Observaes

Para evitar que seja aberto o LOB duas vezes seguidas, utilizou-se a
funo isopen. Ela retorna apenas dois valores: 1 (est aberto) ou
zero (fechado);
Assim como a gravao, a leitura tambm precisa de quatro
argumentos: o locator, a quantidade de caracteres a ser lida, a
posio inicial e a cadeia que receber os dados;
Note que apenas dez linhas esto sendo lidas e mostradas.

Uma alternativa mais gil de leitura consiste em utilizar a funo substr,


como mostrado no exemplo seguinte extrado de
15_Testa_DBMS_LOB_SUBSTR:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

create or replace PROCEDURE RECUPERA_LINHA_DE_CLOB IS


v_clob
CLOB;
v_buffer
VARCHAR2(80);
v_qtde
BINARY_INTEGER := 80;
v_posicao
INTEGER := 8000;
BEGIN
/* Localiza o CLOB: */
SELECT detalhe_item INTO v_clob
from textual where cod_item = 1;
/* Abertura opcional */

Oracle 9i Fundamental

186

12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.

if DBMS_LOB.isopen(v_clob)<> 1 then
DBMS_LOB.OPEN (v_clob, DBMS_LOB.LOB_READONLY);
end if;
v_buffer := DBMS_LOB.SUBSTR (v_clob, v_qtde, v_posicao);
/* Exibe linha corrente: */
DBMS_OUTPUT.PUT_LINE(v_buffer);
/* Se o LOB foi aberto, deve-se fech-lo */
DBMS_LOB.CLOSE (v_clob);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Fim dos dados');
END;

Observao
A procedure anterior mostra a centsima linha.
Pesquisas tambm podem acontecer graas funo instr, como mostrado
no exemplo seguinte, extrado de 15_Testa_DBMS_LOB_INSTR:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

create or replace PROCEDURE BUSCA_CADEIA_EM_CLOB IS


v_clob
CLOB;
v_busca
VARCHAR2(15) := 'estrangeira';
v_posicao
INTEGER := 0;
v_deslocamento INTEGER := 1;
v_ocorrencia INTEGER := 1;
BEGIN
/* Localiza o CLOB: */
SELECT detalhe_item INTO v_clob
from textual where cod_item = 1;
/* Abertura opcional */
if DBMS_LOB.isopen(v_clob)<> 1 then
DBMS_LOB.OPEN (v_clob, DBMS_LOB.LOB_READONLY);
end if;
/* Busca */
v_posicao := DBMS_LOB.INSTR (v_clob, v_busca, v_deslocamento, v_ocorrencia);
IF v_posicao = 0 THEN
DBMS_OUTPUT.PUT_LINE('Palavra no encontrada');
ELSE
DBMS_OUTPUT.PUT_LINE('A Palavra foi encontrada na posio: '||
v_posicao);
END IF;
/* Se o LOB foi aberto, deve-se fech-lo */
DBMS_LOB.CLOSE (v_clob);
END;

Observao
7. Alm do locator e do elemento buscado, a funo instr ainda pede mais
dois argumentos: o ponto de partida para a busca (v_deslocamento) e
qual ocorrncia deve ser localizada.

Oracle 9i Fundamental

187

Finalmente, para limpar um LOB, utiliza-se a procedure erase. O exemplo


seguinte foi extrado de 15_Testa_DBMS_LOB_ERASE:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

create or replace PROCEDURE LIMPA_CLOB IS


v_clob
CLOB;
v_posicao
integer:= 8000;
v_qtde
BINARY_INTEGER := 80;
BEGIN
/* Localiza o CLOB: */
SELECT detalhe_item INTO v_clob
from textual where cod_item = 1 FOR UPDATE;
/* Abertura opcional */
DBMS_LOB.OPEN (v_clob, DBMS_LOB.LOB_READWRITE);
/* Elimina a centsima linha */
DBMS_LOB.ERASE (v_clob, v_qtde, v_posicao);
/* Se o LOB foi aberto, deve-se fech-lo */
DBMS_LOB.CLOSE (v_clob);
END;

Observao
8. Os caracteres "eliminados" so, na verdade substitudos por brancos.
No caso de BLOBS, os bytes so trocados por zeros.

EXERCCIOS
1. Liste procedures e functions que manipulem a tabela Alunos.

Experimente listar aquelas que contiverem a palavra ALUNO em seu


nome.

Deve existir uma forma melhor...

2. Execute o script utldtree.sql.

Foram criadas duas vises e uma procedure. Anote seus nomes.

3. Crie uma rvore de dependncias para a tabela Alunos.

Execute a procedure recm-criada deptree_fill com os argumentos: '


TABLE', nome usurio e 'ALUNOS'.

Investigue o contedo das recm-criadas vises deptree e ideptree.

4. Reuna as procedures e functions dependentes da tabela Alunos em um


Package: Pack_Alunos.
5. Elimine fisicamente as procedures e functions que agora constam em
Pack_Alunos.
6. Mude o nome da tabela Alunos para NovaAlunos.

Utilize o comando rename nome_antigo to nome_novo.


Oracle 9i Fundamental

188

7. Verifique o estado de Pack_Alunos. Resolva este problema.


8. Elabore uma tarefa que limpe a tabela TURMAS todo dia primeiro do
ms s cinco horas da manh. O critrio para eliminao deve ser a
data de incio anterior a um ano. Por "limpar" entenda a transferncia
dos registros para outra
tabela que poderia ser denominada
TURMAS_HST.
9. Parametrize as procedures GRAVA_AO_FINAL_DO_CLOB (a linha a ser
gravada), RECUPERA_DE_CLOB (nmero de linhas por mostrar),
RECUPERA_LINHA_DE_CLOB
(ensima
linha
por
mostrar),
BUSCA_CADEIA_EM_CLOB (palavra buscada) e LIMPA_CLOB (posio
inicial e quantidade de caracteres por eliminar).
10.
No diretrio \ORA92\RDBMS\DEMO h um arquivo de exemplos
de manipulaes de LOBs (LOBDEMO.SQL). Investigue-o.
11.
Reflita: convm primeiro criar procedures ou functions e somente
depois reuni-las em Packages? Ou ser melhor pensar em Packages
primeiro?

Oracle 9i Fundamental

189

REFERNCIA RPIDA
Tarefa

Como fazer

Criar uma
Especificao de
Package

Pelo SQL*Plus Worksheet execute um script que


contenha o comando create or replace package nome is
declaraes.
J pelo SQL Navigator ative o SQL Script Editor, abra
a cortina Drag'n Drop Sintax, selecione PL/SQL
Syntax, Blocks and Subprograms e arraste Package.

Criar um Corpo de
Package

Pelo SQL*Plus Worksheet execute um script que


contenha o comando create or replace package body nome is
declaraes privativas, implementaes.
J pelo SQL Navigator ative o SQL Script Editor, abra
a cortina Drag'n Drop Sintax, selecione PL/SQL
Syntax, Blocks and Subprograms e arraste Package
Body.

Ativar algum membro


pblico de um Package
Recompilar um
Package

Especifique o nome do Package e o membro separados


por ponto. Exemplo:
Pack_Alunos.Matricula_Aluno_Com_Raise (1,1)

Utilize o comando alter package. Exemplos:


alter package PACK_INSTRUTORES compile package;
alter package PACK_INSTRUTORES compile body;

Criar um job

Utilize a procedure submit do package embutido


DBMS_JOBS. Verifique previamente se o parmetro
job_queue_processes possui um valor maior que zero.
Para esta consulta faa:
show parameters job_queue_processes

Meta dados sobre jobs

Investigue as vises, USER_JOBS,


DBA_JOBS e DBA_JOBS_RUNNING,

Manipular LOBs

Utilize as rotinas oferecidas pelo package embutido


DBMS_LOB.

Oracle 9i Fundamental

ALL_JOBS,

190

Captulo 16 TRIGGERS
OBJETIVOS
9. Compreender o conceito de Triggers;
10.
Identificar situaes em que a utilizao de Triggers melhora o
desempenho de uma aplicao;
11.
Construir um Trigger;
12.
Caracterizar um Trigger pelo seu tipo, ao, escopo e tempo;
13.
Trabalhar com o Package embutido DBMS_ALERT.

ARQUIVOS NECESSRIOS

16_Trigger_Aft_Upd_Row_AumentaPrecos.sql;
16_Trigger_Bef_Ins_Row_InsereAluno.sql;
16_Trigger_Bef_Upd_Stm_Registro.sql;
16_Trigger_Bef_Del_Row_LimpaHist.sql;
16_Trigger_Bef_UpdIns_Stm_MultHist.sql;
16_Exemplo_Atualiza_View.sql;
16_Exemplo_Trigger_Schema.sql;
16_Exemplo_DBMS_ALERT.sql.

PR-REQUISITOS

Utilizar comandos SQL do tipo DML (Select, Insert, Delete, Update) em


Unidades de Programa;
Resolver problemas envolvendo processamento condicional ou
repetitivo;
Compreender o conceito de transao;
Tratar excees;
Diferenciar procedure de function;
Ter utilizado algum Package, embutido ou no.

TEORIA
16.1 - Fundamentos
Durante o desenvolvimento de uma aplicao, percebemos que muitas
aes acontecem como conseqncia de outras. No caso do Controle
Oracle 9i Fundamental

191

Acadmico,
ao
excluir
uma
turma,
seria
desejvel
eliminar
automaticamente as entradas dessa turma da tabela HISTORICO ou, caso
existam tabelas que representem itens avaliados pelos alunos que, ao
matricular um aluno, sejam inseridos tantos registros quantos forem os
itens por avaliar.
Triggers representam Unidades de Programa que so executadas,
automaticamente, antes ou depois de um comando disparador, que pode
ser tanto um DML (update, insert ou delete), como um DDL (create, alter, drop,
truncate table), ou mesmo um evento ocorrido no Database (uma conexo,
por exemplo).
As vantagens obtidas na utilizao de Triggers so vrias:
1. Preenchimento de campos resultante de uma expresso. Isto
ocorreria, por exemplo, em chaves primrias numricas cujo
contedo poderia ser gerado de uma Sequence;
2. A crtica aos dados oferece mais possibilidades do que a realizada via
constraints. Inclusive, emitindo mensagens mais adequadas s
regras do negcio;
3. Acessos que alterem linhas de uma tabela ou eventos que ocorram
ao Database podem ser registrados em outra tabela (auditoria);
4. A performance geral incrementada, j que o processamento ocorre,
automaticamente, no Servidor;
5. Permite alteraes (insert, update, delete) sobre views que
normalmente no poderiam ser modificadas (possuindo clusula
group by, distinct ou operador union, por exemplo);
6. Acompanhar o que ocorre aps eventos no Database (conexes, erros,
etc.).
Existem algumas diferenas entre Triggers e procedures ou functions:
Trigger

Procedure ou Function

Ativado implicitamente;

Ativado explicitamente;

Proibidos:
savepoint;

commit,

rollback

ou

Estes comandos so permitidos;

Quem ativa no precisa possuir Quem ativa precisa possuir privilgio de


privi-lgio de execuo;
execu-o;
No se pode emitir um comando
select/into em tabelas afetadas Restrio no se aplica.
pelo Trigger, ditas mutantes.

Antes de definir um Trigger, devemos compreender quatro caractersticas


bsicas:

Oracle 9i Fundamental

192

Tipo

Ao

Escopo
Tempo

Um Trigger pode ser de quatro tipos: DML (disparado a partir de um


insert, update ou delete - exemplos em 16.2 e 16.3); Instead Of
(utilizado exclusivamente para inseres, atualizaes ou excluses em
views que normalmente no poderiam ser modificadas - exemplo em
16.4); Schema (disparado antes ou depois de um comando DDL exemplo em 16.5) e Database (executado a partir de um evento
ocorrido no mbito do Banco de Dados, tal como sua abertura28exemplos no captulo 19).
Representa o comando que provocou a execuo do Trigger: insert,
update, delete, create, truncate table, etc. Nada impede que exista um
Trigger que responda a dois ou mais comandos.
Para os do tipo DML, indica se o cdigo contido no Trigger ser
executado para cada linha afetada ou apenas uma vez. Triggers do tipo
Instead Of so executados para cada linha da view.
Indica se a execuo ocorrer antes, depois ou em vez da ao.

Pela definio vista anteriormente, podem existir para uma dada tabela
doze tipos diferentes de Triggers DML:
Ao

Escopo

Tempo

1. INSERT

FOR EACH ROW

BEFORE

2. INSERT

FOR EACH ROW

AFTER

3. INSERT

STATEMENT

BEFORE

4. INSERT

STATEMENT

AFTER

5. UPDATE

FOR EACH ROW

BEFORE

6. UPDATE

FOR EACH ROW

AFTER

7. UPDATE

STATEMENT

BEFORE

8. UPDATE

STATEMENT

AFTER

9. DELETE

FOR EACH ROW

BEFORE

10. DELETE

FOR EACH ROW

AFTER

11. DELETE

STATEMENT

BEFORE

12. DELETE

STATEMENT

AFTER

Independente da quantidade de linhas afetadas, caso exista algum


problema na execuo do Trigger (exceo, por exemplo), todo o comando
desfeito.
Durante a execuo de um Trigger DML ou Instead Of que afete vrias
linhas, podemos, eventualmente, consultar ou modificar os valores antigos
e novos dos campos da linha sendo alterada. Existem duas variveis de
ambiente que representam a linha corrente prvia (:old) e a posterior
alterao (:new). Devem- -se observar as seguintes regras:
28

Por "abrir" um Banco de Dados entende-se a operao STARTUP, que ser


vista em detalhes no Captulo 19.

Oracle 9i Fundamental

193

Em Triggers BEFORE, possvel tanto consultar como alterar


:new;
Em Triggers AFTER, possvel apenas consultar :new;
Ainda que seja possvel tanto consultar como alterar :old em
Triggers BEFORE ou AFTER, somente faz sentido consult-la;
Em Triggers STATEMENT, a utilizao de :new e :old proibida.

16.2 - Criao
Para criar um Trigger no SQL*Plus Worksheet, devemos editar um arquivo
texto contendo a seguinte estrutura:
16.
17.
18.
19.
20.
21.
22.

CREATE OR REPLACE nome_trigger


[BEFORE | AFTER | INSTEAD OF]
[INSERT OR DELETE OR UPDATE][OF coluna]
ON [tabela | DATABASE | SCHEMA]
WHEN condio
[FOR EACH ROW]
bloco PL/SQL

Observaes

A criao no SQL*Plus Worksheet requer a presena das palavras


reservadas create or replace antes do nome do Trigger. Caso ocorram
erros, emita o comando show errors trigger nome_trigger;
A clusula presente na segunda linha aplica-se apenas para os
Triggers do tipo DML ou Instead Of, j a da sexta, apenas para os
DML;
A clusula when restringe a execuo do Trigger a situaes que
atendam condio especificada. Veja exemplos em seguida;
O bloco de comandos PL/SQL tem a mesma estrutura dos j vistos
at aqui, ou seja, h uma rea para declarar variveis locais. Seguese com o corpo do bloco propriamente dito e finaliza-se com o
tratamento de excees.

O exemplo seguinte representa um Trigger do tipo DML e ser disparado


para cada linha da tabela CURSOS e aps algum update. O cdigo
encontra-se no arquivo 16_Trigger_Aft_Upd_Row_AumentaPrecos.sql
1.
2.
3.
4.
5.
6.
7.
8.
9.

create or replace trigger t_aft_upd_row_AumentaPrecos


after update
on cursos
for each row
Begin
if :new.preco > 1200 then
raise_application_error(-20500, 'Tentativa exagerada de aumento!');
end if;
end;

Oracle 9i Fundamental

194

Observao

Pelo SQL Navigator, aps conectado, abra o menu Object, ative


Open DB Object e selecione o Trigger em questo. Observe que o
Trigger Editor apresenta cinco guias: Details (especifica as
caractersticas do Trigger), Trigger Body (mostrado em seguida),
Columns (caso se limite o escopo do Trigger a poucas colunas da
tabela), When e Dependencies (de quem o Trigger depende, ou
seja, qual ou quais objetos no podem ser eliminados ou mesmo
alterados sem afetar o Trigger).

Para confirmar a criao do Trigger, investigue a viso USER_TRIGGERS:


select trigger_name from user_triggers;

Para eliminar um Trigger, emitiramos o comando:


drop trigger t_aft_upd_row_aumentaprecos;

Para desabilitar/habilitar temporariamente um ou todos os Triggers de


uma tabela:
alter
alter
alter
alter

table cursos disable all triggers;


table cursos enable all triggers;
trigger t_aft_upd_row_aumentaprecos disable;
trigger t_aft_upd_row_aumentaprecos enable;

O nome de um Trigger deve deixar claro as caractersticas dele. Analise a


lei de formao do exemplo anterior.
Veja em seguida uma possvel execuo:
update cursos set preco = preco * 2;

E a resposta:
update cursos set preco = preco * 2
*
ERROR at line 1:
ORA-20500: Tentativa exagerada de aumento!
ORA-06512: at "MORELLI.T_AFT_UPD_ROW_AUMENTAPRECOS", line 3
ORA-04088: error during execution of trigger 'MORELLI.T_AFT_UPD_ROW_AUMENTAPRECOS'

Oracle 9i Fundamental

195

Perceba que mesmo que algumas linhas possam ser alteradas, toda a
execuo cancelada.

16.3 - DML
16.3.1 - INSERT
Segue o exemplo de um Trigger de insero disparado previamente ao
comando e fazendo distino em cada linha. O cdigo encontra-se no
arquivo 16_Trigger_Bef_Ins_Row_InsereAluno.sql.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

create or replace trigger t_bef_ins_row_InsereAluno


before insert
on alunos
for each row
Declare
nova_matricula number;
Begin
select Gera_Matr_aluno.Nextval
into nova_matricula from dual;
:new.matricula := nova_matricula;
end;

Uma vez criado, o Trigger anterior permitiria inseres como esta:


insert into alunos (nome_aluno) values ('Francisco Musca');

Comprovando:
select max(matricula) from alunos;

E a sada:
MAX(MATRICULA)
-------------40

Observaes
A seqncia Gera_Cod_aluno deve existir. No script que possui o Trigger
h um comando de criao:
create sequence gera_matr_aluno
start with 40 increment by 1 maxvalue 1000
nocycle;

Note a declarao de uma varivel local;


Caso seja realizada uma insero mltipla (com subquery, por exemplo),
seriam gerados vrios cdigos: um para cada linha afetada.

16.3.2 - UPDATE

Oracle 9i Fundamental

196

Segue o exemplo de um Trigger de atualizao disparado previamente ao


comando e sem fazer distino em cada linha. O cdigo encontra-se no
arquivo 16_Trigger_Bef_Upd_Stm_Registro.sql.
1.
2.
3.
4.
5.
6.
7.

create or replace trigger t_bef_upd_stm_Registro


before update
on cursos
Begin
update Tab_Auditoria
set atualizacoes = atualizacoes + 1;
end;

Uma vez criado, o Trigger anterior permitiria atualizaes como esta:


update cursos set preco = 100;

Comprovando:
select * from tab_auditoria;

E a sada:
ATUALIZACOES
-----------1

Observaes
A tabela Tab_Auditoria j deve existir. No script que possui o Trigger
h o comando de criao e tambm o que insere a primeira linha
create table tab_auditoria (atualizacoes number);
insert into tab_auditoria values(0);
commit;

Perceba que o Trigger executado uma vez apenas, independente da


quantidade de linhas afetadas pelo comando.

16.3.3 - Delete
Segue o exemplo de um Trigger de excluso disparado previamente ao
comando e fazendo distino em cada linha. O cdigo encontra-se no
arquivo 16_Trigger_Bef_Del_Row_LimpaHist.sql.
1.
2.
3.
4.
5.
6.
7.
8.

create or replace trigger t_bef_del_row_LimpaHist


before delete
on turmas
for each row
Begin
delete historico
where cod_turma = :old.cod_turma;
end;

Antes de testar o Trigger recm-criado, deveramos desabilitar a restrio


que impede as excluses em cascata:
alter table historico disable constraint historico_turma_fk;

Oracle 9i Fundamental

197

Supondo que as tabelas TURMAS e HISTORICO estejam preenchidas, o


seguinte comando:
delete turmas;

alm de excluir todas as linhas de TURMAS, tambm o faria com a de


matrculas!
Naturalmente, a execuo de um rollback restabeleceria as quantidades
prvias excluso.

Observaes
Triggers e Constraints so conflitantes entre si, por isto realizou-se a
desabilitao;
Existe uma notria recomendao da Oracle em no abusar da
utilizao de Triggers devido s inmeras possibilidades de
interdependncias. Ao cri-los em grande nmero, tende-se a perder
o controle sobre as conseqncias de cada comando emitido.

16.3.4 - Mltiplos
O mesmo Trigger pode ser disparado por mais de um comando, isto , um
delete provocaria o mesmo Trigger que um update. Suponha que seja
proibido atualizar a tabela HISTORICO aos domingos ou inserir uma nota
aps as 18:30.
Veja o exemplo presente em 16_Trigger_Bef_UpdIns_Stm_MultHist.sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

create or replace trigger t_bef_updIns_stm_MultHist


before insert or update
on historico
Declare
v_hoje number;
v_agora number;
Begin
v_hoje := to_number(to_char(sysdate,'d'));
v_agora := to_number(to_char(sysdate,'hh24mi'));
if inserting then
if v_agora > 1830 then
raise_application_error(-20600, 'Hora proibida para inseres');
end if;
Else
if v_hoje = 1 then
raise_application_error(-20700, 'Dia proibido para atualizaes');
end if;
end if;
end;

E possveis ativaes em horrios imprprios:


insert into historico values (12,12,10);

Resposta:
insert into historico values (12,12,10)
*
ERROR at line 1:

Oracle 9i Fundamental

198

ORA-20600: Hora proibida para inseres


ORA-06512: at "MORELLI.T_BEF_UPDINS_STM_MULTHIST", line 9
ORA-04088: error during execution of trigger 'MORELLI.T_BEF_UPDINS_STM_MULTHIST'

Outra:
update historico set nota = 10;

Sada:
update historico set nota = 10
*
ERROR at line 1:
ORA-20700: Dia proibido para atualizaes
ORA-06512: at "MORELLI.T_BEF_UPDINS_STM_MULTHIST", line 13
ORA-04088: error during execution of trigger 'MORELLI.T_BEF_UPDINS_STM_MULTHIST'

16.4 - Atualizao de Views


No Captulo 6, item 6.3, Views, foi dito que existe uma srie de restries
quanto possibilidade de emitir comandos insert, update ou delete
diretamente sobre Views. Entretanto, com Triggers instead of essas
limitaes podem ser contornadas. Por exemplo, a viso seguinte no
aceitaria comandos de insero, j que possui um operador union29:
create view vPessoas as
select nome_aluno as nome, 'a' as tipo
from alunos
union
select nome_instrutor, 'i'
from instrutores;

Felizmente, o Trigger seguinte contorna esta limitao:


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

create or replace trigger t_io_vPessoas


instead of insert
On vPessoas
declare v_cod_instrutor number;
Begin
select max(cod_instrutor)+1 into v_cod_instrutor from instrutores;
if :new.tipo = 'a' then --aluno!
insert into alunos (nome_aluno) values (:new.nome);
Else
insert into instrutores (cod_instrutor, nome_instrutor)
values (v_cod_instrutor, :new.nome);
end if;
end;

Observaes
Como no h Trigger que gere um cdigo de instrutor, isto teve que ser
feito agora.
Testes de insero:
29

Os
cdigos
seguintes
16_Exemplo_Atualiza_View.sql.

encontram-se

Oracle 9i Fundamental

no

Script

exemplo

199

insert into vPessoas (nome, tipo) values ('Aluno', 'a');


insert into vPessoas (nome, tipo) values ('Instrutor', 'i');

Os comandos anteriores, na prtica, inserem uma linha nova nas tabelas


ALUNOS e INSTRUTORES, como era de se esperar, j que Views no
armazenam dados. Perceba que a insero somente foi possvel graas ao
Trigger.

16.5 - Schema
Trigger do tipo Schema permite acompanhar o que acontece quando um
comando DDL utilizado. Poderamos criar um registro de todos os
CREATEs ocorrido, ou talvez evitar que tabelas sejam truncadas, ou ainda
criar um log detalhado sobre permisses concedidas30.
Normalmente, Triggers tipo Schema utilizam um tipo especial de funo
dita de evento, ou seja, elas retornam informaes sobre acontecimentos
correntes. O exem-plo seguinte registra a ocorrncia de comandos truncate
table (os comandos que seguem foram extrados do arquivo exemplo
16_Exemplo_Trigger_Schema.sql).
Inicialmente cria-se a tabela:
create table GuardaTruncates
(quando date default sysdate,
quem varchar2(20) default user,
onde varchar2(20));

A seguir, cria-se o Trigger:


create or replace trigger t_registra_truncates after truncate
on schema
begin
insert into GuardaTruncates (onde) values (ora_dict_obj_name);
end;

Observe a presena da funo de evento ora_dict_obj_name. Ela informa o


nome do objeto que sofreu o comando que, por sua vez, disparou o Trigger.
Assim como ela, h diversas outras. Veja algumas:

30

ora_database_name

nome do Banco de Dados corrente

ora_dict_obj_owner

dono do objeto que sofreu o comando

ora_dict_obj_type

tipo do objeto

ora_sysevent

nome do evento corrente

ora_is_alter_column(
column_name IN VARCHAR2)

retorna TRUE caso o nome passado coincida com


o de uma coluna sendo alterada.

ora_is_drop_column(
column_name IN VARCHAR2)

Retorna TRUE caso o nome passado coincida


com o de uma coluna sendo eliminada.

O assunto "permisses" ser visto em detalhes no Captulo 24, Segurana.

Oracle 9i Fundamental

200

16.6 - DBMS_ALERT
Este Package permite que ocorra um aviso quando uma determinada
situao acontecer. Por exemplo, imagine que seja necessria a imediata
comunicao de um preo hora instrutor superior a R$ 50.
Segue a lista das principais rotinas oferecidas por DBMS_ALERT:
Register

Registra um evento em uma sesso.

Remove

Exclui um evento previamente registrado em uma sesso.

Removeall

Exclui todos os eventos previamente registrados em uma


sesso.

Set_defaul
ts

Ajusta o intervalo de tempo utilizado para verificar se ocorreu


uma determinada situao.

Signal

Dispara um alerta.

Waitany

Recebe quaisquer alertas.

Waitone

Recebe um alerta especfico.

Ateno

Caso as procedures de DBMS_ALERT no estejam disponveis, isto , as


unidades de programa que as invocarem apresentem erros informando
que elas precisam ser declaradas, deve-se executar o script
dbmsalrt.sql que est localizado sob o diretrio de instalao, em
\rdbms\admin\.

Para que seja possvel realizar tal notificao, inicialmente criaremos um


Trigger sobre a tabela de turmas, depois abre-se uma sesso cuja nica
funo ser "esperar" a ocorrncia e finalmente provoca-se a insero de
um instrutor cuja hora aula passe da meia centena de reais. O cdigo
mostrado em seguida consta no arquivo 16_Exemplo_DBMS_Alert.sql.
Criando o Trigger:
1.
2.
3.
4.
5.
6.
7.
8.

create or replace trigger t_aft_iu_row_Checa_pco_Hora


After insert or update on Turmas
For each row
When (new.preco_hora_instrutor > 50)
Begin
dbms_alert.signal ('Instrutor_Caro', 'Valor preo hora: ' ||
to_char (:new.preco_hora_instrutor));
end;

Observaes
Note a presena da clusula when. Ela impede que o Trigger em questo
seja disparado quando ocorrerem inseres e/ou atualizaes que
no estejam de acordo com a condio especificada;

Oracle 9i Fundamental

201

Perceba tambm que o identificador new.preco_hora_instrutor no


aparece precedido por dois pontos, como est no corpo do Trigger
(linha 7);
A procedure signal mandar um aviso a todas as sesses que estiverem
esperando por notificaes.
Criando uma procedure que prepara uma sesso para que ela possa ser
notificada:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

create or replace procedure Prepara_espera


Is
status number;
mensagem char(40);
timeout number;
nome varchar2(20);
Begin
timeout := 60;
nome := 'Instrutor_Caro';
dbms_alert.register (nome);
dbms_alert.waitany (nome, mensagem, status);
if status = 0 then
dbms_output.put_line ('Recebida: '|| mensagem);
end if;
dbms_alert.remove (nome);
end;

Observaes
A procedure waitany necessita de trs argumentos: o nome do alerta,
uma varivel que receber a mensagem de signal e um estado que
acusar o recebimento.
Agora basta abrir duas conexes. Na primeira ser executada a procedure
de espera e na segunda, uma insero na tabela TURMAS. Se em um
minuto acontecer uma insero, a sesso que estiver "aguardando" emitir
uma mensagem do tipo:
Recebida: Valor preo hora: 60

EXERCCIOS
1. Substitua os constraints historico_turma_fk e historico_aluno_fk por
um Trigger de insero prvia, verificando cada linha.
Tanto o cdigo da turma quanto a matrcula j devem existir para
que a insero se concretize.
Qual a vantagem desta soluo em detrimento da que utiliza
constraints?
2. Desabilite o Trigger recm-criado, insira uma linha em HISTORICO com
aluno inexistente e depois reabilite o Trigger.
Voc conseguir! Como resolver este problema?
Oracle 9i Fundamental

202

3. Expanda Tab_Auditoria para que registre inseres e excluses.


Permita que sejam gravados tambm usurio e data/horrio correntes.
A funo user retorna o usurio corrente.
A funo sysdate retorna data/horrio correntes.
4. Partindo da uma lista de presenas criada no stimo exerccio do
captulo sexto, crie um Trigger que permita inserir um curso por meio
da view.
5. Crie um Trigger que registre cada create em uma tabela contendo data,
usurio e nome de objeto.
No Trigger do tipo SCHEMA criado, utilize os eventos
ora_dict_obj_name (nome do objeto corrente) e ora_dict_obj_type
(tipo de objeto criado - tabela, view, procedure, etc.).
6. Elabore um alerta que avise sempre que houver um truncate table.
7. Reflita sobre a importncia dos Triggers para melhorar a segurana de
um Banco de Dados.
8. Como Triggers poderiam fazer parte de uma poltica de proteo aos
dados?

REFERNCIA RPIDA
Tarefa

Como fazer

Criar um Trigger

Pelo SQL*Plus Worksheet execute um script que


contenha o comando create or replace Trigger.
J pelo SQL Navigator, expanda My Schema, d um
clique direito em Triggers e ative Create. Fornea nome,
tabela base, ao, escopo, tempo e cdigo.

Eliminar um Trigger

Utilize o comando drop trigger nome.

Desabilitar um
Trigger

alter table nome disable all triggers;

Podem-se desabilitar todos os Triggers de uma tabela:


ou faz-lo para apenas um Trigger: alter trigger nome disable;
Podem-se habilitar todos os Triggers de uma tabela:

Habilitar um Trigger

alter table nome enable all Triggers;

ou faz-lo para apenas um Trigger:


alter trigger nome enable;

Listar Triggers

Investigue a viso USER_TRIGGERS.

Criar um esquema de
notificaes

Utilize o Package embutido DBMS_ALERT. Veja exemplo


em 16.6.

Oracle 9i Fundamental

203

ANOTAES

Oracle 9i Fundamental

204

Captulo 17 OBJETOS
OBJETIVOS

Apresentar os conceitos primordiais que sustentam o Paradigma


da Orien-tao por Objetos;
Constatar como os conceitos do POO so aplicados no Oracle9i;
Criar uma classe;
Criar outra classe utilizando o mecanismo da herana;
Instanciar objetos de uma classe;
Criar uma tabela de objetos;
Criar referncias entre objetos;
Criar colees de tamanho varivel com NESTED TABLES e fixo
com VARRAYS.

ARQUIVOS NECESSRIOS

17_Cria_Classe_Funcionario.sql;
17_Cria_Classe_Funcionario_Body.sql;
17_Instancia_Funcionario.sql;
17_Cria_Classe_Herdada_Gerente.sql;
17_Cria_Tabela_Funcionarios.sql;
17_Trata_Classe_Projetos.sql;
17_Cria_Classe_Funcionario_com_Dependentes.sql;
17_Cria_Tabela_Funcionarios_com_Dependentes.sql;
17_Cria_Classe_Funcionario_completa.sql;
17_Cria_Tabela_Funcionarios_completa.sql.

PR-REQUISITOS

Utilizar comandos SQL do tipo DML (Select, Insert, Delete, Update) em


Unidades de Programa;
Resolver problemas envolvendo processamentos condicional ou
repetitivo.

Oracle 9i Fundamental

205

MOTIVAO
O Paradigma da orientao por Objetos31
O conceito de programao orientada por objetos no novo. No
final da dcada de 60, a linguagem Simula67, desenvolvida na Noruega,
introduzia conceitos hoje encontrados nas linguagens orientadas a objetos.
Em meados de 1970, o Centro de Pesquisa da Xerox (PARC)
desenvolveu a linguagem Smalltalk, a primeira totalmente orientada a
objetos. No incio da dcada de 80, a AT&T lanaria a Linguagem C++, uma
evoluo da linguagem C em direo orientao a objetos.
Atualmente, a grande maioria das linguagens incorpora
caractersticas de OO, como Java e Object Pascal. Alm das linguagens de
programao, possvel encontrar o conceito de OO em sistemas
operacionais, como no caso do Windows 2000, e em banco de dados, como
no Oracle a partir da verso 8 e, principalmente, Jasmine da CA.
A programao orientada a objetos tem como principais objetivos
reduzir a complexidade no desenvolvimento de software e aumentar sua
produtividade. A anlise, projeto e programao orientadas a objetos so as
respostas para o aumento da complexidade dos ambientes computacionais
que se caracterizam por sistemas heterogneos, distribudos em redes, em
camadas e baseados em interfaces grficas.
A programao orientada a objetos no tem a inteno de substituir
a programao estruturada tradicional. Podemos considerar que a
programao OO uma evoluo de prticas que so recomendadas na
programao estruturada, mas no formalizadas, como o uso de variveis
locais, visibilidade e escopo. O modelo de obje-tos permite a criao de
bibliotecas que tornam efetivos o compartilhamento e a reutilizao de
cdigo, reduzindo o tempo de desenvolvimento e, principalmente,
simplificando o processo de manuteno das aplicaes.
A grande dificuldade para compreender a programao OO a
diferena de abordagem do problema. Enquanto a programao
estruturada tem como principal foco as aes (procedimentos e funes), a
programao OO se preocupa com os objetos e seus relacionamentos. Alm
do conceito de objeto, a programao OO tem como alicerces os conceitos
de encapsulamento, classe, herana e polimorfismo.
Programao Orientada a
Objetos

Programao Estruturada

Mtodos

Procedimentos e funes

Instncias de variveis

Variveis

31

Este artigo foi escrito por Luiz Paulo Maia.


Reviso: Eduardo T. Morelli.

Oracle 9i Fundamental

206

Programao Orientada a
Objetos

Programao Estruturada

Mensagens

Chamadas a procedimentos e funes

Classes

Tipos de dados definidos pelo usurio que


criam
estruturas
de
dados
mais
procedimentos que as manipulam

Herana

Polimorfismo

Um objeto uma abstrao de software que pode representar algo


real ou virtual. Um objeto formado por um conjunto de propriedades
(variveis) e procedimentos (mtodos). As variveis possuem um tipo, que
define os possveis valores que a varivel pode representar, como um
nmero inteiro, nmero real ou string. Os mtodos so rotinas que,
quando executadas, realizam alguma tarefa, como alterar o contedo de
uma varivel do objeto.
Um exemplo de objeto poderia ser um automvel. O objeto
automvel possui propriedades, como velocidade, nmero de portas e limite
de passageiros. O objeto automvel tambm possui procedimentos, como
ligar, desligar, acelerar e parar. Um exemplo menos concreto de um objeto
poderia ser um processo em um sistema operacional. Um processo tem
propriedades, como identificao, prioridade, privil-gios e quotas. Um
processo possui procedimentos associados, como criar, eliminar, alterar a
prioridade e visualizar suas caractersticas.
Os objetos se comunicam apenas por meio de mensagens. Quando
um objeto deseja alguma tarefa de um outro objeto, ele envia uma
mensagem contendo o nome do objeto-origem, nome do objeto-destino,
nome do mtodo a ser ativado no objeto-destino e, se necessrio,
parmetros que permitem especificar alguma funo especial a ser
executada pelo mtodo. Este conceito se assemelha chamada de uma
rotina em uma linguagem tradicional. O conjunto de mensagens que um
objeto pode responder definido como protocolo de comunicao.
As variveis de um objeto s podem ser alteradas por mtodos
definidos na prpria classe. A nica maneira de um objeto alterar as
variveis de um outro objeto seria pela ativao de um de seus mtodos por
uma mensagem. Este conceito, em que variveis e mtodos so visveis
apenas por meio de mensagens, conhecido como encapsulamento. O
encapsulamento funciona como uma proteo para as variveis e mtodos,
alm de tornar explcito qualquer tipo de comunicao com o objeto.
Geralmente, objetos so criados e eliminados em funo da execuo
do programa. Um objeto pode ser instanciado (criado) por um certo perodo
de tempo e depois destrudo, liberando o espao de memria ocupado, em
um processo automtico conhecido como "garbage collection" (coleta de
lixo). possvel, porm, criar objetos persistentes, que continuam existindo
mesmo depois do trmino do pro-grama que os criou. Um claro exemplo de
Oracle 9i Fundamental

207

objetos persistentes seriam os armaze-nados em Bancos de Dados


Orientados a Objetos.
Uma classe consiste de variveis e mtodos que representam
caractersticas de um conjunto de objetos semelhantes. O conceito de
classe um dos pilares da programao orientada a objetos, por permitir a
reutilizao efetiva de cdigo.
A declarao de classe similar dos tipos definidos pelo usurio
nas linguagens de programao de alto nvel. Nessas linguagens, possvel
definir um novo tipo de dado e declarar uma varivel deste tipo. No caso de
objetos, primeiro definimos uma classe com suas variveis e mtodos e,
depois, declaramos um objeto dessa nova classe. Um objeto definido
como sendo uma instncia de uma determinada classe. A classe esttica,
enquanto o objeto dinmico. No exemplo seguinte, escrito em C++,
estamos definindo uma classe T_Ponto, em que as variveis x e y
representam a posio de um ponto na tela. Posteriormente declaramos um
objeto p da classe T_Ponto.
class T_Ponto /* Define a classe Ponto */
{
int x;
int y;
public
void altera_xy (int a, int b)
{
x=a;
y=b;
}
int obtem_x () { return x; }
int obtem_y () { return y; }
};
T_Ponto p; /* Declara o objeto p da classe Ponto */

No mesmo exemplo, para alterarmos o valor das variveis x e y,


necessrio o envio de uma mensagem para o objeto p, especificando o
mtodo altera_xy e passando os novos valores como parmetros. Da mesma
forma, para consultar os valores de x e y, preciso acionar os mtodos
obtem_x e obtem_y respectivamente. Os mtodos que permitem a
comunicao do objeto com o mundo exterior so conhecidos como
interfaces pblicas.
Ainda sobre o exemplo anterior, nada impediria que as variveis
fossem instncias, assim, poderia existir uma classe denominada T_Crculo
com dois atributos: raio (inteiro) e centro (T_Ponto).
O conceito de herana permite definir uma nova classe, com base em
uma j existente. A classe criada (subclasse ou classe derivada)
automaticamente herda todas as variveis e mtodos da classe j existente
(superclasse). O mecanismo de herana permite ainda que a subclasse
inclua ou sobreponha novas variveis e mtodos da superclasse.
No exemplo anterior, em que criamos a classe T_Crculo, poderamos
adotar uma soluo alternativa: em vez de duas variveis (raio e centro),
definiramos apenas um (raio) e o outro seria herdado de T_Ponto.
Oracle 9i Fundamental

208

O conceito de herana da POO assemelha-se ao utilizado pela


biologia. L os seres vivos so classificados segundo a complexidade de
seus organismos. Assim, existem dos mais rudimentares (protozorios), at
os mais sofisticados (aves, rpteis, mamferos). Como no caso da POO,
cada classe criada a partir do mecanismo da herana representa uma
especializao da anterior.
O mecanismo de herana recursivo, permitindo criar uma
hierarquia de classes. Nos nveis mais altos da hierarquia esto
caractersticas comuns a todos os objetos desta classe, enquanto nos nveis
inferiores esto especializaes das classes superiores. As subclasses
herdam as caractersticas comuns, alm de definirem suas propriedades
especficas.
Existem dois tipos de mecanismos de implementao de herana:
simples e mltipla. Na herana simples, a subclasse pode herdar variveis
e mtodos apenas de uma classe, enquanto na herana mltipla, a
subclasse pode herdar variveis e mtodos de mais de uma classe.
Uma das grandes vantagens da programao OO consiste na
utilizao de bibliotecas de classes que lembram as bibliotecas de cdigo
(procedimentos e funes), utilizadas na programao modular. As
bibliotecas de classes permitem uma capacidade muito maior de
compartilhamento e reutilizao de cdigo, pois possvel criar subclasses
para atender novas necessidades, em funo das classes j existentes.
Muitas bibliotecas so oferecidas juntamente com as ferramentas de
desenvolvimento para reduzir o tempo e a complexidade de projetos de
software, como a Microsoft Foundation Class (MFC) e a Visual Component
Library (VCL) do Delphi. Inclusive, hoje existe uma crescente indstria de
componentes, isto , empresas que se dedicam a criar classes que serviro
para que outros literalmente montem suas aplicaes finais.
Uma analogia para esta dicotomia poderia ser o surgimento de dois
novos profis-sionais: o "tijolista" e o "murista". O primeiro cria pequenos
blocos e no possui a menor idia de onde sero utilizados, enquanto o
segundo tem a enorme vantagem de no se preocupar com detalhes
internos de implementao do cdigo adquirido.
O termo polimorfismo utilizado em biologia para definir variaes
em forma e funo de membros de uma mesma espcie. Utilizando a
mesma analogia, o mecanismo de polimorfismo permite tratar objetos
semelhantes de uma maneira uniforme. Neste caso, possvel que se envie
uma mesma mensagem para um conjunto de objetos e cada objeto
responda de maneira diferente em funo da mensagem recebida.
O polimorfismo, para ser implementado, exige a utilizao do
conceito de herana e aplica-se apenas aos mtodos da classe. O protocolo
de comunicao estabelecido na classe mais alta da hierarquia, que ser
herdada por todas as subclasses definidas posteriormente. Este mecanismo
cria um protocolo padro de comunicao com um conjunto de objetos,
permitindo uma grande flexibilidade na agregao de objetos semelhantes,
mas no idnticos.
Oracle 9i Fundamental

209

Em programas que no utilizam orientao por objetos, sempre que


uma nova funcionalidade deve ser acrescentada, a aplicao deve ser
alterada e recompilada. Com o conceito de polimorfismo, possvel
acrescentar novos mtodos a classes j existentes sem a necessidade de
recompilar a aplicao. Isto possvel por meio da tcnica de "late binding"
ou "dynamic binding", que permite que novos mtodos sejam carregados e
ligados (binding) aplicao em tempo de execuo.
Concluindo, o paradigma da OO representa uma forma evolucionria
de pensar a programao. Baseado em cinco conceitos: objeto, classe,
encapsulamento, herana e polimorfismo, traz inmeros benefcios
criao de programas, dentre os quais o mais notvel a reutilizao de
cdigo, que reduz drasticamente os tempos de desenvolvimento e
manuteno de programas.
Referncias:
Object-Oriented Programming:
An Introduction
Greg Voss
McGraw-Hill, 1991.

Object-Oriented Software
Ann L. Winblad, Samuel D. Edwards & David
R. King
Addison-Wesley, 1990.

TEORIA
17.1 - Fundamentos
Uma das grandes novidades introduzidas na verso 8 do Oracle consistiu
na possibilidade de utilizao de Classes e Objetos. Agora, alm de tabelas,
tambm possvel criar novas estruturas de dados, mais feio da
realidade que cerca o Banco, baseadas no Paradigma da Orientao por
Objetos.
Alguns termos foram introduzidos:
Tipo Objeto (Object Type)

Classe

Instncia (Object Instance)

Instncia de uma classe, ou seja, um


objeto

Herana (Object-type inheritance)

Mecanismo que permite criar uma


classe aproveitando uma j existente.
Este recurso apareceu apenas na verso
9i.

Atributo (Attribute)

Propriedade de um objeto. Pode ser de


algum tipo fornecido ou mesmo uma
classe.

Mtodo (Method)

Rotina incorporada ao Objeto


Oracle 9i Fundamental

210

Os metadados referentes a POO esto nas seguintes views:


ALL_COLL_TYPES
ALL_METHOD_PARAMS
ALL_METHOD_RESULTS
ALL_OBJECT_TABLES
ALL_TYPES
ALL_TYPE_ATTRS
ALL_TYPE_METHODS
DBA_COLL_TYPES
DBA_METHOD_PARAMS
DBA_METHOD_RESULTS
DBA_OBJECT_TABLES

DBA_TYPES
DBA_TYPE_ATTRS
DBA_TYPE_METHODS
USER_COLL_TYPES
USER_METHOD_PARAMS
USER_METHOD_RESULTS
USER_OBJECT_TABLES
USER_TYPES
USER_TYPE_ATTRS
USER_TYPE_METHODS

Vale lembrar que a viso USER_OBJECTS permanece listando tabelas,


vises, Packages, etc. Apesar de no mostrar os objetos criados a partir de
classes (instncias), ela tambm revela as especificaes e corpos de
classes criadas.

17.2 - Tipos Objeto


Uma classe, ou tipo objeto, deve ser criada em duas etapas: primeiro a
especificao e depois o corpo.
Para criar a especificao de uma classe no SQL*Plus Worksheet, devemos
editar um arquivo texto contendo a seguinte estrutura:
CREATE OR REPLACE TYPE nome_classe AS
OBJECT (lista atributos, lista mtodos)

O exemplo seguinte encontra-se no script


17_Cria_Classe_Funcionario.sql:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

create or replace type funcionario_t as


object(
-- atributos:
matricula
varchar2(10),
nome
varchar2(60),
data_nascimento
date,
--metodos de acesso a dados:
member procedure set_matricula (new_matricula in varchar2),
member procedure set_nome (new_nome in varchar2),
member procedure set_data_nascimento
(new_data_nascimento in date),
--demais metodos:
member function retorna_idade return integer,
member procedure mostre) not final;

Observaes

Oracle 9i Fundamental

211

A clusula not final (linha 14) indica que a classe em questo


pode vir a ter classes derivadas, ou seja, outras classes podem vir
a ser criadas via herana e tendo-a como base;
A criao no SQL*Plus Worksheet requer a presena das palavras
reservadas create or replace antes do nome da classe;
V-se claramente que o conceito de Package foi estendido para
que seja possvel implementar classes; alis, um Package pode
ser visto como um projeto de classe;
Para confirmar a criao da classe anterior, investigue a viso
USER_TYPES:

select type_name, attributes, methods from user_types;


TYPE_NAME
ATTRIBUTES
METHODS
----------------- ---------- --------FUNCIONARIO_T
3
5

Vale a pena criar uma conveno prpria para denominao de


classes. Neste caso, acrescentou-se o sufixo _t ao nome da classe;
Para eliminar uma classe, emitiramos o comando:

drop type funcionario_t;

Naturalmente, resulta impossvel eliminar classes que faam parte de


definies de tabelas ou de outras classes.
A especificao do corpo da classe funcionario_t encontra-se no arquivo
17_Cria_Classe_Funcionario_Body.sql:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

create or replace type body Funcionario_t as


--metodos de acesso a dados:
member procedure set_matricula (new_matricula in varchar2)
Is
Begin
matricula := new_matricula ;
end;
member procedure set_nome (new_nome in varchar2)
Is
Begin
self.nome := new_nome ;
end;
member procedure set_data_nascimento
(new_data_nascimento in date)
Is
Begin
self.data_nascimento := new_data_nascimento ;
end;
-- mostra atributos
member procedure mostre
Is
Begin
dbms_output.put_line ('matricula: '|| matricula);
dbms_output.put_line ('nome: '|| nome);
dbms_output.put_line ('data nascimento: '||
to_char(data_nascimento));
end;

Oracle 9i Fundamental

212

27.
28.
29.
30.
31.
32.
33.
34.

-- calcula a idade
member function retorna_idade
return integer
Is
Begin
return trunc(sysdate-data_nascimento)/365;
end;
end;

Observaes

A viso USER_OBJECTS revela tambm as classes criadas:

column object_name format a20


select object_name, object_type from user_objects
where object_name like '%FUNCIONARIO%';
OBJECT_NAME
-------------------FUNCIONARIO_T
FUNCIONARIO_T

OBJECT_TYPE
--------------TYPE
TYPE BODY

Note a presena da palavra reservada self nos mtodos set_nome e


set_data_nascimento (linhas 11 e
17 respectivamente). Ela
representa a instncia que estiver utilizando este cdigo. Apesar
de dispensvel, recomenda-se utiliz-la para aumentar a clareza
do cdigo.

A rotina seguinte instancia um objeto da classe recm-criada:


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

create or replace procedure cria_funcionario


Is
p funcionario_t; /* declarao de uma varivel objeto */
Begin
/* Instanciando... */
p := funcionario_t ('0001', 'Leonardo', to_date('17/10/98'));
/* Invocando mtodos... */
p.mostre;
dbms_output.put_line('
alterando...');
p.set_nome('Leonardo Guimares Terra');
p.mostre; /* existe um argumento "in out" implcito: self */
dbms_output.put_line('idade: ' || p.retorna_idade);
end;

Uma possvel execuo:


set serveroutput on
exec cria_funcionario

E a sada:
matricula: 0001
nome: Leonardo
data nascimento:

17/10/98

alterando...
matricula: 0001
nome: Leonardo Guimares Terra
data nascimento: 17/10/98
idade: 3

Oracle 9i Fundamental

213

17.3 - Herana
Como visto no texto introdutrio deste captulo, uma das grandes
vantagens da POO consiste em reutilizar cdigo que j esteja pronto. Esta
caracterstica implementa-se basicamente pelo mecanismo de herana, ou,
mais formalmente, Object Type Inheritance.
As pores de cdigo seguintes foram extradas do arquivo exemplo
17_Cria_Classe_Herdada_Gerente.sql. Ser criada uma nova classe,
Gerente_t, a partir de outra j existente, Funcionario_t:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

create or replace type Gerente_t under Funcionario_t


(
-- atributos:
departamento
varchar2(20),
nivel
number(1),
-- 1, 2 ou 3
--metodos de acesso a dados:
member procedure set_departamento (new_departamento in varchar2),
member procedure set_nivel (new_nivel in number),
--demais metodos:
overriding member procedure mostre
);

Observaes

A herana acontece graas clusula under (linha 1), porm a


classe da qual est-se derivando deve ter sido criada com a
clusula not final;
Quando ocorrer polimorfismo, isto , um mtodo de uma classe
derivada substituir o homnimo da classe base, deve-se utilizar a
clusula overriding (linha 10);
A nova classe Gerente_t possuir cinco atributos: matricula,
nome,
data_nascimento
(herdados
de
Funcionario_t),
departamento e nvel. Ter tambm sete mtodos (quatro
herdados e trs prprios).

A criao do corpo da nova classe no oferece surpresas:


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

create or replace type body Gerente_t as


--metodos de acesso a dados:
member procedure set_departamento (new_departamento
is
begin
departamento := new_departamento;
end;

in varchar2)

member procedure set_nivel (new_nivel in number)


is
begin
self.nivel := new_nivel ;
end;
-- mostra atributos
overriding member procedure mostre
is
begin
dbms_output.put_line ('Matricula: '|| matricula);

Oracle 9i Fundamental

214

19.
20.
21.
22.
23.
24.

dbms_output.put_line
dbms_output.put_line
to_char(data_nascimento));
dbms_output.put_line
dbms_output.put_line
end;
end;

('Nome: '|| nome);


('Data nascimento: '||
('Departamento: '|| departamento);
('Nivel: '|| to_char(nivel));

Observao

Note a presena da clusula overriding na definio do mtodo


polimrfico.

Finalmente, a procedure seguir instancia um objeto da classe recmcriada:


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

create or replace procedure cria_gerente


Is
p gerente_t; /* declarao de uma varivel objeto */
Begin
/* Instanciando... */
p := gerente_t ('0002', 'Mariana Terra', to_date('6/12/60'),
'Biblioteca', 1);
/* Invocando mtodos... */
p.mostre;
dbms_output.put_line('

alterando...');

p.set_nivel(3);
p.mostre;
dbms_output.put_line('idade: ' || p.retorna_idade);
end;

E a sada:
Matricula: 0002
Nome: Mariana Terra
Data nascimento: 06/12/60
Departamento: Biblioteca
Nivel: 1
alterando...
Matricula: 0002
Nome: Mariana Terra
Data nascimento: 06/12/60
Departamento: Biblioteca
Nivel: 3
idade: 41

17.4 - Tabelas de Objetos


Uma vez criada a classe, podemos construir tabelas cujos campos sejam,
na verdade, instncias. Por exemplo:
create table funcionarios
of funcionario_t (primary key (matricula));

Oracle 9i Fundamental

215

Uma linha seria alimentada assim32:


insert into funcionarios values
(funcionario_t('001','Alvaro Alpheratz',to_date('12/09/1968')));

Para listar parte de um campo objeto, ou seja, apenas alguns atributos de


um objeto que faz parte da definio da tabela, teramos o seguinte
comando:
select matricula, nome from funcionarios;
MATRICULA
---------001
002
003
004
005
006
007
008
009
010

NOME
-----------------------------------Alvaro Alpheratz
Bernardo Beid
Carla Caph
Daniel Dheneb
Efraim Eltanin
Francisca Fomalhaut
Guilherme Gomeisa
Horcio Hyadum
Incio Izar
Joo Jabbah

Uma tabela de objetos pode possuir um campo que seja uma referncia a
uma instncia que conste de uma tabela de objetos. Isto, em tese, seria
uma chave estrangeira e viabilizaria, por exemplo, o fato de que um
funcionrio pudesse coordenar vrios projetos. A nova classe teria uma
especificao assim33:
create or replace type projeto_t as object(
-- atributos:
cod_projeto
varchar2(10),
descricao
varchar2(60),
urgencia
number(2), -- inteiro que classifica o projeto
ref_responsavel
ref funcionario_t,
--metodos de acesso a dados:
member procedure set_cod_projeto (new_cod_projeto in varchar2),
member procedure set_descricao (new_descricao in varchar2),
member procedure set_urgencia (new_urgencia in number),
--demais metodos:
member procedure mostre
);

Aps definir o corpo, a tabela seria criada:


create table projetos of projeto_t (primary key (cod_projeto));

E para aliment-la:
insert into projetos
select projeto_t('001','Exportao de sapatos para sia',9, ref(f))
from funcionarios f
where matricula = '001';

32

33

Os comandos que criam a tabela Funcionarios e a


arquivo exemplo 17_Cria_Tabela_Funcionarios.sql.
Os
comandos
seguintes
encontram-se
no
17_Trata_Classe_Projetos.sql

Oracle 9i Fundamental

alimentam
arquivo

esto

no

exemplo:

216

Observaes

Caso a tabela no tivesse sido criada com auxlio do operador ref,


que na verdade trata-se de um ponteiro, teramos uma
redundncia enorme, j que, caso um funcionrio coordenasse
dez projetos, seus dados estariam repetidos dez vezes;
O comando seguinte mostraria nomes de projetos e respectivos
responsveis:

select descricao, f.nome


from projetos p, funcionarios f
where p.ref_responsavel = ref(f);
DESCRICAO
----------------------------------Exportao de sapatos para sia
Fabricao de solas de borracha
Vendas no mercado interno

NOME
-----------------Alvaro Alpheratz
Bernardo Beid
Alvaro Alpheratz

As boas normas de programao recomendam que exista um


mtodo de retorno para cada atributo. Desta forma,
praticaramos o encapsulamento;
Infelizmente, o Oracle no probe que objetos referenciados
possam ser eliminados. O comando seguinte contornaria tal
problema:

update projetos
set ref_responsavel = null
where ref_responsavel is dangling;

17.5 - Tabelas Aninhadas


Como j vimos, campos de tabelas no precisam ser mais variveis de tipos
primitivos, que comportam apenas um valor. Alm de poderem ser objetos,
pode-se tambm criar um campo-lista, ou seja, um repositrio homogneo
de elementos. Na verdade, trata-se da possibilidade de fazer de um campo
um vetor.
O recurso Nested Table permite acrescentar uma coleo esparsa de
tamanho varivel a uma classe ou mesmo como campo de uma tabela.
Como resulta impossvel acrescentar novas colunas em "object tables", ser
alterada a classe Funcionario_t para que comporte uma lista de
dependentes. Os comandos necessrios encontram-se no script:
17_Cria_Classe_Funcionario_com_
Dependentes.sql.
A classe seria reconstruda como:
create or replace type dependentes_t as table of varchar2(20);

Oracle 9i Fundamental

217

Observe que, antes de emitir o comando seguinte, tabelas e tipos


previamente criados que tenham a classe Funcionario_t como base devem
ser destrudos para que depois sejam reconstrudos:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

create or replace type funcionario_t as


object(
-- atributos:
matricula
varchar2(10),
nome
varchar2(60),
data_nascimento
date,
dependentes dependentes_t,
--metodos de acesso a dados:
member procedure set_matricula (new_matricula in varchar2),
member procedure set_nome (new_nome in varchar2),
member procedure set_data_nascimento (new_data_nascimento in
date),
--demais metodos:
member function retorna_idade return integer,
member procedure mostre
);

E a tabela:
create table funcionarios of funcionario_t
(primary key (matricula))
nested table dependentes store as dependentes_st;

Observaes

A lista pode ser ilimitada e ainda ser esparsa, isto , conteria


"buracos";
A clusula store as indica o local fsico de armazenamento da
tabela aninhada. Essa tabela somente pode ser acessada por
meio da outer table, ou tabela externa (funcionrios);
Uma tabela aninhada no pode conter outra;
Uma insero deve considerar a lista:

insert into funcionarios


values (funcionario_t('001','Alvaro Alpheratz',
to_date('12/09/1968'),
dependentes_t('Maria', 'Pedro', 'Hugo')));
insert into funcionarios
values (funcionario_t('002','Bernardo Beid',
to_date('7/01/1976'),null));

Os dependentes poderiam ser listados


predefinido column_value e a funo the:

utilizando

alias

select column_value Dependentes from


the (select dependentes from funcionarios where matricula = '001');
DEPENDENTES
-------------------Maria
Pedro
Hugo

Oracle 9i Fundamental

218

17.6 - Vetores Variveis


Assim como tabelas aninhadas, vetores variveis representam listas de
valores de um mesmo tipo. A principal diferena consiste na
obrigatoriedade de estabelecer limites fsicos para eles.
A verso definitiva de classe e tabela de funcionrios, agora com
dependentes e ascendentes, encontra-se nos scripts:
17_Cria_Classe_Funcionario_completa.sql e
17_Cria_Tabela_Funcionarios_completa.sql

A classe seria reconstruda como:


create or replace type dependentes_t as table of varchar2(20);
-- Esta lista armazenar os nomes dos pais, avs paternos e avs maternos
create or replace type ascendentes_t as varray(6) of varchar2(20);
create or replace type funcionario_t
object(
-- atributos:
...
dependentes dependentes_t,
ascendentes ascendentes_t,
--metodos de acesso a dados:
...
);

as

Observaes

Apesar de "varivel", a quantidade de elementos no pode


ultrapassar o limite preestabelecido;
A criao da tabela no exigir a clusula store as, j que o varray
ser armazenado internamente tabela; entretanto, a insero
de novas linhas deve mudar:

insert into funcionarios


values (funcionario_t('001','Alvaro Alpheratz',
to_date('12/09/1968'),
dependentes_t('Maria', 'Pedro', 'Hugo'),
ascendentes_t('Enrique', 'Guillermina', 'Eduardo',
'Marta', 'Alberto', 'Albertina')));
insert into funcionarios
values (funcionario_t('002','Bernardo Beid',
to_date('7/01/1976'),null, null));

Os dependentes poderiam ser listados utilizando


predefinido column_value e as funes the e cast:

alias

select column_value Ascendentes from


the (select cast(ascendentes as dependentes_t) from funcionarios
where matricula = '001');

E a sada:
ASCENDENTES

Oracle 9i Fundamental

219

-------------------Enrique
Guillermina
Eduardo
Marta
Alberto
Albertina
6 rows selected.

EXERCCIOS
1. Liste pelo menos trs diferenas entre tabelas relacionais e as "Object
Tables".
Quais seriam as vantagens ou inconvenientes de existir uma
tabela que tivesse alguns campos primitivos e outros oriundos de
classes?
2. A partir do modelo relacional utilizado at aqui, realize sua migrao
para um modelo de objetos.
Inicialmente, identifique as classes (Alunos, Cursos, Instrutores,
Turmas), em seguida liste os atributos e finalmente relacione os
mtodos para cada classe.
Como seria caracterizado o fato de um aluno ser matriculado em
uma dada turma?
Crie tambm uma nova classe, ASSUNTOS, que ser base de
CURSOS.
3. Com base no modelo criado no exerccio anterior, implemente as classes
Assunto_t e Curso_t.
Atributos de assuntos: COD_ASSUNTO, NOME_ASUNTO e PRECO.
Atributos de cursos: COD_CURSO, NOME_CURSO e CH.
Observe que todos os cursos do mesmo assunto tero o mesmo
preo.
Crie uma lista varivel para armazenar os pr-requisitos de cada
curso.
Alm dos mtodos de acesso a dados, implemente outro que revele a
lista dos pr-requisitos.
Cada membro da lista de pr-requisitos deve ser uma referncia a
um objeto.
4. Crie a tabela CURSOS baseada no tipo Curso_t.
Uma vez criada, insira nela algumas linhas.
5. Localize no Dicionrio de Dados as classes e a tabela criadas.
Investigue
as
vises:
USER_TYPES,
USER_OBJECT_TABLES,
USER_TYPES_ATTRS e USER_TYPES_METHODS.
Oracle 9i Fundamental

220

6. No arquivo exemplo 13_Exemplo_Cursor_Implicito_2.sql,


captulo 13, aparece a seguinte linha de cdigo:

visto

no

type lista_instrutores is table of number;


instrutores lista_instrutores:= lista_instrutores (1, 2, 5, 6);
...

Explique de que forma a POO foi utilizada.

REFERNCIA RPIDA
Tarefa

Como fazer

Criar uma Especificao


de Classe

Pelo SQL*Plus Worksheet execute um script que


contenha o comando create or replace type nome as object
(declaraes).
Podem constar da definio de uma classe atributos
de tipos primitivos, instncias de outras classes,
listas de tamanho varivel (nested tables) ou fixo
(varray), alm de mtodos (member procedure e
member
function).
Veja
um
exemplo
em
17_Cria_Tabela_Funcionarios_completa.

Criar um
Classe

Pelo SQL*Plus Worksheet execute um script que


contenha o comando create or replace type body nome as,
implementaes de mtodos. Veja um exemplo no arquivo
fornecido: 17_Cria_Classe_Funcionario_Body.

Corpo

de

Utilizar o mecanismo de
Herana

Na classe base, deve-se utilizar a clusula not final.


J nas derivadas, substitui-se as object por under
classe_base. Mtodos polimrficos devem ser
precedidos pela clusula overriding.

Instanciar um objeto de
alguma
classe
previamente criada

Deve-se implementar um procedimento que declare


uma varivel do tipo classe, aloque espao em
memria e ative seus mtodos.
Veja um exemplo em 17_Instancia_Funcionario.

Eliminar uma classe

Utilize o comando drop type nome. No se pode


eliminar uma classe que seja base de tabelas ou
classes.

Criar uma
Objetos

Tabela

de

Utilize o comando:
create table nome of classe (primary key (campo));

Criar uma referncia


entre objetos

Utilize o modificador REF. Veja um exemplo em


17_Trata_Classe_Projetos.

Listar Classes

Investigue a viso USER_TYPES.

Listar Tabelas Objeto

Investigue a viso USER_OBJECT_TABLES.

Oracle 9i Fundamental

221

ANOTAES

Oracle 9i Fundamental

222

Captulo 18 INTRODUO
ADMINISTRAO
OBJETIVOS

Compreender a importncia do Administrador de Bancos de


Dados (Database Administrator - DBA);
Ter noes sobre a organizao de um Banco de Dados Oracle,
tanto fsica como logicamente;
Situar objetos j conhecidos (tabela, ndice, etc.) na organizao
interna de um Banco de Dados Oracle.

ARQUIVOS NECESSRIOS

Nenhum.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;
Conhecer principais objetos Oracle: tabela, ndice, constraint,
viso, seqn-cia, function, stored procedure e trigger;
Estado de esprito para enfrentar situaes tensas;
Criatividade e iniciativa para resolver grandes problemas em
pouco tempo.

Oracle 9i Fundamental

223

MOTIVAO
Um Dia na Vida de Daniel Barbosa Alves (DBA)
Como todo DBA, Daniel Barbosa Alves um sujeito meticuloso e com esprito
detetivesco. Sua misso: manter o Banco de Dados de sua empresa "vivo" e
"voando baixo". O Banco no pequeno; existem tabelas com 500.000
registros e vrios arquivos estendem-se alm de um giga byte.
Certo dia, D.B.A. acordou com um mau pressentimento. Chegou mais cedo
do que de costume e praticou a rotina diria:
a) Constatou que o backup noturno havia sido concludo com sucesso;
b) Verificou a existncia de arquivos de "trace" (no havia);
c) Investigou as novas entradas no arquivo de alertas (nada novo);
d) Conferiu os gargalos por usurio e arquivo (tudo bem);
e) Checou o tamanho dos arquivos e suas taxas de ocupao (a maior
tabela ocupava 50% do espao disponvel);
f) Realizou testes de memria (o tempo de resposta estava bom).
A manh transcorria tranqila, quando, de repente, soou o alarme:
NINGUM CONSEGUIA SE CONECTAR! Pnico geral. Os estagirios
corriam de um lado ao outro absolutamente perdidos. Os gerentes
tropeavam uns nos outros, os diretores berravam improprios, o
presidente desmaiou...s D.B.A. mantinha-se calmo.
Antes que algum se lembrasse dele, o problema foi resolvido. Ora, pensou,
no h arquivos de trace, o alerta nada avisa, o espao est bom, a memria
tambm, no h gargalos e eu estou conectado! S pode ser algum problema
de rede. Dito e feito. Aps uma rpida verificao, constatou-se que um dos
hubs tinha se apagado...

TEORIA
18.1 - O DBA
Um tpico Banco de Dados Oracle quase uma entidade viva, em constante
mutao. Se existe algo constante na vida de um Banco, a mudana. A
cada dia surgem fatos novos, problemas inusitados, sintomas inesperados.
Trata-se de um quadro que no pode ser relegado ao abandono. Deve
existir algum que constantemente acompanhe a situao e tome as
medidas corretivas necessrias nos momentos adequados para que no se
entre em estado de crise.
A presena do Administrador de Bancos de Dados (Database Administrator
- DBA) imprescindvel na vida de um Banco. Sem dvida, uma figura
humana peculiar que sempre deve estar atenta e preparada para o pior.
Todo DBA deve ser meio 24x7x365, isto , estar disponvel vinte quatro
Oracle 9i Fundamental

224

horas por dia, sete dias por semana e trezentos e sessenta e cinco dias por
ano (pelo menos, em anos bissextos, h um descanso!). Nada de frias,
feriados ou tranqilas noites de sono, pois um tpico Banco Oracle nunca
pra, nunca dorme.
O DBA est presente na vida de um Banco desde antes que ele exista, isto
, cabe ao DBA instalar o Oracle, tanto na mquina Servidora quanto nas
Clientes. Evidentemente, responsabilidade do DBA prepar-lo de forma a
aproveitar otimamente os recursos de hardware, bem como disponibiliz-lo
para que possa ser utilizado por usurios, cujo acesso, alis, tambm
viabilizado pelo DBA.
Uma vez criado e disponibilizado, o DBA deve acompanhar o constante
processo de mudanas que acontece no Banco. E ser altamente pr-ativo,
ou seja, ter a habilidade de prever possveis problemas e tomar medidas
que os evitem. Mas para que isto seja possvel, o DBA deve ser um
profundo conhecedor da organizao interna do Banco, tanto em nvel
fsico (memria, processos, arquivos) quanto lgico (distribuio dos
dados).
E como se ainda fossem poucas as tarefas do DBA, ele tambm
responsvel pela integridade dos dados. Em caso de quaisquer perdas
(falha em disco, destruio acidental, etc.), o DBA deve prontamente
oferecer uma cpia que restaure o estado dos dados antes da perda.
Resumindo, cabe ao DBA:
Instalar;
Criar;
Disponibilizar;
Gerenciar usurios;
Monitorar;
Otimizar desempenho;
Fazer cpias de segurana;
Adequar os recursos disponveis de forma a atender crescente
demanda por dados. Estar atento aos oramentos estabelecidos;
Recuperar o estado prvio perdas do Banco.
Finalmente, ainda poderamos acrescentar mais duas:
Reunir-se periodicamente com Analistas de Dados e
Desenvolvedores para obter configuraes timas para acessos ao
Banco;
Intermediar a relao entre o usurio e o Suporte Oracle.
Felizmente, hoje a vida de um DBA muito mais tranqila do que era h
alguns anos. J existem diversos produtos no mercado que facilitam

Oracle 9i Fundamental

225

bastante seu dia-a-dia. Neste livro, utilizaremos a ferramenta grfica


denominada Enterprise Manager Console34.
Por exemplo, a figura seguinte revela quem est conectado em um dado
momento:

18.2 - Organizao Interna


18.2.1 - Organizao Fsica
Um Banco de Dados Oracle pode ser definido como um conjunto de dados
tra-balhados por uma ou mais aplicaes. Fisicamente, consiste na
interrelao de quatro elementos:
Arquivos

reas em disco em que so armazenados os dados propriamente


ditos, informaes de controle e os chamados metadados (dados
sobre dados).

Memria

Para otimizar o acesso a discos (arquivos), existem diversas


estruturas na memria.

Processos
35

Instncia

34

35

Pequenos programas que desempenham tarefas especficas. Por


exemplo, cada sesso gera, normalmente, um processo (cliente)
que se conecta a outro dedicado (Servidor).
Este termo provm do ambiente Unix; na plataforma Windows, o
equivalente ao processo denomina-se thread.
Reunio das estruturas de memria a diversos processos, que
viabiliza a utilizao do Banco. Para que um Banco possa ser
utilizado, deve-se previamente disponibilizar uma Instncia.
No ambiente Windows NT/2000, cada instncia representa um

Esta ferramenta faz parte de um grupo mais amplo denominado Oracle


Enterprise Manager (OEM). Dele faz parte a j bastante utilizada SQL*Plus
Worksheet, entretanto existem diversas outras que agilizam diversas
tarefas do DBA. Infelizmente, os demais membros do OEM fogem ao escopo
proposto neste livro.
Apenas para simplificar a nomenclatura, em plataforma Windows, quando se
mencionar processo, entenda que se trata de um thread.

Oracle 9i Fundamental

226

processo, que pode ser acompanhado a partir da guia Processes


do Task Manager.

Veja o captulo 19 para maiores detalhes.

18.2.2 - Organizao Lgica


Para que um Banco de Dados exista, devem ser cumpridas vrias etapas.
Tudo comea no Projeto Conceitual em que se transforma um
problema/necessidade em um Modelo que revele o relacionamento entre
entidades. Segue-se o Projeto Lgico em que j existe uma preocupao
em eliminar redundncias (normalizao) e proporcionar um enfoque mais
prximo realidade das ferramentas SGDBR (Oracle, por exemplo).
Finalmente, obtm-se um conjunto de tabelas que podem ser criadas
fisicamente.
O trabalho consistindo em derivar um Banco de Dados a partir de um
problema, passando pelas etapas anteriormente descritas, geralmente no
cabe ao DBA. Existe um profissional especfico incumbido de tal tarefa, o
Analista de Dados. No Apndice C, Bibliografia Comentada, veja referncias
a livros que tratam sobre o processo de modelagem de dados.
Mas, antes que uma tabela possa existir fisicamente, deve-se organizar
logicamente o Banco em Tablespaces. Por exemplo, o banco nativo do
Windows2000, dependendo do nmero de recursos instalados, j vem com
vrias. Vejamos as mais importantes:
SYSTEM

Primeira a ser criada e nica absolutamente imprescindvel. Nela


estar o Dicionrio de Dados (metadados).

UNDOTBS

Os dados somente so gravados efetivamente ao concluir com


sucesso uma transao (COMMIT). Enquanto esta ratificao no
acontece, valores antigos devem ser guardados em reas especiais
ditas de rollback, que constam nesta tablespace.

TEMP

rea de trabalho utilizada durante operaes de ordenao ou


busca que excedam os recursos em Memria.

USERS

Destina-se aos dados propriamente ditos.

Ao criar uma Tablespace, informam-se os arquivos constituintes36.


Veja o captulo 20 para maiores detalhes.

18.3 - Objetos de um Banco de Dados


Um Banco de Dados Oracle tambm pode ser visto, logicamente, como um
conjunto de Schemas que, por sua vez, representam grupos de objetos.
Vejamos os de maior destaque37:
36

Isto somente no acontece para os OMF (Oracle Manged Files), recurso


introduzido pela verso 9i, que permite omitir os nomes fsicos dos
arquivos que constituem a Tablespace. Mais detalhes no captulo 20.

Oracle 9i Fundamental

227

Objeto
1.
2.
3.
4.

Observaes
Repositrio de dados; dividido em colunas, e possui
Tabela
constraints (restries).
Estruturas auxiliares que aceleram acesso a campos muito
ndice
procurados.
Reunio fsica de uma ou mais tabelas que tenham campos em
Cluster
comum. Diminui tempos de consultas, mas piora os de
atualizaes (insero, alterao, excluso).
Forma alternativa de armazenamento de dados em que uma
Hash Cluster
linha encontrada a partir de um algoritmo (hash).

5. View
6. Materialized
View
7. Sequence
8. Procedure
9. Function
10. Package
11. Type
12. Trigger
13. Synonym
14.
Link

Database

15. Dimension

Pseudotabela obtida por um comando SELECT prarmazenado.


Trata-se de uma View, porm possui dados armazenados.
Utilizadas para otimizar consultas.
Mecanismo que permite gerar nmeros automaticamente.
Bloco de cdigo PL/SQL tratado como comando.
Bloco de cdigo PL/SQL que retorna um valor.
Reunio fsica de procedures e functions. Na verdade, so dois:
Especificao e Corpo.
Estrutura de dados representando uma classe. Tambm divide-se
em especificao e um corpo. Veja captulo 17.
Bloco PL/SQL ativado automaticamente aps alguma alterao
em tabela.
Nome alternativo dado a um objeto, visando facilitar a
manipulao.
Representa uma conexo com outro Banco de Dados Oracle.
Forma alternativa de armazenamento de dados em que os
membros obedecem a uma organizao hierrquica. Utilizada
em Bases OLAP (Data Warehouses).

Os objetos de um Schema podem ser listados a partir da viso


USER_OBJECTS.

37

O leque de objetos disponveis depender da maneira como foi conduzida a


criao do Banco, entretanto, para ter-se uma idia da variedade
disponvel, conecte-se com um usurio possuindo privilgios de DBA e
execute a seguinte consulta:
select distinct object_type from dba_objects;

Oracle 9i Fundamental

228

EXERCCIOS
Antes de comear, verifique se voc possui uma conta com privilgios de
DBA.
Neste grupo de exerccios voc trabalhar basicamente com a ferramenta
Enterprise Manager Console.
1. Localize a Enterprise Manager Console e realize uma conexo
independente, ou seja, no vinculada ao Oracle Management Server38.
2. Conecte-se ao Banco de Dados disponvel.
Expanda o item Rede e depois Banco de Dados. Assim como no
SQL*Plus Worksheet, sero pedidas uma identificao e a senha.
Expanda o item Armazenamento. Verifique as Tablespaces, seus
tamanhos e quanto espao h disponvel em cada uma.
Ainda sob o item Armazenamento, liste os arquivos associados a
cada Tablespace.
Expanda o item Esquema. Liste as tabelas do usurio Scott.
Quantos constraints possui a tabela Dept de Scott?
Expanda o item Segurana. Liste os privilgios de sistema e os
papis atribudos ao seu usurio.

38

Faramos uma conexo via OMS caso tivssemos vrios ambientes por
administrar. Veja mais detalhes sobre o funcionamento do Oracle
Enterprise Manger (do qual o OMS faz parte), no guia Oracle Enterprise
Manager Concepts Guide, presente na documentao do Oracle 9i.

Oracle 9i Fundamental

229

Captulo 19 ORGANIZAO FSICA


OBJETIVOS

Identificar os arquivos relevantes de um Banco de Dados Oracle;


Conhecer a organizao da memria em estruturas;
Diferenciar
os
processos
que
desempenham
papis
imprescindveis ou de apoio;
Analisar criticamente um Arquivo de Parmetros (INIT.ORA);
Disponibilizar ou no um Banco ou Instncia para utilizao;
Compreender o que ocorre durante a execuo de comandos
DML;
Destacar as caractersticas prprias de um Banco instalado sob
Windows 2000.

NOVIDADES

39

39

A ferramenta Server Manager foi descontinuada. O que era feito


com ela, agora acontece no SQL*Plus em sua verso grfica
(SQL*Plus Worksheet) ou de linha de comando;
No existe mais a possibilidade de realizar uma conexo interna
(CONNECT INTERNAL/senha). Agora deve-se especificar a conta
como especial (CONNECT SYS/senha AS SYSDBA);
Diversas tarefas que lidam com arquivos (criao de uma
Tablespace, por exemplo) podem ser simplificadas graas aos
OMF (Oracle Managed Files);
Alm do tradicional INIT.ORA, agora existe um arquivo binrio
capaz de armazenar parmetros, o SPFILE.ORA. Ele permite
alterar parmetros dinamicamente, fazendo com que as
modificaes j valham na prxima abertura do Banco. Alis, o
nmero de parmetros que podem ser alterados sem necessidade
de fechar e abrir o Banco, aumentou consideravelmente;
O tamanho do bloco que constitui os arquivos e a Database
Buffer Cache varivel. Isto , podem existir tabelas com
tamanho de bloco 2 KB e outras com 8 KB. Como conseqncia
disto, o famoso parmetro DB_BLOCK_BUFFERS ficou obsoleto;

A partir deste captulo haver uma nova seo, Novidades. Nela sero
destacadas as inovaes da verso 9i em relao s anteriores (8i, 8, 7,
etc.).

Oracle 9i Fundamental

230

A funcionalidade MTS (Multithreaded server) agora denomina-se


SS (Shared Server) e vem instalado por default.

ARQUIVOS NECESSRIOS

Init.ora;
19_HitRatioPorUsuario.sql;
19_HitRatioPorArquivo.sql.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;
Conhecer principais objetos Oracle: tabela, ndice, constraint,
viso e seqn-cia;
Saber o que uma Transao, quando comea, quando termina;
Definir Arquivo, Memria, Processo e Instncia;
Identificar as Tablespaces de um Banco.

TEORIA
19.1 - Arquivos
Qualquer dado, seja de controle ou no, que deva ser armazenado permanentemente reside em um arquivo. Um tpico Banco de Dados Oracle
contm dezenas de arquivos que guardam, alm de dados, informaes de
controle ou de acompanhamento. H seis tipos detalhados em seguida.
Antes de analisar os arquivos propriamente ditos, convm fazer um breve
comentrio sobre diretrios. A instalao do Oracle cria vrios, porm vale
destacar dois: o ORACLE_HOME e o ORACLE_BASE. Enquanto o primeiro
armazena toda a infra-estrutura necessria para que os programas que
constituem o Oracle possam ser executados, o segundo contm, alm do
primeiro, um diretrio de administrao e outro de dados.
Por exemplo, sob o Windows 2000, teramos a seguinte estrutura:

Oracle 9i Fundamental

231

Nesta figura ORACLE_BASE estaria representado pelo diretrio \oracle,


enquanto ORACLE_HOME seria \oracle\ora92.

19.1.1 - Data Files


Contm os dados ou metadados que constam em tabelas, ndices, reas
temporrias ou de rollback. Esto necessariamente ligados a uma
Tablespace. As vises dinmicas V$DBFILE (apenas dois campos) e
V$DATAFILE (mais completa) listam os arquivos do Banco corrente:
select * from v$dbfile order by file#;

E o resultado:
FILE#
---------1
2
3
4
5
6
7
8
9
10

NAME
-------------------------------------------------E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF
E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF
E:\ORACLE\ORADATA\ACAD9\CWMLITE01.DBF
E:\ORACLE\ORADATA\ACAD9\DRSYS01.DBF
E:\ORACLE\ORADATA\ACAD9\EXAMPLE01.DBF
E:\ORACLE\ORADATA\ACAD9\INDX01.DBF
E:\ORACLE\ORADATA\ACAD9\ODM01.DBF
E:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF
E:\ORACLE\ORADATA\ACAD9\USERS01.DBF
E:\ORACLE\ORADATA\ACAD9\XDB01.DBF

Freqentemente, uma Tablespace possui vrios arquivos. O inverso nunca


ocorre, isto , um arquivo no pertence a mais de uma Tablespace.
Outra viso que contm informaes sobre arquivos DBA_DATA_FILES.
Ela possui, entre outros campos, o nmero relativo do arquivo
(RELATIVE_FNO). Em conjunto com o nmero fsico (FILE_ID) permite o
aumento significativo de arquivos por Banco.
select column_name Campo, data_type Tipo from dba_tab_columns
where table_name = 'DBA_DATA_FILES';

E o resultado:
CAMPO
TIPO
------------------------------ -----------

Oracle 9i Fundamental

232

FILE_NAME
FILE_ID
TABLESPACE_NAME
BYTES
BLOCKS
STATUS
RELATIVE_FNO
AUTOEXTENSIBLE
MAXBYTES
MAXBLOCKS
INCREMENT_BY
USER_BYTES
USER_BLOCKS

VARCHAR2
NUMBER
VARCHAR2
NUMBER
NUMBER
VARCHAR2
NUMBER
VARCHAR2
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER

19.1.2 - Control Files


Pequenos arquivos binrios, atualizados constantemente pelo Oracle,
guardam a estrutura do Banco e so responsveis pelo sincronismo entre
todos os arquivos. Se, durante a disponibilizao do Banco, constar em um
Control File uma informao que no seja consistente40, o Banco no
poder ser utilizado.
A viso V$CONTROLFILE traz informaes interessantes:
select name from v$controlfile;
NAME
-------------------------------------------------E:\ORACLE\ORADATA\ACAD9\CONTROL01.CTL
E:\ORACLE\ORADATA\ACAD9\CONTROL02.CTL
E:\ORACLE\ORADATA\ACAD9\CONTROL03.CTL

Na verdade, bastaria apenas um arquivo de controle, porm, dada sua


importncia, recomenda-se que existam vrios (idnticos entre si) e, de
preferncia, em discos diferentes.

19.1.3 - Redo Log Files


Mantm um histrico das transaes efetuadas. teis em caso de perda de
dados, j que as operaes podero ser refeitas. No mnimo existem dois e
so gravados de forma cclica, ou seja, quando se esgota o espao em um,
comea-se a gravar no outro. D-se o nome de log switch a esta mudana
entre arquivos.
Analogias: extrato bancrio ou pronturio de um paciente. Claro que nestes
casos no h como "refazer" as operaes.
A viso V$LOGFILE revela esses arquivos:
select * from v$logfile;

Sada:
40

Por exemplo, enquanto o banco estava fechado,


qualquer ou substituiu-se inadvertidamente.

Oracle 9i Fundamental

apagou-se

um

arquivo

233

GROUP# STATUS TYPE


-------- ------- ------3
ONLINE
2 STALE
ONLINE
1 STALE
ONLINE

MEMBER
---------------------------------------E:\ORACLE\ORADATA\ACAD9\REDO03.LOG
E:\ORACLE\ORADATA\ACAD9\REDO02.LOG
E:\ORACLE\ORADATA\ACAD9\REDO01.LOG

O termo stale indica que o arquivo em questo no est sendo utilizado.


Como j citado, os Redo Log Files so gravados ciclicamente, ou seja, uma
vez preenchido o primeiro, vai-se ao segundo; uma vez ocupado o segundo,
vai-se ao terceiro e assim por diante. Ao completar o ltimo, volta-se a
utilizar o primeiro, perdendo-se o registro das transaes que l estavam.
Felizmente, o Oracle oferece um mecanismo para resguardar os contedos
dos Redo Log Files: trata-se do recurso Archiving.
Caso o Banco esteja em modo Archiving, uma vez preenchido um Redo Log
File, acontecer uma cpia dele (Archived Redo Log File), de preferncia em
outro disco ou para fita. Isto ter um papel fundamental no caso de
ocorrerem perdas e seja necessrio recuperar um Backup. Voltaremos a
este interessante recurso no captulo 25.
bastante comum a existncia dos arquivos multiplexados, isto , em vez
de existir um arquivo, existem vrios membros e atualizados em
simultneo, preferen-cialmente, em discos diferentes. Quando ocorre o log
switch, h uma mudana de grupo. Esta prtica proporciona mais
segurana, j que, caso se perca um disco contendo esses arquivos, resta
outro capaz de prosseguir os trabalhos.
O comando seguinte acrescenta um novo Redo Log File:
alter database add logfile
group 4 ('E:\ORACLE\ORADATA\ACAD9\REDO04.LOG') size 100 M;

Pode-se confirmar o sucesso deste comando consultando V$LOGFILE, ou


por meio de outra viso, mais detalhada, V$LOG:
select group#, members, status, first_change#,
to_char(first_time, 'dd/mm/yy hh24:mi:ss') "PRIMEIRA VEZ"

from v$log

Sada:
GROUP#
MEMBERS STATUS
FIRST_CHANGE# PRIMEIRA VEZ
---------- ---------- ---------------- ------------- ----------------1
1 INACTIVE
291346 20/04/02 21:32:23
2
1 CURRENT
311618 21/04/02 07:08:51
3
1 INACTIVE
267824 20/04/02 19:57:11
4
1 UNUSED
0

O contedo do campo members maior que um indica que h


multiplexao.
Um Redo Log File pode ser excludo sempre e quando no esteja sendo
utilizado, ou seja, o campo Status em V$LOG no pode ser igual a
CURRENT ou ACTIVE:
alter database drop logfile group 1;

Oracle 9i Fundamental

234

Vale notar que este comando no exclui fisicamente o arquivo associado ao


Redo Log File. Isto deve ser feito manualmente, a no ser que o arquivo em
questo tenha sido criado via OMF (Oracle Managed File). Trata-se de uma
facilidade introduzida na verso 9i que facilita bastante a gerncia de
arquivos.
Para caracterizar um Redo Log File como OMF, inicialmente devemos
informar ao Oracle o destino41:
alter system set db_create_online_log_dest_1 = 'E:\ORACLE\ORADATA\ACAD9';

A criao agora ficou mais simples:


alter database add logfile group 1;

Este comando cria um Redo Log File com 100 MB no diretrio especificado
no parmetro de sistema previamente preenchido (db_create_online_log_dest_1).
Como no se especificou o nome do arquivo, o Oracle far isto:
select member from v$logfile where group# = 1

Sada:
MEMBER
--------------------------------------------E:\ORACLE\ORADATA\ACAD9\ORA_1_YD58S200.LOG

Outra vantagem dos OMF consiste na excluso automtica do arquivo


fsico. Assim, caso o comando seguinte possa acontecer, a eliminao
manual posterior no ser mais necessria:
alter database drop logfile group 1;

19.1.4 - Arquivos
SPFILE.ORA)

de

Parmetros

(INIT.ORA

Esses arquivos possuem todas as informaes necessrias para que uma


Instncia seja disponibilizada (etapa prvia abertura do Banco). O nome
deles pode trazer embutido o nome da Instncia qual se refere. Assim, o
arquivo texto INITACAD9.ORA denominaria o arquivo de parmetros da
instncia ACAD9 (Controle Acadmico). Este nome tambm conhecido por
SID (System Identifier).
Em plataformas Windows NT/2000, os arquivos de parmetros geralmente
encontram-se no diretrio DATABASE sob ORACLE_HOME; j em
ambientes Unix, esto em dbs, tambm sob ORACLE_HOME.
Uma importante novidade introduzida na verso 9i foi o arquivo de
parmetros binrio, o SPFILE.ORA. Ganha-se em praticidade, j que
alteraes em parmetros dinmicos (aqueles que podem ser alterados
41

Parmetros do Banco, tais como: db_create_online_log_dest_1, sero vistos em


seguida no item 19.1.4.

Oracle 9i Fundamental

235

enquanto o Banco estiver aberto), via comandos alter system ou alter session,
podem ser gravadas de forma permanente, sem necessidade de editar o
arquivo texto INIT.ORA, como ocorria at a verso 8i.
Apenas um arquivo de parmetros ser lido na abertura do Banco. Veja
adiante, no item 19.4.4, como se faz para especificar ou o arquivo texto ou
o binrio.
A viso V$PARAMETER informa todos os parmetros com os respectivos
valores.
select name, value from v$parameter order by 1;
NAME
VALUE
------------------------------------------------------------- -------------active_instance_count
aq_tm_processes
0
archive_lag_target
0
audit_trail
NONE
background_core_dump
partial
background_dump_dest
E:\oracle\admin\Acad9\bdump
backup_tape_io_slaves
FALSE
bitmap_merge_area_size
1048576
blank_trimming
FALSE
buffer_pool_keep
buffer_pool_recycle
...
undo_management
AUTO undo_retention
900 undo_suppress_errors
FALSE
undo_tablespace
UNDOTBS
use_indirect_data_buffers
FALSE user_dump_dest
E:\oracle\admin\Acad9\udump utl_file_dir
workarea_size_policy
MANUAL

250 linhas selecionadas.

Uma forma mais prtica de listar parmetros consiste em utilizar o


comando show parameters, que aceita subcadeias de nomes de parmetros.
Por exemplo:
show parameters spf

E a sada:
NAME
TYPE
VALUE
------------------------------------ ----------- -----------------------------spfile
string
%ORACLE_HOME%\DATABASE\SPFILE%
ORACLE_SID%.ORA

Observe na listagem anterior que o contedo do parmetro spfile no


nulo. Infelizmente, o referido arquivo no pode ser aberto para inspeo.
Para isto, conectados como SYS, pode-se criar uma verso texto atravs do
comando CREATE PFILE, como revela o exemplo seguinte:
create pfile = 'initAcad9.ora' from spfile = 'spfileAcad9.ora';

19.1.5 - Arquivos de Acompanhamento


Oracle 9i Fundamental

236

Uma tarefa crucial do DBA consiste em acompanhar o que se passa em um


Banco de Dados Oracle. Em particular, o DBA deve ter o costume de
regularmente consultar o diretrio que possua o arquivo de alertas e os de
trace, estes produzidos quando acontecem situaes anormais. Para
descobrir onde esto esses arquivos, deve-se verificar o contedo do
parmetro background_dump_dest:
show parameters DUMP_DEST
NAME
-----------------------------------background_dump_dest
core_dump_dest
user_dump_dest

TYPE
----------string
string
string

VALUE
--------------------E:\oracle\admin\ACAD9\bdump
E:\oracle\admin\ACAD9\cdump
E:\oracle\admin\ACAD9\udump

O arquivo de alertas da instncia ACAD9 denomina-se acad9ALRT.txt.


Nele so registrados os eventos relevantes que ocorreram instncia em
questo e os indicativos de erros. Quando estes forem graves, geram-se
ento os arquivos de trace que, dependendo da gravidade, devero ser
enviados ao Suporte Tcnico da Oracle.

19.1.6 - Arquivo de Senhas


Como veremos no captulo que trata sobre segurana (24), uma conexo ao
Oracle com plenos direitos (SYSDBA) pode acontecer sempre e quando o
usurio constar em um arquivo especial, dito Password File. Criado no
momento da criao do Banco, em plataformas Windows encontra-se em
ORACLE_HOME\database. J em ambientes Unix, ele reside sob
ORACLE_HOME no diretrio dbs.

19.2 - Memria
A Memria tem papel fundamental no funcionamento do Banco. Seja para
melhorar a performance geral, j que os acessos a disco no precisam ser
to numerosos ou freqentes, seja para facilitar a gerncia de recursos
compartilhados entre os usurios; com pouca memria, o Banco
literalmente pra.
A Memria divide-se em duas estruturas bsicas detalhadas em seguida.

19.2.1 - Program Global Area (PGA)


Regio privativa de cada sesso na qual so armazenados dados
temporrios, tais como: variveis, endereos de rotinas ou ordenaes.
Cada conexo provoca a criao de uma pequena rea na PGA.

19.2.2 - System Global Area (SGA)


Regio compartilhada pela qual passam todos os dados que sero lidos ou
alterados, e comandos SQL emitidos a partir de clientes ou pelo prprio
Oracle 9i Fundamental

237

Oracle Server. Tambm possui um registro de todas as transaes que


ocorrerem no Banco.
Divide-se em cinco reas:
11.
Database Buffer Cache: conjunto de blocos (data block
buffers) que armazena dados a serem lidos ou alterados. Bloco
representa a menor unidade mani-pulvel42 para o Banco.
Cada bloco pode estar em quatro estados:
o Livre: ainda no foi preenchido com algum dado proveniente
de disco. No instante imediatamente posterior abertura do
Banco, s h blocos livres.
o Ocupado: j foi preenchido. A ocupao acontece segundo um
algoritmo de LRU (least recently used), isto , os mais
acessados ficam por mais tempo.
o Sujo: j foi preenchido e alterado, portanto deve ser gravado
em disco brevemente.
o Rollback: possui um dado que poder ser reaproveitado caso
a transao que o alterou seja encerrada sem gravao.
Graas nova caracterstica da verso 9i que permite a criao de
Tablespaces com diferentes tamanhos de bloco, a DBC subdivide-se
em vrias reas, cada uma representando um tamanho de bloco
diferente. Tamanhos de blocos so em KB e podem ser de 2, 4, 6, 8,
16 e 32KB.
A deciso quanto escolha do melhor tamanho de bloco est
relacionada natureza do objeto a ser criado. Por exemplo, uma
Tablespace que conter tabelas cujas consultas pediro poucas
linhas, pede um bloco menor do que outra armazenando tabelas que
possuam muitos dados por consultar a cada requisio.
12.
Redo Log Buffer: registro de todas as transaes comutadas.
Trata-se de uma lista circular, cujo contedo gravado
periodicamente nos Redo Log Files. As transaes ainda no
encerradas residem em reas de Rollback (memria ou disco).
13.
Shared Pool Area: armazena comandos SQL e o Dicionrio de
Dados. Divide-se em duas reas:
Shared SQL Area: guarda comandos SQL "compilados". Isto permite
que a segunda execuo de um comando idntico seja mais rpida
que a primeira.
Dictionary Cache: metadados. A ocupao controlada pelo Oracle
Server e tambm ocorre segundo algoritmo de LRU.
14.
Large Pool Area: ocupada pela funcionalidade SS (Shared
Server,
ex-Multithreaded Server), quando presente
(veja tem 19.3.2.1, adiante) e pela ferramenta RMAN (Recovery
42

Por menor unidade manipulvel


entende-se a menor quantidade de bytes
transfervel do disco para a memria e vice-versa.

Oracle 9i Fundamental

238

Manager) como rea de trabalho para operaes de backup e


restauraes de dados (mais detalhes no captulo 25).
15.
Java Pool Area: utilizada por conexes que contiverem
pores de cdigos escritos em linguagem Java para interao com
o Banco.
A viso V$SGA revela diversos aspectos sobre a configurao da SGA:
select * from v$sga;
NAME
VALUE
-------------------- ---------Fixed Size
282216
Variable Size
33554432
Database Buffers
8388608
Redo Buffers
532480

As medidas apresentadas esto em bytes. Assim, podemos concluir que so


necessrios 275 KB como ponto de partida (rea fixa); os data block buffers
ocupam 8 MB, a rea de Redo Log Buffer compreende 520 KB e as demais
estruturas (Shared, Large e Java Pool Area) esto distribudas por uma
rea de 32 MB.

19.3 - Processos43
Um processo representa um pequeno programa que executa tarefas
bastante especficas: integrao entre as estruturas de memria e os
arquivos em disco, conexo ao Servidor, etc. Existem trs tipos de processo
detalhados em seguida.

19.3.1 - Processo Usurio


Cada vez que ocorre uma conexo, dispara-se um processo usurio
executado na estao cliente. Eles tm a funo de encaminhar ao Servidor
as requisies do Cliente.

19.3.2 - Processo Servidor


Recebe as requisies de processos usurios e as encaminha ao Oracle
Server. Podem ser dedicados (um para cada cliente) ou no. Neste caso,
implementa-se o recurso SS (Shared Server).
19.3.2.1 - SS - Shared Server
Normalmente, para cada processo usurio existente, h um processo
Servidor dedicado. Isto pode causar ociosidade de processamento, caso
haja muito tempo inativo nas conexes. Uma melhoria consiste em
empregar a tcnica SS (Shared Server, ex-Multithreaded server) que
43

Na plataforma Windows, os processos descritos neste captulo equivalem


aos threads.

Oracle 9i Fundamental

239

permite compartilhar os processos servidores com vrios usurios pela


utilizao de processos especiais chamados dispatchers (roteadores).
Alm de menos processos servidores, com conseqente economia de
memria, o SS causa o registro de informaes de cada usurio em SGA,
isto , alivia-se a PGA.
Tecnicamente, SS um processo do tipo network listener que conecta
processos clientes a um ou mais processos roteadores e a um ou mais
processos servidores.
A tabela seguinte apresenta os principais parmetros responsveis pela
imple-mentao de SS com os valores tpicos e comentrios.
Parmetro

Valor Tpico

Observaes

dispatchers

(PROTOCOL=TCP)

Identifica
o
nmero
inicial
de
roteadores que haver por protocolo de
rede e o protocolo a ser obedecido. O
SS decidir quando novos roteadores
sero necessrios.

max_dispatchers

10

Nmero mximo de roteadores.

shared_servers

Nmero
mnimo
servidores.

de

processos

max_shared_servers 10

Nmero
mximo
de
processos
servidores. A variao entre o mnimo e
mximo autom-tica.

service_names

Nome da instncia acessada pelo SS.

Acad9

19.3.3 - Processo Background


Existem diversos processos cuja principal finalidade consiste em integrar
as estruturas de memria aos arquivos em disco. Eles so executados em
segundo plano, da a classificao Background. Existem cinco
imprescindveis ao funcionamento do Banco:
DBWR
(Database
Writer)

Transfere blocos desde o Database Buffer Cache e Dictionary


Cache para os Data Files. Quando no houver blocos livres,
ele entra em ao, e no necessariamente aps um commit.

LGWR
(Log Writer)

Descarrega o Redo Buffer Cache no Redo Log File corrente.


Executado aps um commit ou quando o Redo Buffer Cache
estiver cheio.

Responsvel pelos processos cliente, organiza a Memria aps


PMON
ope-raes desastradas de usurios. Entre outras tarefas,
(Process Monitor)
libera tabelas pre-sas e desfaz transaes inacabadas.
SMON
Responsvel pela Instncia como um todo, entra em ao
(System Monitor) durante operaes de recuperao do Banco.

Oracle 9i Fundamental

240

CKPT
(Checkpoint)

Alivia o trabalho de LGWR, j que grava marcas especiais


(System Change Number - SCN) nos Data Files, garantindo
que todos esto sincronizados. Aps um checkpoint, garantese que todos os blocos sujos foram gravados. O ltimo
checkpoint pode ser verificado em V$DATABASE.

Veja como listar o checkpoint corrente e alter-lo:


select name, checkpoint_change# from v$database;
NAME
CHECKPOINT_CHANGE#
--------- -----------------ACAD9
311907

Forando um checkpoint:
alter system checkpoint;

Repetindo a ltima consulta, teremos:


NAME
CHECKPOINT_CHANGE#
--------- -----------------ACAD9
312161

Observe que a gerao de checkpoints constitui tarefa extremamente


dinmica.
O processo seguinte, apesar de no ser imprescindvel, bastante
recomendvel.

ARCH
(Archiver)

Copia o contedo de Redo Log Files para outro lugar,


geralmente em fita. Como a gravao nos Redo Log Files
cclica, esse processo impede que algum registro de transao
se perca; portanto, caso se queira manter um histrico de
operaes, o ARCH torna-se indispensvel.

Ainda podem existir outros processos do tipo background:


til em operaes distribudas (envolvendo mais de um Banco
de Dados), recupera transaes inacabadas. Estas operaes
RECO (Recoverer)
somente sero possveis, caso se instale a extenso
Distributed Options.
Dnnn
(Dispatchers)

Roteadores presentes quando


funcionalidade SS (Shared Server).

estiver

configurada

CJQ0

Representa o Coordinator Job Queue. Ele gerencia os jobs que


foram disparados por meio do package DBMS_JOB (veja item
15.2.1 para obter mais detalhes sobre jobs).

Apesar de no ser propriamente um processo de Background, vale a pena


mencionar o Listener. Ele capta tentativas de conexo remota e as informa
ao Oracle Server. Geralmente sua ativao automtica, pois caso no
esteja disponvel, ningum poder conectar-se. Diferente dos outros, este
Oracle 9i Fundamental

241

processo ativado de forma independente. No caso do Windows 2000/NT,


trata-se de um servio.

19.4 - Instncia
unio de estruturas de memria e processos Background d-se o nome
de Instncia. Uma vez criada, pode-se iniciar a comunicao:
Processo Usurio Processo Servidor Instncia

Algumas informaes podem ser obtidas a partir da viso V$INSTANCE:


select instance_name, shutdown_pending,
to_char(startup_time, 'dd/mm/yy hh24:mm:ss') tempo
from v$instance;
INSTANCE_NAME
SHU TEMPO
---------------- --- ----------------acad9
NO 21/04/02 07:04:17

A consulta apresentada em seguida informa a quantas horas a instncia


corrente est aberta:
select (SYSDATE-logon_time)*24 "Horas" from sys.v_$session
where sid=1 ;

E uma possvel resposta:


Horas
---------8,91944444

19.4.1 - Parmetros
O funcionamento de uma Instncia determinado por parmetros que
constam nos arquivos INITsid.ORA (texto) ou SPsid.ORA (binrio).
Alguns parmetros, ditos dinmicos, podem ser alterados com o banco
aberto. J outros, os estticos, no. Esta caracterizao pode ser
consultada pelo Enterprise Manager Console; uma vez conectado ao Banco,
expanda o item Instncia e ative Configurao. No painel direita, clique
em Todos os Parmetros de Inicializao:

Oracle 9i Fundamental

242

Veja uma relao contendo os mais importantes:


Valor
Tpico

Observaes

4.096

Representa o tamanho padro do Bloco, menor


uni-dade transportvel entre arquivos de dados
e memria e vice-versa. Durante a criao de
uma Tablespace, caso nenhum tamanho de
bloco seja informado, este valor ser utilizado.

DB_CACHE_SIZE

8.388.608

Tamanho em bytes do Database Buffer Cache


com-posto por blocos de tamanho padro. O
valor tpico ao lado informa que 8 MB foram
destinados a tal propsito.

DB_xxK_CACHE_SI
ZE

valor em
bytes ou
MB

Antes que Tablespaces com tamanho de bloco


dife-rente do padro possam ser criadas,
deve-se reser-var reas na SGA para outros
possveis tamanhos de bloco. xx pode ser 2, 4,
6, 8, 16 ou 32.

SHARED_POOL_
SIZE

20.971.520

Tamanho em bytes da Shared Pool Area.


Vemos aqui um valor igual a 20 MB.

Parmetro

DB_BLOCK_SIZE

LARGE_POOL_SIZE 1.048.576

Tamanho em bytes da Large Pool Area.

JAVA_POOL_SIZE

Tamanho em bytes da Java Pool Area.

8.388.608

Oracle 9i Fundamental

243

Valor
Tpico

Observaes

SORT_AREA_SIZE

524.288

rea alocada na PGA cada vez que algum


usurio requisitar uma ordenao. Caso esta
precise mais do que o inicialmente alocado,
transfere-se o contedo corrente para disco
(arquivo
pertencente

Tablespace
Temporria) e nova alocao em me-mria
acontece. Ao final, os blocos ordenados so
reunidos e o resultado final enviado ao
requerente.

LOG_BUFFER

8192

Tamanho em bytes do Redo Log Buffer.

DB_CREATE_FILE_D
EST

algum
diretrio
vlido

Local onde sero gravados os arquivos de


dados OMF. A conta responsvel pelo Oracle
deve ter permisses de gravao no destino.

DB_CREATE_ONLI
NE_LOG_DESTn

algum
diretrio
vlido

Local onde sero gravados os Redo Log Files


de dados OMF. Vale a mesma observao
anterior.

CONTROL_FILES

nomes de
arquivos
vlidos

Relao de Control Files do Banco. Devem


estar localizados em discos diferentes para
que o risco de perda seja mnimo.

SGA_MAX_SIZE

Tamanho mximo, em bytes, alocvel para a


SGA. Perceba que antes que seja possvel
alocar memria para blocos com tamanho
42.757.736
diferente do padro, deve-se verificar que o
valor de SGA_MAX_SIZE no seja extrapolado.
Parmetro esttico.

JOB_QUEUE_
PROCESSES

10

Indica a quantidade de jobs que pode ser


disparada
simultaneamente.
Veja
uma
utilizao dele no Captulo 15, item 15.2.1

SPFILE

nome de
arquivo

Quando a instncia tiver sido aberta via


arquivo binrio de parmetros (SPFILE.ORA),
indica a locali-zao deste arquivo.

IFILE

nome de
arquivo

Quando a instncia tiver sido aberta via


arquivo tex-to de parmetros (INIT.ORA),
indica a localizao do arquivo texto contendo
mais parmetros.

Parmetro

Parmetros dinmicos podem ser alterados via comandos alter system ou


alter session. A vantagem de abrir uma instncia via SPFILE reside na
praticidade de no ter que realizar as mesmas alteraes nos parmetros
que constem no arquivo texto de parmetros. Por exemplo, o comando:
alter system set open_cursors = 100 scope = both;

altera o parmetro OPEN_CURSORS e j determina que, na prxima vez


que a instncia for aberta, ele ter esse valor. A clusula both indica que a
Oracle 9i Fundamental

244

modificao deve ser aplicada imediatamente e tambm ser gravada no


SPFILE. Caso desejs-semos realizar uma alterao temporria, deveramos
fazer:
alter system set open_cursors = 80 scope = memory;

No raro que existam diversos Arquivos de Parmetros para um mesmo


Banco, porm executa-se um por vez. Pode existir um para o
funcionamento diurno, mais adequado para muitas conexes, e outro para
a noite, quando prevalecem os trabalhos em lote.

19.4.2 - Etapas
Antes que uma instncia esteja disponvel e um Banco de Dados aberto,
devem passar por alguns estgios intermedirios:

As trs operaes, representadas pelas barras verticais, so comentadas


em seguida:
Nomounting: ativam-se os processos Background e aloca-se memria
para a SGA. Aps essa operao pode-se criar um Banco de Dados
ou consertar Control Files.
Mounting: lem-se os Control Files e determina-se a localizao dos
demais arquivos. Recuperaes e mudana da forma de
arquivamento (processo ARCH) acontecem aps essa operao.
Opening: abrem-se os Data Files e Redo Log Files. Usurios que no
sejam DBA podem se conectar.
Para realizar estas operaes descritas, deve-se utilizar uma variao da
SQL*Plus Worksheet. Trata-se da SQL*Plus utilizada no modo linha de
comando:
C:\>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Dom Ago 4 18:08:55 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL>

Oracle 9i Fundamental

245

Neste momento, carregou-se o programa SQL*Plus em memria, porm


sem realizar nenhuma conexo. Recomenda-se esta modalidade quando
houver necessidade de fechar ou abrir uma instncia manualmente. Para
que isto seja possvel, deve-se realizar uma conexo utilizando uma conta
com privilgios de administrao plenos44:
SQL> connect sys/<senha> as sysdba
Conectado.
SQL>

19.4.3 - Fechando: Shutdown


Para fechar uma Instncia/Banco, emite-se o comando SHUTDOWN cuja
forma est representada em seguida:
SHUTDOWN
[NORMAL | IMMEDIATE | TRANSACTIONAL | ABORT]

As diferenas entre as quatro modalidades esto descritas abaixo:


Parmetro

Observaes

Analogia

Normal

Forma pr-assumida, aguarda o trmino de


"Menino,
todas as conexes correntes e impede
cama".
novas.

Transaction Espera que transaes correntes sejam "Menino,


v
conclu-das e encerra conexes.
cama, AGORA!"
al
Immediate

Abort

Desfaz transaes
conexes.

correntes

pra

pra

encerra Desliga a televiso e


agride verbalmente.

No desfaz transaes. Isto acontecer na


prxi-ma inicializao. Encerra conexes.
Agride fisicamente
Utilizar esta opo apenas em casos
extremos.

Uma vez emitido o comando shutdown, no acontecem novas conexes. Os


encerramentos "violentos" deixam diversos blocos "perdidos". Eles sero
recons-trudos na prxima inicializao, a partir dos Redo Log Files. V-se
que transaes no concludas tm suas modificaes perdidas.
Exemplo:
SQL> connect sys/<senha> as sysdba
Conectado.
SQL> shutdown
Banco de dados fechado.
Banco de dados desmontado.
Instncia ORACLE desativada.
SQL>

44

No captulo que trata sobre segurana, voltaremos a discutir o tpico


"permisses".

Oracle 9i Fundamental

246

Observe que no possvel passar do estado Open para Mount ou Mount


para Nomount. Sempre acaba em Shutdown.

19.4.4 - Abrindo: Startup


Para abrir uma Instncia/Banco, emite-se o comando startup cuja forma
est representada em seguida:
STARTUP [FORCE] [RESTRICT] [PFILE = arquivo de parmetros]
[OPEN | MOUNT | NOMOUNT]
[database]

Os parmetros esto detalhados em seguida:


Force
Restrict

Pfile

Open

Mount
Nomount
Database

Fecha instncia corrente (SHUTDOWN ABORT) antes de proceder


nova abertura.
Apenas quem possuir privilgio RESTRICTED SESSION pode
conectar-se ao Banco. Normalmente, s o DBA o possui.
Indica o nome do Arquivo texto de Parmetros (INIT.ORA).
Se for omitido e houver um arquivo em ORACLE_HOME\database
(plataforma Windows) ou ORACLE_HOME/dbs (Unix) denominado
SPFILEsid.ORA, este ser utilizado.
Caso se deseje abrir a instncia com um arquivo binrio de parmetros
e talvez localizado em outro diretrio, deve-se utilizar um arquivo texto,
utilizado na clusula PFILE, com apenas um parmetro, SPFILE. Este
parmetro deve indicar o nome e localizao do arquivo binrio de
parmetros.
O nome do Banco deve coincidir com o parmetro DB_NAME e o
nome que constar nos Control Files.
Deixa Instncia/Banco abertos. Opo pr-assumida. Especificando
esta clu-sula, pode-se ainda utilizar: READ ONLY (nenhuma alterao
ser permitida) ou RECOVER (dispara o processo de recuperao. Mais
detalhes no Captulo 25).
Estado Mount
Estado Nomount
Informa-se o nome da varivel de ambiente que representa o Banco,
caso no tenha sido especificado o nome do Banco no Arquivo de
Parmetros. Geralmente isto no acontece.

Exemplo:
SQL> startup
Instncia ORACLE iniciada.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Banco de dados montado.
Banco de dados aberto.

42757736
282216
33554432
8388608
532480

bytes
bytes
bytes
bytes
bytes

Oracle 9i Fundamental

247

SQL>

Para mudar do estado Nomount para Mount e Mount para Open, deve-se
utilizar o comando ALTER DATABASE cuja sintaxe simplificada :
ALTER DATABASE [OPEN | MOUNT]

Exemplos:
SQL> shutdown
Banco de dados fechado.
Banco de dados desmontado.
Instncia ORACLE desativada.
SQL> startup nomount
Instncia ORACLE iniciada.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers

42757736
282216
33554432
8388608
532480

bytes
bytes
bytes
bytes
bytes

SQL> alter database mount;


Banco de dados alterado.
SQL> alter database open;
Banco de dados alterado.
SQL>

Vale observar que tanto STARTUP quanto SHUTDOWN so comandos da


ferramenta SQL*Plus.

19.5 - Viso Geral

A rea quadriculada representa a Database Buffer Cache.

19.6 - O Que Ocorre Durante um SELECT


Oracle 9i Fundamental

248

Conhecer o que realmente acontece durante o processamento de um


comando select ajuda bastante em caso de ocorrerem problemas. Suponha
que tenha sido emitido o seguinte comando:
select * from alunos;

Algumas etapas devem ser cumpridas:


Requisio

Processo Cliente notifica processo Roteador que mandar um


comando SQL. Roteador avisa processo Servidor que vir um
comando.

Alocao
de
Memria

Reserva-se espao suficiente na Shared SQL Area para que seja


possvel armazenar o comando SQL e dados relacionados (verso
parseada e no parseada, Plano de Execuo e ponteiro para a
primeira linha).

Parse

Realiza-se a verificao sinttica (comando obedece s regras da


SQL) e semntica (objetos podem ser manipulados pelo usurio);
verifica-se se j no existe comando idntico na Shared SQL Area;
buscam-se informaes sobre objetos manipulados e transferidos,
ou no, para a Library Cache; determina-se o Plano de Execuo
(quais ndices devero ser utilizados); armazena-se a verso
"compilada" (ou parseada) do comando.

Execuo

Aplica-se o Plano de Execuo, realizando leituras lgicas (blocos


contendo linhas j esto em memria - cache hit) e fsicas (blocos
contendo linhas no esto em memria - cache miss). Neste ltimo
caso, o DBWR entra em ao para trazer os blocos dos Data Files.

Fetch

Cria-se um conjunto de linhas (a partir dos data block buffers) que


so retornadas pelo processo Servidor para o processo Cliente
requisitante por meio do Roteador.

A razo entre leituras lgicas e fsicas recebe a denominao de hit ratio, e


quanto mais alta for, melhor o desempenho do Banco. A frmula que
calcula esta razo :
(L - F) / L
Note que, para cada leitura fsica, existir pelo menos uma lgica, j que o
bloco deve ser transferido para a memria e depois lido da memria.

19.7 - O Que Ocorre Durante um UPDATE


Suponha agora que seja emitido o comando seguinte:
update cursos set preco = preco * 1.1;

Assuma que cada linha da tabela ocupe 80 bytes e que existam dez linhas,
portanto apenas um bloco, B, ser afetado.
Etapas por cumprir:

Oracle 9i Fundamental

249

Requisio

Idem.

Alocao de
Memria

Idem.

Parse

Idem.

Leitura

Verifica-se se B j consta no Database Buffer Cache. Caso no


esteja, realiza-se uma leitura fsica.

Reserva

Reserva-se um bloco para o caso de a transao corrente ser


desfeita (rea de rollback).

Bloqueio

As linhas que sero alteradas sofrem bloqueio. Isto impedir que


outro usurio modifique essas mesmas linhas.

Cpia para
Reserva

Realiza-se uma cpia de B para uma rea de rollback, que,


dependendo da utilizao no momento, pode estar em memria
ou disco.

Log para
valores
antigos

Valores prestes a mudar das linhas afetadas so gravados no


Redo Log Buffer.

Atualiza

Modificam-se as linhas em B.

Log para
valores novos

Novos valores tambm so gravados no Redo Log Buffer.

Notificao

Processo Servidor informa ao processo Cliente via Roteador que


as alteraes obtiveram sucesso.

Quando for emitido o comando commit, as linhas afetadas sero liberadas.


O bloco contendo os novos valores est sujo e somente ser gravado em
disco quando ocorrer o prximo checkpoint.
Caso seja emitido um rollback, a tabela tambm liberada, porm os
valores antigos so copiados sobre os novos.

19.8 - Notas sobre o Oracle sob Windows 2000


Um dos grandes objetivos da Oracle, desde que lanou o Oracle Server, foi
a portabilidade. Hoje existem verses do carro-chefe da empresa em
inmeros Sistemas Operacionais: desde o pioneiro VMS, passando por
quase todas as variaes UNIX, at o emergente Windows 2000 Server.
Os conceitos vistos at aqui aplicam-se a todas as plataformas, entretanto
sempre h detalhes especficos para cada uma. Neste tpico, sero
comentadas as peculiari-dades do Windows 2000.
O Oracle Server executado ocupando um processo e os processos
propriamente ditos so implementados via threads. Isto permite
implementar a SGA em uma rea de memria privativa ao processo do
Oracle Server, isto , ao contrrio de implementaes UNIX, a SGA no
exatamente compartilhada por vrios processos, mas por threads.

Oracle 9i Fundamental

250

Cada Banco de Dados criado ser representado por um servio. Na figura


seguinte, vemos que OracleServiceACAD9 representa o Banco utilizado neste
livro:

Observe tambm a presena de OracleOraHome92TNSListener captando


tentativas de conexo em mquinas clientes. Este ltimo servio substitui o
processo Listener das plataformas UNIX.
Um cuidado importante a ser tomado sob Windows2000 consiste na
escolha da conta responsvel pelo servio do Banco. Ela deve ter permisso
de gravao nos diretrios em que residem os arquivos do Banco e, qui,
em outras mquinas, caso decida-se copiar Archived Redo Log Files pela
rede.
Caso deseje-se simplesmente abir o Banco, note que, a rigor, no
necessrio emitir o comando STARTUP pelo SQL*Plus, j que a
disponibilizao realizada automaticamente. Alguns fatos interessantes
acontecem:
Emitir o comando STARTUP com os servios desligados resulta
intil;
Emitindo SHUTDOWN, no interrompe a execuo dos servios.
Ao desligar o Servidor Windows 2000, os servios so automaticamente
fechados. Infelizmente, deslig-los equivale a emitir um comando shutdown
immediate.
Finalmente, convm lembrar onde so gravadas as localizaes de
ORACLE_HOME e ORACLE_BASE. Execute o utilitrio regedit e localize a
chave HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0.
Interessante observar que, a partir da verso 8.0.4, permite-se a criao de
vrios ORACLE_HOMES.

Oracle 9i Fundamental

251

EXERCCIOS
Antes de comear, verifique se voc possui uma conta com privilgios de DBA.
Caso no a possua, utilize a SYSTEM cuja senha definida na instalao
normalmente MANAGER. Para abrir ou fechar uma instncia, voc deve
conhecer a senha de um usurio caracterizvel como SYSDBA. Logo aps a
instalao, esse usurio chama-se SYS e sua senha normalmente
CHANGE_ON_INSTALL.
Cuidado Evite fazer os exerccios seguintes em um Banco de Dados de produo.
O ideal seria ter um Servidor de testes exclusivamente destinado a
tarefas como as que seguem. Somente quando voc adquirir confiana
suficiente, utilize um Banco que no seja de testes.

1. Conecte-se ao SQL*Plus Worksheet e pesquise estrutura e contedo das


seguintes vises:

V$CONTROLFILE
V$DATABASE
V$DATAFILE
V$DBFILE
V$INSTANCE

V$LOGFILE
V$LOG
V$PARAMETER
V$SGA
V$SGASTAT

2. Conecte-se ao Enterprise Manager Console.


Responda:
a) Qual o tempo mximo de blocos sujos em memria?
Em outras palavras, qual seria o intervalo mximo de tempo
sem que ocorra um checkpoint. Expanda Instncia e depois
Configurao; Pressione em Todos os Parmetros de
Inicializao e procure algum parmetro que tenha log e
timeout em seu nome. Ser que ele dinmico?
b) Qual o tamanho total do Database Buffer Cache? Inclua blocos de
todos os tamanhos possveis.
c) Quantos bytes esto destinados em memria s operaes de
ordenao?
d) O modo Archiving est ligado?
3. Localize
em seu
Servidor
os
diretrios
ORACLE_BASE e
ORACLE_HOME. Encontre tambm os Data Files, Redo Log Files,
Control Files, Arquivos de Parmetros (existe o binrio?), Arquivos de
Alertas (existe algum trace?). Tente achar tambm o arquivo de senhas
(Password File). Ser que voc conseguiria edit-lo?
4. Analise o arquivo INIT.ORA fornecido.
Oracle 9i Fundamental

252

Responda:
a) Qual o nome da Instncia?
b) Quantos arquivos de controle existem? Onde esto?
c) Quantos tamanhos de bloco existem?
d) Utilizou-se a facilidade OMF (Oracle Managed File)?
e) Qual o tamanho das reas destinadas a programas Java e para o
SS?
Por que ainda no podemos utilizar esse arquivo?
5. Encontre o arquivo de parmetros da instncia corrente.
O que significa parmetro IFILE?
6. Conhea um pouco mais de seu Banco de Dados investigando a viso
database_properties. Ela possui apenas trs colunas e uma vintena de
linhas.
7. Neste exerccio voc ser guiado na criao de um trigger especial que
ser disparado no momento imediatamente seguinte abertura da
instncia.
Acompanhe o seguinte roteiro:
a) Conectado como algum usurio que tenha privilgios de SYSDBA,
crie a tabela:
create table registros
(quem varchar2(20),
banco varchar2(30),
instancia number,
quando date default sysdate);

b) Crie o trigger a ser disparado aps a abertura da instncia. Aqui


se supe que o dono da tabela e do trigger ser MORELLI:
CREATE OR REPLACE TRIGGER t_Abertura
AFTER STARTUP
ON DATABASE
BEGIN
insert into morelli.registros (quem, banco, instancia) values
(ora_login_user, ora_database_name, ora_instance_num);
END;

c) Feche o banco;
d) Abra o Banco;
e) Consulte o contedo da tabela de registros.
Os prximos dois exerccios assumem que o arquivo de parmetros
corrente o binrio.
8. Acrescente outro Control File.
Acompanhe o seguinte roteiro:
Oracle 9i Fundamental

253

a) Crie um arquivo de parmetros do tipo texto;


b) Feche Banco/Instncia;
c) Edite o arquivo de parmetros texto contendo o parmetro
control_files para que conste mais um arquivo, de preferncia, em
outro disco;
d) Copie fisicamente o arquivo de controle existente para um novo
arquivo e d-lhe o nome que consta no Arquivo de Parmetros
recm editado;
e) Abra o Banco utilizando o arquivo de parmetros texto
Comprove a presena do novo Control File, investigando
V$CONTROLFILE.
9. Elimine um Control File antigo.
Acompanhe o seguinte roteiro:
a) Feche Banco/Instncia;
b) Edite o arquivo de parmetros texto contendo o parmetro
control_files para que no conste referncia ao arquivo por
eliminar;
c) Abra o Banco utilizando o arquivo de parmetros texto;
d) Elimine fisicamente o arquivo excludo.
Comprove a alterao, investigando V$CONTROLFILE.
Como seria para mover um Control File?
e) Atualize o arquivo de parmetros binrio;
10.
Conecte-se ao Enterprise Manager Console como usurio com
prerrogativas de SYSDBA.
Feche o Banco. Comprove o sucesso da operao, depois volte a abri-lo.
Note que ser utilizado o arquivo de parmetros binrio recm
atualizado.
11.

Repita o ltimo exerccio pelo SQL*Plus.


Aproveite para conhecer a viso V$DATABASE.

12.
Mova um Redo Log File.
Acompanhe o seguinte roteiro:
a) Feche Banco/Instncia;
b) Movimente o arquivo fisicamente;
c) Abra o Banco em estado mount;
d) Emita o comando alter database rename file ... to ...
Nomes de arquivos devem aparecer entre aspas simples.
e) Abra o Banco.

Oracle 9i Fundamental

254

13.

Mova um Data File.


O roteiro idntico ao do exerccio 12.

14.

Veja a quantas anda a razo entre leituras lgicas e fsicas.


Analise e depois execute os scripts dos arquivos:
19_HitRatioPorArquivo e 19_HitRatioPorUsuario.

Oracle 9i Fundamental

255

REFERNCIA RPIDA
Tarefa
Listar Data Files

Como fazer
Vises V$DATAFILE ou V$DBFILE.
Esta informao est disponvel no Enterprise Manager
Console.

Listar Control Files

Viso
V$CONTROLFILE
CONTROL_FILES.

Listar
Files

Viso V$LOGLFILE ou V$LOG.

Redo

Control

ou

parmetro

Utilize comando:
alter database add logfile
group N ('nome_arquivo') size inteiro M;

Criar Redo

Eliminar Redo

Listar parmetros

Criar SPFILE

O nome do arquivo pode ser omitido caso se tenha


utilizado a facilidade OMF, ou seja, exista contedo no
parmetro: db_create_online_log_dest_n (em que n varia
de 1 a 5). O tamanho default 100 MB.
Utilize o comando:
alter database drop logfile group 1;

Caso no se tenha utilizado a facilidade OMF, o arquivo


fsico ser excludo.
Viso V$PARAMETER ou comando show parameters.
Esta informao est disponvel no Enterprise Manager
Console.
Utilize o comando:
create spfile = 'nome_arquivo'
from pfile = 'nome_arquivo'

Gravaes no arquivo binrio de parmetros somente


valero na prxima abertura da instncia.
Utilize o comando:
Criar PFILE
Alterar parmetro
Verificar ocupao de
memria
Obter
informaes
sobre
instncia
corrente

Abrir instncia

create pfile = 'nome_arquivo'


from spfile = 'nome_arquivo'

ALTER SYSTEM SET =valor SCOPE = escopo. Onde


escopo seria MEMORY ou SPFILE ou BOTH.
Vises V$SGA ou V$SGASTAT.
Esta informao est disponvel no Instance Manager.
Viso V$INSTANCE.
Esta informao est disponvel no Enterprise Manager
Console.
Pelo SQL*Plus, comando: startup nomount.
A rigor, tambm possvel utilizar o SQL*Plus
Worksheet, porm, caso a instncia esteja fechada, no
ser possvel realizar uma conexo. Neste caso,
devemos fazer:
sqlplus /nolog

Oracle 9i Fundamental

256

Tarefa
Abrir parcialmente o
Banco
Abrir Banco
Fechar
Banco/Instncia
Verificar estado de
servi-os responsveis
pelo funcionamento do
Banco

Como fazer
Pelo SQL*Plus modo linha, comando: alter database
mount.
Pelo SQL*Plus modo linha, comando: alter database
open; ou caso esteja fechado: startup.
Pelo SQL*Plus modo linha, comando: shutdown.

Start, Administrative Tools, Services.

Oracle 9i Fundamental

257

Captulo 20 ORGANIZAO LGICA:


TABLESPACES
OBJETIVOS

Definir Tablespace como uma entidade lgica;


Diferenciar os trs tipos de Tablespace disponveis: permanente,
temporria e undo;
Compreender a necessidade de criar vrias Tablespaces e com
caractersticas prprias;
Criar, alterar ou eliminar Tablespaces tanto pelo SQL*Plus
Worksheet, como pelo Enterprise Manager Console;
Ajustar parmetros de armazenamento para que a utilizao de
uma Tablespace seja tima.

NOVIDADES

Como ser detalhado no prximo captulo, agora possvel


automatizar todo o tratamento de Segmentos de Rollback. Uma
das conseqncias deste fato a presena de um terceiro tipo de
Tablespace: Undo;
Em vez de especificar a Tablespace temporria toda vez que se
cria um usurio, agora pode-se caracterizar uma dada
Tablespace como default temporary. Da em diante, todo usurio
criado vai t-la como rea temporria padro.

ARQUIVOS NECESSRIOS

20_Ex_Cria_Tablespaces.sql;
20_Ex_Altera_Tablespaces.sql;
20_Espaco_disponivel.sql.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;
Conhecer principais objetos Oracle: tabela, ndice, constraint,
viso e seqncia;
Identificar as Tablespaces de um Banco.
Oracle 9i Fundamental

258

TEORIA
20.1 - Fundamentos
Como j mencionado, uma Tablespace representa uma entidade lgica
capaz de reunir dados (de controle, temporrios ou dados propriamente
ditos) que guardem semelhanas entre si. O diagrama apresentado em
seguida contextualiza as Tablespaces em um Banco:

Diagrama simplificado demonstrando a relao entre entidades.

Observaes
A figura revela que um Banco de Dados constitui um grupo de
Tablespaces que, por sua vez, so compostas por Data Files, cuja
estrutura mostra um conjunto de blocos (menor unidade
manipulvel pelo Oracle);
Por outro lado, um Banco de Dados tambm constitui um grupo
de Usurios. Cada Usurio pode possuir um Schema que, por
sua vez, composto por Segmentos (tabelas, ndices, etc. Veja
captulos 21-23.). Finalmente, um Segmento composto por
Extents que, por sua vez, so conjuntos de blocos;
Os elementos anteriores no podem "espalhar-se" por outros, isto
, um bloco no pertence a mais de um Extent ou Data File; um
Data File no pertence a mais de uma Tablespace; etc.;
Uma curiosidade: supondo que o tamanho do bloco seja 2.048,
um arquivo de 10M teria 4.999 blocos, j que o primeiro
reservado. O primeiro bloco de cada Segmento tambm
guardado para controle. Alm do mais, perdem--se, em mdia, 80
bytes por bloco com informaes internas.
O Banco de Dados nativo do Windows 2000 j vem com vrias Tablespaces,
das quais destacam-se: Users, Undotbs, Temp e System. Esta ltima a
mais importante, pois nela residem os objetos do Dicionrio de Dados.

Oracle 9i Fundamental

259

Recomenda-se deix-la com 50 e 70% de espao livre e gravar objetos de


usurios em outras Tablespaces.

20.2 - OFA (Optimal Flexible Architecture)


OFA representa um conjunto de diretrizes que visa facilitar a manuteno
de um banco de dados. No se trata de um grupo de regras mandatrias,
mas conselhos. Um banco de dados deve ter uma configurao lgica
(distribuio de Tablespaces) e outra fsica (discos). Segundo o renomado
autor Kevin Loney, a organizao lgica compreende:
System
Data
(tabelas)
Index
(ndices)
Tools
(tabelas criadas por ferramentas:
Delphi, por exemplo)
Undotbs
(segmentos de rollback)
Temp
(rea destinada a objetos temporrios)
Users
(objetos criados por usurios)

A distribuio de discos deve seguir um processo de refinamento que ajuste


um desempenho timo disponibilidade de discos. O mesmo Kevin Loney
parte de uma configurao "ideal" em que constariam 22 discos.
Obviamente, isto no razovel. Aps vrios refinamentos chega seguinte
configurao:
Disco

Contedo

Oracle

System, Primeiro Arquivo de Controle (Control


File)

Undotbs, Temp, Tools, Segundo Arquivo de


Controle

Data, Terceiro Arquivo de Controle

Index

Redo Log Files, Arquivos de exportao

Aplicao, Archived Redo Logs, Users

Observe que:
Tablespaces com caractersticas de ocupao semelhantes esto
no mesmo disco. Arquivos temporrios tm grande tendncia
fragmentao, enquanto arquivos de dados no.

Oracle 9i Fundamental

260

Tablespaces cujos arquivos so gravados simultaneamente esto


em discos diferentes. Isto ocorre com Dados x ndices; Arquivos
de Controle; Redo Log Files x Archived Redo Logs.
Os trs processos que acessam disco constantemente so: DBWR
(aleatoriamente), LGWR e ARCH (seqencialmente). Observe que
eles atuam em discos diferentes, o que minimiza as disputas por
tempo de gravao (conteno).
Os arquivos de uma mesma Tablespace devem ser posicionados
no mesmo disco.
Os Redo Log Files poderiam estar cada um em um disco
diferente. Isto evita-ria o conflito entre LGWR (gravao) e ARCH
(leitura).
Campos do tipo LOB (CLOB, BLOB, NCLOB, NBLOB) podem ser
gravados em Tablespaces prprias. possvel at gravar ndices
de LOBs tambm em separado.
Para que a conteno seja mnima, alm de os discos serem diferentes, as
contro-ladoras tambm devem ser.

20.3 - Criao
O comando create tablespace, cuja sintaxe simplificada aparece em seguida,
permite criar Tablespaces.
CREATE [UNDO] TABLESPACE nome
DATAFILE caminho_completo_1 SIZE inteiro [K | M] [REUSE]
[AUTOEXTEND OFF |
ON
NEXT inteiro [K | M]
MAXSIZE
inteiro [K | M] | UNLIMITED]
[DATAFILE caminho_completo_2 ...]
[BLOCKSIZE inteiro]
[LOGGING | NOLOGGING]
[DEFAULT STORAGE
INITIAL
inteiro [K | M]
NEXT inteiro [K | M]
MINEXTENTS
inteiro
MAXEXTENTS
inteiro
PCTINCREASE inteiro entre 0 e 100]
[ONLINE | OFFLINE]
[EXTENT MANAGEMENT DICTIONNARY | LOCAL]
[PERMANENT | TEMPORARY]

As palavras-chave e os parmetros esto detalhados em seguida:

Oracle 9i Fundamental

261

Clusula

UNDO

nome

DATAFILE

AUTOEXTEND

BLOCKSIZE

LOGGING

DEFAULT
STORAGE

Descrio

Caracteriza a Tablespace sendo criada como do tipo Undo. Como


ser visto no captulo 21, caso a gerncia de segmentos de
rollback seja automatizada, a presena de pelo menos uma
Tablespace deste tipo resulta obrigatria.
Apenas duas clusulas podem ser utilizadas na criao desse
tipo de Tablespace: datafile e extent management. As demais, ou
sero ignoradas, ou recusadas.
Nome da Tablespace
Indica um ou mais arquivos que constituiro a Tablespace. Ser
obrigatria caso no estejam sendo utilizados arquivos OMF
(veja exemplo em seguida).
Devem-se especificar, alm do caminho completo, o tamanho
(em KB ou MB) e a possibilidade de reaproveitar um arquivo
existente (reuse). Raramente uma Tablespace ocupar menos de
1 MB. Os nomes devem ser especificados entre aspas simples.
Recomenda-se que somente seja acrescentado um segundo
arquivo, quando o primeiro atingir o tamanho mximo permitido
pelo SO.
Cuidado: o Oracle aloca mais espao do que o especificado,
portanto, antes de acrescentar um arquivo, verifique se existe
espao disponvel no disco suficiente para uma vez e meia o
tamanho dele.
Um arquivo pode ser automaticamente expandido por um valor
fixo at um limite ou indefinidamente. Esta clusula no
recomendada.
Determina o tamanho do bloco (diferente do padro) a ser
utilizado pelos segmentos a serem criados. Observe que o
parmetro DB_xxK_CACHE_SIZE correspondente deve ter sido
especificado. Os valores possveis so 2K, 4K, 8K, 16K e 32K.
Informa-se a criao dos segmentos na Tablespace, que sero
registrados no Redo Log por default. A opo NOLOGGING
realiza o contrrio. Ainda que o no-registro proporcione mais
velocidade, deve-se preferir sempre o registro em log.
Parmetros de Armazenamento padro utilizados quando a
gerncia de Extents for baseada no Dicionrio de Dados
(clusula EXTENT MANAGEMENT igual a DICTIONARY):
INITIAL: tamanho do primeiro Extent alocado (em bytes).
Default: cinco vezes o tamanho do bloco.
NEXT: quantos bytes sero alocados no momento da expanso.
No h garantias de que sero contguos aos primeiros. Default:
cinco vezes o tamanho do bloco.
MINEXTENTS: quantos Extents devero ser alocados na criao
de um Segmento. Default: 1.

Oracle 9i Fundamental

262

Clusula

ONLINE

PERMANENT

EXTENT
MANAGEMENT

Descrio

MAXEXTENTS: quantidade mxima de Extents alocados por


Segmento. Recomenda-se que no passe de 10. O valor default
ser determinado pelo tamanho do bloco.
PCTINCREASE: porcentagem de crescimento aplicada na
expanso. Caso seja zero, o SMON no far compactaes que
aumentam reas livres contguas, por isto, em vez de deix-lo
como zero, recomenda-se atribuir um valor pequeno (1, por
exemplo). Default: 50.
Determina se a Tablespace estar disponvel imediatamente aps
a criao ou no (OFFLINE).
Caracteriza a natureza dos dados que constaro nos arquivos da
Tablespace: ou permanentes ou temporrios (neste caso, sero
dados transitrios, resultados de agrupamentos ou ordenaes).
Desde a verso 8i existe uma alternativa gerncia de Extents
com os parmetros descritos na clusula DEFAULT STORAGE.
Trata-se da gerncia local Tablespace, ou seja, durante
operaes de alocao de dados h menos acessos ao Dicionrio
de Dados em busca de espaos livres.
A clusula EXTENT MANAGEMENT aceita dois valores:
DICTIONARY ou LOCAL. O primeiro ser default caso o
parmetro COMPATIBLE seja menor que 9.0.0; caso contrrio,
valer o segundo.
Ao especificar LOCAL, ainda deve-se determinar uma das duas
modalidades: AUTOALLOCATE ou UNIFORM. No primeiro caso
deixa-se a cargo do Oracle a alocao de Extents, que podero
ser de tamanhos variveis. J no segundo, todos os Extents
tero obrigatoriamente o mesmo tamanho.

Observaes

Os parmetros de armazenamento sero utilizados no momento da


criao de Segmentos.
Cuidado: para Tablespaces temporrias com gerncia de Extents
baseada no Dicionrio, um valor grande de INITIAL pode levar ao
erro ORA-1652 (tentativa frustrada de alocao de espao). Isto
aconteceria caso muitos usurios requeressem espaos temporrios
simultaneamente.
Ao criar um usurio45, podem-se especificar Tablespaces de dados e
temporrias defaults. Isto altamente recomendvel, pois ajuda
bastante quando for necessrio exportar uma Tablespace para
eliminar fragmentao ou exportar objetos.
Por exemplo:
create user novo identified by senha

45

Mais detalhes sobre criao de usurios no captulo 24.

Oracle 9i Fundamental

263

default tablespace USERS


temporary tablespace TEMP;

Uma importante novidade introduzida pela verso 9i consiste na


Default Temporary Tablespace. Uma vez especificada, todo
usurio que venha a ser criado vai t-la como default para reas
temporrias. Isto evita o clssico erro de atribuir uma Tablespace
permanente como sendo a temporria default de um usurio.
Utilizar uma Tablespace permanente como sendo a temporria
default traz alguns problemas de performance. Isto porque
segmentos temporrios criados em Tablespaces permanentes so
imediatamente destrudos aps utilizao, o que no acontece em
Tablespaces temporrias.
Para caracterizar uma Tablespace temporria como a Default
Temporary Tablespace, utilizamos o comando alter database:

alter database default temporary tablespace temp;

Para descobrir a Default Temporary Tablespace vigente, fazemos:


select property_value from database_properties
where property_name = 'DEFAULT_TEMP_TABLESPACE';

Para criar uma Tablespace Temporria com gerncia de Extents


local, deve-se utilizar o comando create temporary tablespace (veja
exemplo em seguida). Os arquivos criados por este comando no
aparecem ao listar V$DBFILE e sim V$TEMPFILE. Voltaremos a
este assunto no captulo 25.

Existe uma tendncia natural em passar a criar novas


Tablespaces utilizando a gerncia de Extents Local, j que esta
forma alivia o fardo de acompanhar a alocao de espao, alm
de ser mais eficiente.
Caso se insista na gerncia de Extents do tipo Dicionrio,
tipicamente, existir uma Tablespace contendo todas as tabelas
de dados do Banco. Normalmente, existem poucas grandes e
muitas pequenas, portanto, ao criar esta Tablespace, recomendase utilizar valores pequenos para os Parmetros de
Armazenamento (Default Storage) e deixar para cada tabela
(segmento) grande os valores especficos.
Os valores dos Parmetros de Armazenamento (INITIAL, NEXT, etc.)
devem ser obtidos aps anlise dos scripts de criao das
tabelas. A partir dos tamanhos de cada registro e previso de
volume de dados, pode-se especificar o tamanho mximo que
uma tabela com seus ndices alcanar. Recomenda-se
superestimar esses valores. Outro conselho: que os discos que

Oracle 9i Fundamental

264

contero Tablespaces com dados tenham entre 20 e 25% de


espao livre.
O exemplo seguinte mostra a evoluo do tamanho de uma tabela
criada com INITIAL = 100K, NEXT 50K e PCTINCREASE 100.

INITIAL (em blocos)


NEXT (em blocos)
PCT
BLOCO

em bytes
102,400
51,200

50
25
100%
2

Extents

2048
em KB
expande

tamanho
1
2
3
4
5
6

100
100
150
250
450
850

0
50
100
200
400
800

novo

em blocos

100
150
250
450
850
1,650

50
75
125
225
425
825

Note que no importa o valor de MINEXTENTS. A tabela anterior aplica-se


no momento da expanso.
Altos valores de PCTINCREASE podem levar a um crescimento
descontrolado de uma tabela. Sugere-se cri-la com INITIAL realista, NEXT
pequeno e PCTINCREASE igual a um (devido ao de compactao do
SMON).

Primeiro exemplo46: Tablespace com um arquivo


CREATE TABLESPACE TABELAS
DATAFILE 'E:\ORACLE\ORADATA\ACAD9\ACADTAB.ORA' SIZE 10 M
AUTOEXTEND ON NEXT 1 M MAXSIZE 20 M
DEFAULT STORAGE (INITIAL 200 K
NEXT
200 K
MINEXTENTS 2
MAXEXTENTS 10
PCTINCREASE 100)
EXTENT MANAGEMENT DICTIONARY;

Observaes
O diretrio destino j deve existir.
Para comprovar a criao:
select tablespace_name from dba_tablespaces where tablespace_name = 'TABELAS';
TABLESPACE_NAME
-----------------------------46

Os
exemplos
seguintes
20_Ex_Cria_Tablespaces.sql.

constam

no

Oracle 9i Fundamental

arquivo

exemplo

265

TABELAS

E para comprovar o espao ocupado:


select * from dba_free_space where tablespace_name = 'TABELAS';
TABLESPACE_NAME
FILE_ID
BLOCK_ID
BYTES
--------------TABELAS

-------- --------9

--------

-------

17

BLOCKS RELATIVE_FNO
------------

10420224

2544

Em Tablespaces com gerncia de Extents do tipo Dicionrio, medida que


Segmentos com seus Extents vo sendo criados e apagados, a tendncia
que surjam vrias "ilhas" de blocos disponveis. Quanto mais "ilhas", maior
a fragmen-tao e pior a performance.

Segundo exemplo: Undo


CREATE UNDO TABLESPACE UNDOTBS2
DATAFILE 'E:\ORACLE\ORADATA\ACAD9\UNDOTBS02.ORA' SIZE 10 M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

Observaes
Como se escolheu a gerncia de Extents Local, a clusula default storage
no faria sentido.
Mesmo na gerncia de Extents Local, somente se aceita a forma
autoallocate.
Obriga-se a utilizao da clusula datafile, mesmo que a facilidade OMF
esteja ativa (parmetro db_create_file_dest com algum diretrio vlido).

Terceiro exemplo: Temporria


CREATE TEMPORARY TABLESPACE TEMP2
TEMPFILE 'E:\ORACLE\ORADATA\ACAD9\TEMP2.ORA' SIZE 10 M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

Observaes

O arquivo criado no aparece ao listar V$DBFILE. Ele surge em


V$TEMPFILE. Isto no aconteceria caso a Tablespace tivesse sido
criada com o comando create tablespace ... temporary, entretanto
no poderamos especifi-car a gerncia de Extents Local.
Note que a gerncia de Extents Local cai como uma luva para o
compor-tamento altamente fragmentvel das Tablespaces
temporrias.
O tamanho do bloco deve ser obrigatoriamente igual ao padro.

Oracle 9i Fundamental

266

Quarto Exemplo: OMF com Uniform Size


CREATE TABLESPACE TABELAS2
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1 M;

Observaes

Para que o comando anterior obtenha pleno xito, deve-se


garantir que o parmetro db_create_file_dest possua algum
diretrio vlido. Caso no possua, pode-se atribuir-lhe um valor:

alter system set db_create_file_dest = 'E:\ORACLE\ORADATA\ACAD9';

O nome do arquivo foi gerado pelo Oracle e seu tamanho ser de


100 MB.

20.4 - Alterao
O comando alter tablespace, detalhado em seguida, permite alterar
Tablespaces.
ALTER TABLESPACE nome [LOGGING | NOLOGGING]
ADD DATAFILE caminho_completo_1 SIZE inteiro [K | M] [REUSE]
[AUTOEXTEND OFF |
ON NEXT inteiro [K | M]
MAXSIZE
inteiro [K | M] | UNLIMITED]
DATAFILE caminho_completo_2 ...
RENAME DATAFILE arquivo1 TO arquivo2
COALESCE
DEFAULT STORAGE
NEXT
inteiro [K | M]
MAXEXTENTS
inteiro
PCTINCREASE
inteiro entre 0 e 100
ONLINE | OFFLINE [NORMAL | TEMPORARY | IMMEDIATE | FOR RECOVER]
BEGIN BACKUP
END BACKUP
READ ONLY | READ WRITE
PERMANENT | TEMPORARY

As palavras-chave e os parmetros esto detalhados em seguida:


Clusula

Descrio

nome

Nome da Tablespace.

LOGGING

idem CREATE TABLESPACE.

ADD DATAFILE

Arquivos a serem acrescentados. Caso se decida por arquivos


que cresam automaticamente, deve-se utilizar a clusula
AUTOEXTEND para cada arquivo.

RENAME DATAFILE

Arquivos a serem renomeados. A Tablespace deve estar em


modo offline e o arquivo destino j deve existir.

COALESCE

Compacta espao nos arquivos. Deve ser especificada sozinha.


Perde sentido quando a gerncia de Extents for Local.
Oracle 9i Fundamental

267

Clusula

Descrio

DEFAULT STORAGE

Parmetros de Armazenamento assumidos quando no


constarem na criao de segmentos. Os novos valores so
utilizados para criaes posteriores emisso do comando
ALTER TABLESPACE.
Esta clusula somente ser levada em conta se a gerncia de
Extents for do tipo Dicionrio.

ONLINE

Determina se a Tablespace estar disponvel imediatamente


aps a criao ou no (OFFLINE).

OFFLINE

Indisponibiliza a Tablespace. Isto pode ser feito, garantindo


que os arquivos esto disponveis para uso (NORMAL) ou no.
Neste caso, podem-se aplicar checkpoints nos arquivos
(TEMPORARY) ou no (IMMEDIATE), em que explicitamente
"desligam-se" os arquivos que estejam danificados.

BEGIN BACKUP

Indica que a Tablespace est entrando ou saindo (END


BACKUP) do estado de cpia (Veja captulo 25).

READ ONLY

Bloqueia ou no (READ WRITE) alteraes aos dados da


Tablespace.

PERMANENT

Natureza
dos
(TEMPORARY)

dados:

permanentes

ou

temporrios.

Observaes

Arquivos podem ser includos com o Banco aberto e a Tablespace


disponvel.
Arquivos podem ser desconectados ou alterados via comando
alter database, como visto no exemplo em seguida.

Primeiro exemplo47: Tablespace com um arquivo


ALTER TABLESPACE TABELAS
ADD DATAFILE 'E:\ORACLE\ORADATA\ACAD9\ACADTAB2.ORA' SIZE 10 M
AUTOEXTEND ON NEXT 1 M MAXSIZE 20 M;

Observaes
O diretrio destino j deve existir. Para comprovar o espao ocupado:
select * from dba_free_space where tablespace_name = 'TABELAS';
TABLESPACE_NAME FILE_ID
--------------- -------TABELAS
13
TABELAS
9

47

BLOCK_ID
-------17
17

Os
exemplos
seguintes
20_Ex_Altera_Tablespaces.sql.

BYTES
-----10420224
10420224

BLOCKS
--------2544
2544

constam

no

Oracle 9i Fundamental

RELATIVE_FNO
-----------13
9

arquivo

exemplo

268

Segundo exemplo: Mudando algum parmetro de armazenamento


ALTER TABLESPACE TABELAS
DEFAULT STORAGE (MAXEXTENTS 20

PCTINCREASE 50);

Observaes
Perceba que o comando anterior teve sucesso, pois o modo de gerenciamento de Extents da Tablespace do tipo Dicionrio.
Comprovando a mudana:
select tablespace_name, max_extents, pct_increase
from dba_tablespaces where tablespace_name = 'TABELAS';
TABLESPACE_NAME
MAX_EXTENTS PCT_INCREASE
----------------------------- ----------- -----------TABELAS
20
50

Terceiro exemplo: reduzindo o tamanho de um arquivo


ALTER DATABASE DATAFILE 'E:\ORACLE\ORADATA\ACAD9\ACADTAB.ORA'
RESIZE 5 M;

Observaes

O comando anterior somente ter sucesso caso nenhum bloco


com dados seja afetado.
A clusula RESIZE tambm pode ser utilizada para aumentar o
tamanho de um arquivo.

20.5 - Eliminao
O comando drop tablespace, detalhado em seguida, permite eliminar
Tablespaces.
DROP TABLESPACE nome
[INCLUDING CONTENTS [AND DATAFILES] [ CASCADE CONSTRAINTS]]

As palavras-chave e os parmetros esto detalhados em seguida:


Clusula

Descrio

nome

Nome da Tablespace.

INCLUDING
CONTENTS

Realiza a excluso mesmo se houver algum Segmento;


entretanto, a ope-rao fracassar, caso existam Segmentos de
Rollback ou Temporrios ativos.

AND DATAFILES

Utilizada em conjunto com a anterior, fora a eliminao fsica


dos arquivos que compem a Tablespace. Desnecessria para
arquivos OMF.
Oracle 9i Fundamental

269

Clusula

Descrio

CASCADE
CONSTRAINTS

Elimina constraints relacionados a tabelas na Tablespace


corrente que estejam em outra Tablespace. Tambm vale o seno
anterior.

Exemplo
DROP TABLESPACE TABELAS INCLUDING CONTENTS AND DATAFILES;

Note que os arquivos fsicos NO precisam ser eliminados via Sistema


Operacional.

20.6 - Enterprise Manager Console


Pelo EMC torna-se bastante simples gerenciar o estado das Tablespaces de
um Banco:

Para criar uma nova Tablespace, clica-se com o boto direito em


Tablespaces e seleciona-se Criar:

Oracle 9i Fundamental

270

EXERCCIOS
1. Crie uma Tablespace temporria com dois arquivos auto-expansveis,
tendo cada um o tamanho de 500 KB. O prximo tamanho dos arquivos
ser de 1 MB e o tamanho mximo de 10 MB. O tamanho inicial dos
Extents ser de 100 KB, os seguintes de 200 KB e crescimento
exponencial de 50%.
Elabore um script para cri-la.
Qual ser o modo de gerenciamento de Extents utilizado? Ser o
mais ade-quado?
Verifique o sucesso da operao, comprovando a criao dos
arquivos e listando DBA_TABLESPACES.
Outra forma seria pelo Enterprise Manager Console.
2. Mova um dos arquivos para outro diretrio.
Acompanhe o seguinte roteiro:
a) Indisponibilize a Tablespace. Na clasula OFFLINE, utilize a
opo IMMEDIATE;
b) Mova o arquivo fisicamente para a nova localizao;
c) Emita o comando ALTER TABLESPACE ... RENAME;
d) Habilite a Tablespace.
Como ser visto mais tarde, o ideal seria, antes de realizar uma
operao como esta, fazer um backup completo do Banco.
3. Acrescente outro arquivo com 20 M Tablespace criada.
4. Altere o tamanho do arquivo recm-criado para 10 M.
Oracle 9i Fundamental

271

Utilize o comando ALTER DATABASE.


Experimente reduzir o tamanho de um arquivo com dados.
Analise a mensagem produzida.

5. Tente eliminar um arquivo da Tablespace criada.


Como resolver este "problema"?
6. Elimine a Tablespace recm-criada sem que seja necessrio apagar
fisicamente os arquivos.
7. Abra o script 20_espaco_disponivel.sql. Analise-o cuidadosamente,
depois execute-o.
O que pode ser concludo quanto ao espao disponvel das
Tablespaces?
8. Reflita: qual seria a real importncia dos Parmetros
Armazenamento se eles so sobrescritos na criao de Segmentos?

de

9. Investigue as vises V$SORT_SEGMENT e V$SORT_USAGE. Quais


informaes teis elas podem proporcionar?
10.
Descubra a gerncia de Extents utilizada para as Tablespaces de seu
Banco.
Investigue
as
colunas
EXTENT_MANAGEMENT
e
ALLOCATION_TYPE de DBA_TABLESPACES.

REFERNCIA RPIDA
Tarefa

Como fazer

Criar uma Tablespace

Comando CREATE TABLESPACE


Para criar uma Tablespace Temporria com
gerenciamento Local, utilize o comando CREATE
TEMPORARY TABLESPACE.
Esta funcionalidade, assim como alterar e excluir,
est disponvel no Enterprise Manager Console.

Alterar uma Tablespace

Comando ALTER TABLESPACE.

Eliminar uma Tablespace

Comando DROP TABLESPACE.

Verificar a possibilidade
de criar uma Tablespace
com arquivos OMF

Verifique o contedo do parmetro:


DB_CREATE_FILE_DEST.

Oracle 9i Fundamental

272

Tarefa

Listar Tablespaces ou
informaes afins

Como fazer
Vises: DBA_EXTENTS, USER_EXTENTS
DBA_SEGMENTS,
USER_SEGMENTS
DBA_DATA_FILES
DBA_TABLESPACES
USER_TABLESPACES

Mostrar informaes
sobre espao livre em
Tablespaces com
gerenciamento Local

Vises DBA_LMT_FREE_SPACE e
DBA_LMT_USED_EXTENTS

Listar arquivos
temporrios

Vises DBA_TEMP_FILES e V$TEMPFILE

Alterar tamanho de um
arquivo

Comando ALTER
RESIZE tamanho.

DATABASE

Oracle 9i Fundamental

DATAFILE

nome

273

Captulo 21 SEGMENTOS DE
ROLLBACK/UNDO
OBJETIVOS

Definir Segmento como uma entidade fsica;


Diferenciar os tipos de Segmento;
Compreender a importncia dos Segmentos de Rollback/Undo;
Diferenciar Segmento de Rollback de Segmento de Undo, este
gerenciado automaticamente pelo Oracle;
Criar, alterar ou eliminar Segmentos de Rollback tanto pelo
SQL*Plus Worksheet, como pelo Enterprise Manager Console;
Acompanhar a utilizao dos Segmentos de Rollback e antever
possveis problemas.

NOVIDADES

A gerncia de Segmentos de Rollback foi enormemente facilitada


com a SMU (System Managed Undo). Agora, o tempo do DBA
gasto com reas de Rollback tende a cair bastante;
Estando ativa a SMU, pode-se implementar o recurso
denominado Flashback Queries, que permite recuperar dados
que estiveram presentes em algum instante passado;
Desaconselha-se enfaticamente a utilizao do parmetro
ROLLBACK_SEGMENTS. Assim como DB_BLOCK_BUFFERS, ele
continua presente, porm caiu em desuso.

ARQUIVOS NECESSRIOS

21_Mostra_RBS.sql;
21_Monta_Tabelas.sql;
21_Recupera_Alunos;
21_Alimenta_Historico.sql.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;
Conhecer o conceito de Tablespace e sua composio;
Criar, alterar, excluir ou listar Tablespaces.
Oracle 9i Fundamental

274

TEORIA
21.1 - Introduo aos Segmentos
Segmentos ocupam fisicamente os arquivos que constituem a Tablespace
na qual esto inseridos. Dividido em Extents e estes em Blocos, um
Segmento pode ocupar mais de um arquivo, fato impossvel para um
Extent.
H quatro grandes tipos de Segmento:
Tabela

ndice

Rollback/
Undo

Temporrio

Armazena dados residentes em tabelas. Mais detalhes no captulo


22.
Estrutura que prioriza a velocidade de acesso aos dados. Mais
detalhes no captulo 23. Dividem-se em:
ndice de Acesso:
rvores B que contm valoreschaves.
Index Cluster: Reunio fsica de tabelas com campo em
comum.
Hash Cluster: Reunio de tabelas cujas linhas so
localizadas aps clculo.
Requisitado por transaes que precisem armazenar dados
"velhos" que podero ser reaproveitados. D-se o nome de
Rollback queles criados no modo de gerenciamento manual e
Undo quando a SMU (System Managed Undo) estiver ativa.
Criado automaticamente em Tablespaces temporrias, quando o
espao requerido superar o especificado em SORT_AREA_SIZE.
Ao terminar a operao requerente, o segmento destrudo.
Para gerncia de Extents baseada em Dicionrio48, os Segmentos
tempo-rrios acompanham obrigatoriamente as especificaes da
Tablespace na qual residem. Valores recomendados: INITIAL >
SORT_AREA_SIZE,
NEXT
e
MAXEXTENTS
grandes
e
PCTINCREASE igual a um (para que entrem nos procedimentos de
compactao peridica). Alm disto, INITIAL e NEXT devem ser
mltiplos do valor estabelecido em SORT_AREA_SIZE.
Na viso V$SYSSTAT, existem trs valores relacionados a
ordenaes: sorts (memory), sorts(disk) e sorts(rows). Caso o segundo seja
maior que 10% do primeiro, h problemas de mau dimensionamento
de reas temporrias.
Para gerncia de Extents Local, recomenda-se a modalidade
UNIFORM.

O diagrama do captulo 20 pode ser reescrito para:

48

Para conhecer a diferena entre as duas formas de gerenciar


(Dicionrio ou Local), consulte o captulo 20, item 20.3.

Oracle 9i Fundamental

Extents

275

Diagrama demonstrando a relao entre entidades que consideram


tipos de segmento.

Observaes
Nada impede que um segmento espalhe-se por mais de um datafile;
Um Extent representa uma alocao contnua de bytes em um Data
File, portanto um extent no pode ocupar mais de um Data File;
A viso DBA_EXTENTS permite saber a qual extent pertence um bloco e
a qual Data File pertence um extent.
Este captulo concentra-se nos Segmentos de Rollback/Undo.

21.2 - Introduo aos Segmentos de Rollback/


Undo
Uma importante novidade introduzida na verso 9i a possibilidade de
gerenciar Segmentos de Rollback automaticamente. Historicamente, DBAs
costumavam perder um tempo valioso preocupando-se com esta gerncia,
seja evitando problemas de conteno (muitos pedidos concentrados em
poucos segmentos), seja para combater os famigerados erros ORA-1555
(Snapshot too old) e ORA-1562 (Unable to extend Rollback Segment).
Para evitar possveis mal-entendidos, a Oracle convencionou denominar
Rollback Segment aqueles Segmentos criados sob gerncia manual,
Oracle 9i Fundamental

276

presente at a verso 8i e ainda possvel na 9i. J os Undo Segments


identificam os criados sob gerncia automtica. No fundo, tanto um como
outro significam o mesmo: uma rea especial destinada a guardar
contedos de blocos alterados por uma transao.
Neste captulo veremos as duas gerncias, porm comearemos por um
apanhado genrico.
Quando uma transao que no seja do tipo READ ONLY comea, reservase uma entrada em um Segmento de Rollback/Undo. Uma transao no
ocupa dois segmentos, entretanto um segmento pode conter vrias
entradas de transaes. medida que mais dados vo sendo modificados,
mais extents vo sendo alocados. Na gerncia manual, seguem-se os
valores especificados nos Parmetros de Armazenamento (INITIAL, NEXT,
MINEXTENTS e MAXEXTENTS. PCTINCREASE no utilizado).
Dentro de um Extent, os blocos so alocados para as transaes. Um
Extent pode conter blocos de vrias transaes, entretanto cada bloco
somente possui referncia a uma transao:
Extent
Bloco 1

Bloco 2

Bloco 3

Bloco 4

Bloco 5

Transao 1,
bloco 1

Transao 1,
bloco 2

Transao 2,
bloco 1

Transao 1,
bloco 3

Transao 2,
bloco 2

Disposio de Blocos e Transaes em um Extent.


Quando uma transao termina, os extents alocados para ela so liberados
para que outra possa utiliz-los, isto , os Extents que estavam ativos
passam a estar inativos. Suponha que a Transao 1 tenha sido
concluda:

Extent
Bloco 1

Bloco 2

Bloco 3

Bloco 4

Bloco 5

Transao 1,
bloco 1
Inativo

Transao 1,
bloco 2
Inativo

Transao 2,
bloco 1

Transao 1,
bloco 3
Inativo

Transao 2,
bloco 2

Quando a transao termina, o bloco fica inativo.


Isto pode causar problemas, caso exista uma grande consulta que comeou
a ser executada antes da transao e continuou aps o trmino dela. Caso
os blocos inativos tenham sido requeridos por outra transao, a sesso
executando a grande pesquisa receber um erro clssico:
ORA-1555: snapshot too old (rollback segment too small)

Oracle 9i Fundamental

277

Esse problema tende a no ocorrer quando a SMU estiver presente, j que


possvel especificar o tempo que extents inativos devem ser preservados.
Mais detalhes em seguida.
A organizao dos Extents em um Segmento de Rollback/Undo circular,
isto , ao ser necessrio um Extent, verifica-se a disponibilidade contgua.
Se no for possvel realizar a alocao at o ltimo Extent, verifica-se o
primeiro. Se ainda assim no for possvel realizar a alocao, ocorre a
expanso. Nota-se que, caso o primeiro esteja ocupado, mesmo que o
segundo esteja livre, acontece a expanso.
No caso da primeira tabela apresentada anteriormente, caso a segunda
transao requeresse um bloco, ocorreria a expanso (Blocos 6 a 10), se a
Transao 1 no tivesse sido concluda, ou seria utilizado o Bloco 1
(segundo quadro).
O tamanho da rea destinada a Segmentos de Rollback/Undo deve ser
corretamente dimensionada, j que durante uma longa transao, se no
for possvel alocar um Extent, acontecer o terrvel ORA-1562. Alis, ele
provoca o rollback da transao em questo.
As diretrizes que nortearo o quanto deve ser destinado a Segmentos de
Rollback/Undo dependem da gerncia utilizada. Voltaremos a este
importante assunto nos prximos dois itens.
Para que um Segmento de Rollback/Undo possa receber requisies de
transaes, ele deve estar ONLINE:
select segment_name, tablespace_name, status
from dba_rollback_segs
order by 3,2,1;

Sada:
SEGMENT_NAME
-----------------------------_SYSSMU11$
_SYSSMU12$
_SYSSMU13$
_SYSSMU14$
_SYSSMU15$
_SYSSMU16$
_SYSSMU17$
_SYSSMU18$
_SYSSMU19$
_SYSSMU20$
SYSTEM
_SYSSMU1$
_SYSSMU10$
_SYSSMU2$
_SYSSMU3$
_SYSSMU4$
_SYSSMU5$
_SYSSMU6$
_SYSSMU7$
_SYSSMU8$
_SYSSMU9$

TABLESPACE_NAME
-----------------------------UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
UNDOTBS2
SYSTEM
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS
UNDOTBS

STATUS
-------OFFLINE
OFFLINE
OFFLINE
OFFLINE
OFFLINE
OFFLINE
OFFLINE
OFFLINE
OFFLINE
OFFLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE

21 linhas selecionadas.

Oracle 9i Fundamental

278

Observaes

V-se pela listagem anterior que, apesar de existirem 21


Segmentos, apenas 11 esto disponveis: um em SYSTEM e os
outros em UNDOTBS.
Logo aps a criao do Banco de Dados e sua primeira
Tablespace, SYSTEM, cria-se um Segmento de Rollback tambm
denominado SYSTEM. Caso nada se diga em contrrio, ser
estabelecida a SMU e criada uma Tablespace do tipo Undo que
armazenar Segmentos de Undo.
A viso DBA_ROLLBACK_SEGS informa o que for necessrio
sobre definies de Segmentos de Rollback/Undo:
select column_name Campo, data_type Tipo from dba_tab_columns
where table_name = 'DBA_ROLLBACK_SEGS';
CAMPO
-----------------------------SEGMENT_NAME
OWNER
TABLESPACE_NAME
SEGMENT_ID
FILE_ID
BLOCK_ID
INITIAL_EXTENT
NEXT_EXTENT
MIN_EXTENTS
MAX_EXTENTS
PCT_INCREASE
STATUS
INSTANCE_NUM
RELATIVE_FNO

TIPO
---------VARCHAR2
VARCHAR2
VARCHAR2
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
VARCHAR2
VARCHAR2
NUMBER

21.3 - Gerncia Automtica (System Managed


Undo)
Como j dito, ao criar um Banco de Dados, utilizando o Oracle
Database Configuration Assistant (DBCA - assistente composto por vrias
telas amigveis que faciltam a criao de um Banco - ser discutido no
captulo 26), assume-se a gerncia automtica e tambm cria-se uma
Tablespace do tipo Undo, cuja existncia obrigatria para que seja
possvel trabalhar com Undo Segments.
Estando a SMU vigente, comandos outrora utilizados para
manipulao de Segmentos de Rollback ficam proibidos: create, alter e drop
rollback segment e set transaction to segmento de rollback
Graas SMU, Segmentos so criados e destrudos; ativados ou
indisponibilizados ao sabor do ambiente. Isto libera o DBA de maantes
tarefas, tais como: criar, dimen-sionar, ativar, redirecionar, acompanhar,
etc.
Oracle 9i Fundamental

279

Os parmetros seguintes indicam a presena da SMU:


show parameters undo
NAME
-----------------------------------undo_management
undo_retention
undo_suppress_errors
undo_tablespace

Parmetro

TYPE
----------string
integer
boolean
string

VALUE
----------AUTO
10800
FALSE
UNDOTBS1

Descrio

undo_management

Indica presena da SMU (contedo AUTO), ou


no (MANUAL). nico esttico, ou seja, para
que se torne efetivo, deve-se reiniciar a
instncia.

undo_retention

Tempo em segundos indicando a "vida" de um


Extent.
Este
parmetro
pode
ser
"desobedecido"
caso
seja
necessrio
requisitar novos Extents, ou seja, antes da
alocao de mais espao, procuram-se Extents
unexpireds.

pode ser TRUE ou FALSE. Faz com que rotinas


contendo comandos de gerncia manual de
Segmentos de Rollback no parem quando a SMU
undo_suppress_er estiver ativa. Ao deparar-se com tais
comandos,
eles
sero
ignorados
e
rors
simplesmente grava-se um aviso no arquivo de
alertas

undo_tablespace

nome da Tablespace do tipo UNDO. Para que a


SMU
possa
existir,
deve-se
garantir
previamente a presena de uma Tablespace do
tipo UNDO e que esteja ativa (online).

O tamanho da rea destinada a Segmentos do tipo Undo pode ser


dimensionada com auxlio da novssima viso V$UNDOSTAT. Por exemplo,
imagine que se tenha emitido a seguinte consulta:
select to_char(begin_time, 'DD/MM/YY HH24:MI:SS') Incio,
to_char(end_time, 'DD/MM/YY HH24:MI:SS') Final,
undoblks Blocos, maxconcurrency "Mxima Concorrncia"
from v$undostat;

Produzindo o resultado:
INCIO
----------------10/05/02 11:57:52
10/05/02 11:47:52
10/05/02 11:37:52
10/05/02 11:27:52
10/05/02 11:17:52
10/05/02 11:07:52

FINAL
BLOCOS Mxima Concorrncia
----------------- ---------- ------------------10/05/02 11:59:15
100
3
10/05/02 11:57:52
146
4
10/05/02 11:47:52
95
1
10/05/02 11:37:52
180
5
10/05/02 11:27:52
96
1
10/05/02 11:17:52
105
2

Oracle 9i Fundamental

280

...

A relao anterior mostra o que aconteceu em termos de rea de Undo nos


ltimos cinqenta minutos. Alimenta-se V$UNDOSTAT automaticamente
(estando a SMU ativa ou no) a cada dez minutos e por 24 horas, portanto
a quantidade mxima de linhas ser de 144. Supondo que o mostrado
represente um intervalo tpico de utilizao do banco, podemos concluir o
seguinte:
O pico de utilizao foi de 180 blocos.
Supondo
que
o
tempo
de
reteno
(contedo
de
UNDO_RETENTION) seja de trs horas (10.800 segundos),
precisaramos de 180 * 4K (tamanho do bloco) * 18 (intervalos de
10 minutos) = 13.271.040 bytes (pouco mais de 12 MB).
Convm utilizar uma boa folga, assim podemos destinar 20 MB
Tablespace de Undo.
Naturalmente, vale a pena checar periodicamente
a
V$UNDOSTAT para no ser surpreendido.

21.4 - Flashback Queries


Estando a SMU ativa, sob determinadas circunstncias, possvel
recuperar o contedo de uma tabela cujas linhas tenham sido excludas
acidentalmente. Trata-se do indito recurso denominado Flashback
Queries que aproveita dados coletados nos Extents ainda no expirados.
Isto significa que as transaes que os utilizaram foram concludas h
menos tempo do que informa o parmetro undo_retention_size ou seus
espaos ainda no foram novamente ocupados.
A capacidade de recuperao restringe-se a cinco dias, sempre e quando
Extents no tiverem sido reutilizados ou no tiver acontecido algum
comando DDL sobre a tabela que se deseja recuperar, ou seja, a tabela no
pode ter sofrido nenhum alter table, drop table, truncate table, etc.).
Antes de aproveitar esse recurso, deve-se conceder permisso49 de
execuo no Package embutido DBMS_FLASHBACK ao usurio que deseja
utiliz-lo. Conectado como SYS, emite-se o comando:
grant execute on dbms_flashback to dbaacad;

Imagine que s 9:00 de uma nefasta manh qualquer, tenham sido


eliminados os contedos das tabelas ALUNOS e HISTORICO:
delete historico;
delete alunos;
commit;

E que vinte minutos depois venha-se descobrir tal fatalidade:


49

A concesso
Segurana.

de

permisses

voltar

ser

abordada

Oracle 9i Fundamental

no

captulo

24

281

select count(*) from alunos;


COUNT(*)
---------0

Para "voltar no tempo", utiliza-se a rotina enable_at_time, presente no j


citado Package:
execute dbms_flashback.enable_at_time (sysdate - 25/1440);

Este comando busca o estado das tabelas como estava h vinte e cinco
minutos (um dia possui 1.440 minutos). De fato:
select count(*) from alunos;
COUNT(*)
---------20

Infelizmente, existem algumas restries aps habilitar uma janela no


tempo. Esto proibidos quaisquer comandos DDL, execute e mesmo inserts,
updates ou deletes, ou seja, possvel apenas consultar as tabelas. Tantas
limitaes trazem outro inconveniente: a nica forma de recuperar os
dados consiste em criar um Script que entre e saia do modo Flashback50:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.

50

Declare
cursor calunos is
select * from alunos;
v_linha

alunos%rowtype;

BEGIN
delete aux_alunos;
-- O recurso Flashback no pode ser ativado em meio a uma
transao:
commit;
-- Entra no modo Flashback (edite a quantidade de minutos por voltar)
dbms_flashback.enable_at_time (sysdate - 50/1440);
open calunos;
dbms_flashback.disable;
fetch calunos into v_linha ;
while calunos%found loop
insert into aux_alunos values
(v_linha.matricula,
v_linha.nome_aluno,
v_linha.tel_aluno,
v_linha.endereco_aluno,
v_linha.cidade_aluno,
v_linha.uf);
fetch calunos into v_linha ;
end loop;
close calunos;
commit;
END;

O cdigo seguinte encontra-se no arquivo exemplo 21_Recupera_Alunos.sql.

Oracle 9i Fundamental

282

Observaes

A recuperao no precisa acontecer na mesma sesso


responsvel pela perda;
Note como se entrou no modo Flashback apenas para abrir o
Cursor e logo depois voltou-se ao estado normal por meio da
rotina dbms_flashback.disable;
Uma vez concluda a execuo dos comandos anteriores,
possvel recarregar a tabela ALUNOS:
insert into alunos select * from aux_alunos;

21.5 - Gerncia Manual


Estando o parmetro undo_management como MANUAL, ganha-se mais
controle sobre o que acontece no que diz respeito a rollback. Inclusive,
pode-se direcionar a escolha de qual Segmento de Rollback ser utilizado
por uma determinada Transao:
SET TRANSACTION USE ROLLBACK SEGMENT nome

Ainda que no se possa afirmar com toda certeza que o Oracle reservar o
Segmento de Rollback pedido, pode ser uma boa medida quando se busca
mxima performance para tarefas crticas. O desempenho ser melhor, j
que no existir disputa entre transaes pelos Extents.
Um Segmento de Rollback pode ser classificado, segundo sua utilizao.
Ele pode ser pblico, caso possa ser compartilhado entre vrias Instncias
(neste caso a opo Parallel Server deve estar ativa), ou pode ser privativo e
somente ser acessado por uma nica Instncia. Para especificar segmentos
privativos, o nome do Segmento de Rollback deve aparecer no parmetro
rollback_segments.
Ainda existem dois parmetros relevantes relacionados com Segmentos de
Rollback. Veja como listar os trs:
show parameters rollback_segment
NAME
----------------------------------max_rollback_segments
rollback_segments
transactions_per_rollback_segment

TYPE
------integer
string
integer

VALUE
---------37
5

Enquanto o primeiro limita a quantidade de Segmentos, o ltimo restringe


o nmero de transaes por Segmento. Estes valores devem ser deduzidos
aps minuciosos estudos sobre o comportamento transacional do banco.
O comando create rollback segment, detalhado em seguida, permite criar
Segmentos de Rollback.
CREATE [PUBLIC] ROLLBACK SEGMENT nome
TABLESPACE nome

Oracle 9i Fundamental

283

STORAGE
(INITIAL
NEXT
MINEXTENTS
MAXEXTENTS
OPTMAL

inteiro [K | M]
inteiro [K | M]
inteiro
inteiro
[inteiro [K | M] | NULL)

As palavras-chave e os parmetros esto detalhados em seguida:


Nome

Nome do Segmento de Rollback

PUBLIC

Determina que o SR em questo estar disponvel para


qualquer instncia ativa. Caso seja omitida, ele ser privativo e
somente disponvel s instncias que o mencionarem no
parmetro rollback_segments.

TABLESPACE

Nome da Tablespace na qual estar inserido. Recomenda-se


fortemente que exista uma Tablespace exclusiva, j que uma
contendo Segmentos de Rollback ativos no pode ser posta em
estado OFFLINE.
Parmetros de Armazenamento (veja mais detalhes em 20.3).
INITIAL
NEXT

STORAGE
MINEXTENTS

No mnimo devem ser dois para caracterizar uma


lista circular.

MAXEXTENT
S

OPTIMAL

Indica o tamanho final em bytes que o Segmento deve ser


contrado quando houver muitos extents inativos. Isto impede
que o Segmento de Rollback cresa indefinidamente, ou atinja
MAXEXTENTS antes do que se espera.

Note que o parmetro PCTINCREASE no se aplica a Segmentos de


Rollback.

Exemplo
create rollback segment rb17 tablespace rbs;

Observaes

Foram seguidos os valores de Parmetros de Armazenamento da


Tablespace RBS, que j deve ter sido criada previamente;
Alis, RBS no pode ter sido criada com gerenciamento de Extents
Local. Somente permitido criar Segmentos de Rollback em
Tablespaces cujo gerenciamento de Extents seja do tipo Dicionrio;
Uma vez criado, o Segmento de Rollback permanece inativo. Deve-se
emitir o comando:

Oracle 9i Fundamental

284

alter rollback segment rb17 online;

A sintaxe do comando alter rollback segment :


ALTER ROLLBACK SEGMENT nome
[ONLINE | OFFLINE]
STORAGE
(INITIAL
inteiro [K | M]
NEXT
inteiro [K | M]
MINEXTENTS inteiro
MAXEXTENTS inteiro
OPTIMAL
[inteiro [K | M] | NULL)
SHRINK TO inteiro [K | M]

A opo shrink permite contrair manualmente o Segmento de Rollback. Isto


somente no ser possvel, caso existam Extents ativos.
Para mudar o valor de algum parmetro de armazenamento, no
necessrio que o Segmento de Rollback esteja offline, exceto shrink to.
Finalmente, eliminam-se Segmentos de Rollback inativos por meio do
comando drop rollback segment:
alter rollback segment rb17 offline;
drop rollback segment rb17;

Uma das tarefas mais crticas do DBA consiste em acompanhar a evoluo


dos Segmentos de Rollback. O script seguinte mostra diversos dados sobre
Segmentos de Rollback ativos produzindo um SELECT que integra as
vises dinmicas V$ROLLNAME e V$ROLLSTAT com a j conhecida
DBA_ROLLBACK_SEGS:
set linesize 100
column name format a10
select n.name, r.writes, r.wraps, r.shrinks, r.extends,
r.extents, d.max_extents MAX,
d.initial_extent "INITIAL",
d.next_extent "NEXT"
from v$rollname n, v$rollstat r, dba_rollback_segs d
where n.usn = r.usn
and
d.segment_name = n.name;

E uma sada hipottica:


NAME
WRITES
WRAPS
-------- -------- -----SYSTEM
3728
0
RB17
54
0

SHRINKS
------0
0

EXTENDS EXTENTS MAX


INITIAL
NEXT
------- ------- ------ ------------0
7
249
53248
53248
0
2
32765 131072
131072

Alguns termos devem ser esclarecidos:


WRITE

Bytes gravados

SHRINK

Contraes automticas (devido clusula OPTIMAL) ou


manuais

WRAP

Alocao sem expanso


Oracle 9i Fundamental

285

EXTEND Expanses

Vrios aspectos podem ser observados, por exemplo, se houve um nmero


exagerado de expanses, o que pode indicar alto grau de fragmentao.

21.6 - Regras de Ouro para Gerncia Manual


Existem algumas "regras de ouro" que ajudam bastante a gerncia de
Segmentos de Rollback:
1. Crie Segmentos de Rollback de mesmo tamanho, j que
normalmente no se escolhe qual Segmento de Rollback ser
atribudo a uma transao;
2. Nunca se deve criar apenas um grande Segmento de Rollback devido
a problemas de conteno, isto , h o risco de que vrias transaes
fiquem "esperando" a liberao do Segmento de Rollback;
3. Tambm no resulta uma boa prtica criar muitos Segmentos de
Rollback e pequenos. O exagerado nmero de expanses pode
comprometer a performance geral;
4. Evite executar longas consultas em paralelo com extensas
atualizaes. H o risco de acontecer o erro ORA-1555;
5. Transaes longas e crticas devem utilizar Segmentos de Rollback
prprios;
6. Dimensione os Segmentos de Rollback para que um Extent seja
capaz de comportar a maior transao. Alis, esta regra norteia a
SMU.
Quantifique os Segmentos de Rollback para que sejam tantos quantas
forem as transaes simultneas.

21.7 - Enterprise Manager Console


Pelo EMC bastante simples acompanhar o estado dos Segmentos de
Rollback de um banco:

Para criar um novo Segmento de Rollback, clica-se com o boto direito do


mouse em Segmentos de Rollback e escolhe-se Criar:
Oracle 9i Fundamental

286

EXERCCIOS
Antes de realizar os exerccios deste captulo, verifique se h um schema
que possa abrigar tabelas referentes ao Controle Acadmico, direcione a
Tablespace default para Tabelas (criada no captulo 20) e execute o script
21_Monta_Tabelas.sql.
1. Imagine o seguinte cenrio:
a) Comea uma longa consulta C que precisa ler os blocos B1 a B500;
b) Enquanto C estiver lendo o bloco B200, os blocos B300 a B400 so
alterados por outra transao;
c) Quando C chegar a B300, que foi transferido para um Segmento de
Rollback, a transao modificadora encerrada com commit;
d) Enquanto C estiver lendo o bloco B350, uma terceira transao
requere rea de Rollback e os blocos B370 a B390 so cedidos.
Questo: O que acontece com a consulta C?
Erro? Terceira transao tem pedido negado?
2. Comprove que alterando a estrutura de uma tabela cujas linhas desejase recuperar inviabiliza-se o recurso Flashback.
a) Crie uma tabela teste e alimente-a com dados;
b) Anote a hora;
c) Elimine suas linhas e emita um commit;
d) Acrescente-lhe uma coluna;
e) Tente recuperar seus dados a partir do recurso Flashback.
3. Verifique a presena da SMU e, caso exista, desative-a.
Caso seja necessrio alterar a forma pela qual a rea de Rollback
est sendo gerenciada, faa o seguinte:
Oracle 9i Fundamental

287

a) Altere o contedo do parmetro undo_management para


MANUAL;
b) Derrube a instncia e reinicie-a, certificando de faz-lo com a
utilizao do Arquivo texto de parmetros;
c) Constate que o contedo da viso V$UNDOSTAT foi zerado.
4. Crie e ative um Segmento de Rollback, RNOVO, com as seguintes
especificaes:
MINEXTENTS 2
MAXEXTENTS 3
INITIAL
8K
NEXT
8K
5. Inicie uma nova transao e atribua-lhe RNOVO.
Use o comando set transaction.
6. Se j no existir, crie a procedure AlimentaHistorico.
Utilize o script fornecido 21_Alimenta_Historico.sql.
7. Repita o processo: execute a rotina e mostre os Segmentos de Rollback
ativos (21_Mostra_RBS.sql) at que seja emitida a seguinte mensagem:
ERROR at line 1:
ORA-01562: failed to extend rollback segment number 20
ORA-01628: max # extents (3) reached for rollback segment RNOVO
ORA-06512: at "DBAACAD.ALIMENTAHISTORICO", line 5
ORA-06512: at line 1

Oracle 9i Fundamental

288

REFERNCIA RPIDA
Tarefa

Como fazer

Verificar a presena da
SMU
(gerncia
automtica da rea de
Rollback)

Veja o contedo do parmetro undo_management.

Criar um Segmento de
Rollback

Comando create rollback segment


Esta funcionalidade, assim como alterar e excluir,
est disponvel no Enterprise Manager Console, mas
cuidado: SMU deve estar desativada e a Tablespace
destino deve ter gerenciamento de Extents do tipo
Dicionrio.

Alterar um Segmento de
Rollback

Comando alter rollback segment

Eliminar um Segmento
de Rollback

Comando drop rollback segment

Listar Segmentos de
Undo/Rollback ou
informaes afins

Vises: DBA_SEGMENTS, DBA_ROLLBACK_SEGS,


DBA_UNDO_EXTENTS,
V$ROLLNAME,
V$ROLLSTAT, V$UNDOSTAT e V$TRANSACTION

Direcionar a utilizao de
um Segmento de
Rollback quando a SMU
no estiver vigente

Comando:
set transaction use rollback segment nome

Oracle 9i Fundamental

289

ANOTAES

Oracle 9i Fundamental

290

Captulo 22 SEGMENTOS DE TABELA


OBJETIVOS

Compreender a importncia dos Segmentos de Tabela;


Criar, alterar ou eliminar Segmentos de Tabela pelo SQL*Plus
Worksheet;
Acompanhar a utilizao dos Segmentos de Tabela;
Identificar e resolver problemas causados pelo encadeamento
e/ou migrao de linhas;
Trabalhar com os objetos Materialized View e Index-Organized
Table;
Reconhecer a importncia do particionamento de tabelas para a
melhoria dos tempos de acesso;
Habituar-se com a atualizao peridica de estatsticas de
tabelas;
Reorganizar dinamicamente o espao ocupado por uma tabela
graas ao Package embutido DBMS_REDEFINITION;
Manipular Tabelas Externas.

NOVIDADES

O comando ANALYZE TABLE perdeu a importncia de outrora.


Recomenda-se agora atualizar estatsticas via o Package
embutido DBMS_STATS;
O Package embutido DBMS_REDEFINITION permite alterar
dinamicamente caractersticas internas de uma tabela, sem
afetar sua utilizao;
Alm das organizaes HEAP e INDEX, foi acrescentada mais
uma, EXTERNAL. Ela permite que arquivos texto especiais sejam
lidos como se fossem tabelas comuns.

ARQUIVOS NECESSRIOS

21_Alimenta_Historico.sql;
22_Ex_Cria_Tabelas.sql;
22_Ex_Altera_Tabelas.sql;
22_Ex_Materialized_Views.sql;
22_Lista_Extents.sql;
22_Lista_Tamanho_Linhas.sql;
Oracle 9i Fundamental

291

22_Monta_Tabelas_Particoes.sql;
22_Alimenta_Dados.sql;
22_Altera_Tabela_Particoes.sql;
22_Lista_Estatisticas.sql;
22_Redefine_Alunos.sql;
22_Novos_Instrutores.txt;
22_Ex_Tabela_Externa.sql.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;
Desenvolver Triggers bsicos;
Trabalhar com Packages embutidos;
Conhecer o conceito de Tablespace e sua composio;
Criar, alterar, excluir ou listar Tablespaces;
Conhecer o conceito de Segmento e sua composio.

TEORIA
22.1 - Fundamentos
As tabelas de um banco, repositrios de dados, na verdade representam
Segmentos compostos de Extents e estes por Blocos. Por motivos de
desempenho, recomenda-se isolar Segmentos de Tabela em Tablespaces
prprias; inclusive tabelas com nveis de acesso diferentes tambm devem
ser isoladas.
Uma tabela pode ser classificada em:
Aplicao

Tende a ser grande, muito consultada. Aps a carga inicial,


pouqus-simo atualizada. Por exemplo: CEPs.

Negcio

Bastante consultada, atualizao moderada, possui uma taxa


de cresci-mento muito pequena. Por exemplo: Alunos,
Instrutores.

Transacional

Sofre inseres, atualizaes e excluses constantes. Por


exemplo: Histrico.

Segmentos de Tabela so criados com o j conhecido comando create table


que possui uma sintaxe bastante mais ampla do que a j vista: alm da
especificao de campos e constraints, ainda possvel detalhar a
Tablespace, Parmetros de Armazenamento (INITIAL, NEXT, etc. para
aquelas que constarem em Tablespaces com gerncia de Extents baseada
em Dicionrio), que se sobrepem aos definidos na Tablespace hospedeira,
Oracle 9i Fundamental

292

e Parmetros de Utilizao de Espao, que determinam como sero


configurados os blocos da tabela.
A sintaxe ainda simplificada51 do comando mostrada em seguida:
CREATE TABLE [GLOBAL TEMPORARY] nome
(campos, constraints)
[TABLESPACE nome]
[PCTFREE inteiro entre 0 e 100]
[PCTUSED inteiro entre 0 e 100]
[INITRANS inteiro]
[MAXTRANS inteiro]
[STORAGE
(INITIAL inteiro [K | M]
NEXT
inteiro [K | M]
MINEXTENTS inteiro
MAXEXTENTS inteiro
PCTINCREASE
inteiro entre 0 e 100)]
[ORGANIZATION HEAP | INDEX | EXTERNAL]
[ON COMMIT DELETE | PRESERVE ROWS]
[LOGGING | NOLOGGING]
[NOPARALLEL | PARALLEL inteiro]
[PARTITION detalhes de particionamento]

As clusulas esto detalhados em seguida:


Clusula

Detalhes

GLOBAL
TEMPORARY

Informa que a tabela sendo criada ser temporria, isto , os


dados sero visveis apenas sesso que os incluir (ao final da
sesso, a tabela ser limpa). Veja Exemplo 2, em seguida.

Nome

Nome do Segmento de Tabela

Campos,
constraints

Nomes de campos com respectivos tipos e constraints


associados. Veja mais detalhes e exemplos no captulo 2.

TABLESPACE

Nome da Tablespace na qual estar inserida. Se tratar-se de


uma tabela temporria, probe-se esta clusula.

PCTFREE

Nmero inteiro representando a porcentagem de espao


deixado livre para atualizaes de campos com tamanho
varivel (varchar2, nulos).
Para determinar um valor razovel, deve-se analisar o
comportamento da tabela. Se houver muitos campos com
tamanho varivel, recomenda-se um valor maior que 10%. Por
outro lado, se os campos j vierem completos, aconselha-se
um PCTFREE prximo a zero. Default: 10.

51

A sintaxe completa do comando e o detalhamento de todas as clusulas


podem ser encontrados no manual Oracle 9i SQL Reference, Captulo 14.

Oracle 9i Fundamental

293

Clusula

Detalhes

PCTUSED

Nmero inteiro representando a porcentagem de espao


utilizado para armazenamento de dados. Enquanto esse valor
no for atingido, o bloco tratado como livre. Default: 40.
Para tabelas com poucas atualizaes, recomenda-se 80%. J
para tabelas muito atualizadas, aconselha-se 20%.
J Kevin Loney em seu excelente ORACLE 8i DBA HANDBOOK,
na pgina 191, sugere que o valor de PCTUSED somado ao do
PCTFREE seja de 85.

INITRANS

Nmero de transaes por bloco. Cada transao registrada


no cabealho do bloco junto com ponteiros para linhas cujos
dados esto no bloco.
Default: 1. Mximo: 255.

MAXTRANS

Nmero mximo de transaes simultneas acessando o bloco.

STORAGE

Parmetros de Armazenamento utilizados quando a gerncia de


Extents for do tipo Dicionrio (veja mais detalhes em 20.3).
Ao realizar a carga de uma tabela, deve-se procurar, sempre
que razovel, preencher os dados em apenas um Extent.
Expanses devem ser evitadas, calculando valores adequados
para NEXT e PCTINCREASE.
Quando uma tabela atingir dez Extents, significa que o nvel de
fragmentao est alto e deve-se recri-la.
Uma vez alocado espao, nenhum outro Segmento de Tabela o
utiliza at que ocorra um drop table ou truncate table.
O comando truncate table recupera os Extents alocados. Caso
PCTINCREASE seja maior que zero, NEXT volta ao valor
original.

ORGANIZATION

Informa como as linhas da tabela sero organizadas. H trs


possibi-lidades: HEAP (sem nenhuma ordem especfica;
default), INDEX (em forma de ndice - IOT; veja mais detalhes
no item 22.6) ou EXTERNAL (tabela apenas de leitura e
armazenada externamente ao banco; mais detalhes em 22.10).

ON COMMIT

Utilizada exclusivamente para tabelas temporrias. Determina


se as linhas devem ser preservadas at o final da transao
corrente (DELETE) ou da sesso (PRESERVE ROWS).

LOGGING

Determina se a criao da tabela e dos ndices que dela


decorrerem ser registrada no Redo Log File (LOGGING) ou no
(NOLOGGING). Caso no seja informado, busca-se a definio
utilizada na Tablespace hospedeira. Utilizar a opo
NOLOGGING, ainda que acelere a criao, representa um risco,
j que no poder ser recuperada a partir dos Archived Redo
Log Files (mais detalhes no captulo 25).

PARALLEL

Permite a criao da tabela utilizando recursos em paralelo (no


Windows 2000 seriam threads; no Unix, processos).

Oracle 9i Fundamental

294

Clusula

Detalhes

PARTITION

Especifica parties fsicas a serem utilizadas para isolar


grupos de linhas da tabela. Mais detalhes no item 22.7.

Os valores de PCTFREE, PCTUSED, INITRANS e MAXTRANS so


conhecidos como Parmetros de Utilizao de Espao.
Lembre-se que ainda permitido criar tabelas de objetos, como visto no
captulo 17.

Primeiro exemplo52: Recriando a tabela HISTORICO


create table historico
(cod_turma
constraint historico_turma_fk
references turmas (cod_turma),
matricula
constraint historico_aluno_fk
references alunos (matricula),
nota
number (7,2),
constraint historico_pk primary key (cod_turma, matricula))
tablespace users
pctfree 20
pctused 65;

Segundo exemplo: Tabela temporria


create global temporary table lista_chamada
(cod_turma
number(3),
matricula
number(3),
nome
varchar2(30),
instrutor
varchar2(30),
sala
number(2),
nota
number (7,2),
constraint chamada_pk primary key (cod_turma, matricula))
on commit preserve rows;

Observaes

Tabelas temporrias no podem possuir chaves estrangeiras, nem


ser particionadas, nem organizadas como ndice (IOTs) ou serem
externas;
Linhas de tabelas temporrias sempre ficam armazenadas em
Tablespaces temporrias;
Ainda que seu contedo seja voltil (dura por uma transao ou
sesso), a estrutura de campos mantm-se permanente.

22.2 - Alterao de Segmentos de Tabela


52

Os exemplos apresentados
22_Ex_Cria_Tabelas.sql.

em

seguida

constam

Oracle 9i Fundamental

no

arquivo

exemplo

295

A sintaxe ainda simplificada do comando alter table :


ALTER TABLE nome
ADD (campos, constraints)
MODIFY (campos, constraints)
DROP (campo, constraint)
LOGGING | NOLOGGING
PCTFREE inteiro entre 0 e 100
PCTUSED inteiro entre 0 e 100
INITRANS inteiro
MAXTRANS inteiro
STORAGE
(clusulas de armazenamento)
MOVE novo destino
RENAME TO novo nome
ALLOCATE EXTENT (SIZE inteiro [K | M]) | DATAFILE nome
DEALLOCATE UNUSED [KEEP numero [K | M]]

Observe os seguintes pontos:


Lembre-se que o comando alter table j foi utilizado no captulo 2
(item 2.3) e no 16 para habilitar ou desabilitar os Triggers de uma
tabela:
alter table alunos disable all triggers;

Permite-se mudar a Tablespace de origem graas clusula MOVE


(veja exemplo em seguida);
Evite utilizar a clusula NOLOGGING;
No possvel inserir campos no nulos em tabelas com dados, a
no ser que seja utilizado um constraint DEFAULT.
O espao outrora ocupado pelas linhas apagadas de uma tabela no
recuperado. Isto s acontece nos comandos truncate table ou drop table.

Primeiro exemplo53: Alterando parmetros de utilizao de


espao
alter table historico
pctfree 10
pctused 75;

Segundo exemplo: Tabela temporria


alter table lista_chamada drop column sala;

Observao

53

Para que seja possvel a operao anterior, nenhuma sesso pode


ter alimentado a tabela em questo.

Os exemplos apresentados
22_Ex_Altera_Tabelas.sql.

em

seguida

constam

Oracle 9i Fundamental

no

arquivo

exemplo

296

Terceiro exemplo: Movendo uma tabela de uma tablespace para


outra
alter table alunos move tablespace users;

Observaes

O comando anterior somente funciona para tabelas no


particionadas (parties devem ser movidas uma a uma). No
possvel mover tabelas temporrias, nem externas, nem
possuindo campos LOB;
A clusula MOVE deve ser a nica presente;
Uma alternativa clusula MOVE seria export-la, elimin-la,
recriar a estrutura mencionando a nova Tablespace e importar
seus dados a partir do arquivo exportado. O captulo 25 explica
as operaes de importao e exportao;
Uma terceira forma seria criar uma tabela duplicata com create
table ... as select, especificando o novo destino, excluir a original e
renomear a cpia com o nome da original.

22.3 - Identificao de Linhas


Em tabelas cuja organizao seja do tipo HEAP (especificao default da
clusula ORGANIZATION do comando create table), a ordem fsica das
linhas geralmente no obedece ordem de insero. Ainda que elas possam
coincidir em pequenas tabelas, discrepncias tendem a ocorrer aps
muitas excluses e inseres.
Para conhecer o nmero da linha, pode-se utilizar a Pseudocoluna54
ROWNUM ou, de uma forma mais segura, por meio de outra Pseudocoluna,
ROWID. Vejamos alguns exemplos:
select rownum, nome_aluno from alunos
where rownum < 10
order by 2 desc;

Sada:
ROWNUM
-----1
2
3
4
6
5
9
8
7
54

NOME_ALUNO
-----------------------------Zebedeu Silva Hydra
Yamandu Ramos Centaurus
Wellington Libra
Tadeu Perseu
Marcelo Lyra
Luis Eridanus Rios
Jos Neves Gemini
Daniel Auriga
Carla Cassiopeia

No captulo 6, item 6.4 (Sequences) j foram apresentadas duas outras


Pseudocolunas: CURRVAL e NEXTVAL.

Oracle 9i Fundamental

297

Note que ROWNUM representa a ordem em que a linha foi lida, que pode
diferir da ordem em que foi mostrada. Uma costumaz reclamao de DBAs e
programadores acostumados com o Microsoft SQL Server que resolvem
migrar para Oracle a ausncia da clusula TOP no comando SELECT para
retornar as n primeiras linhas.
Por exemplo, o seguinte comando
funcionaria no MS SQL Server, mas no no Oracle:
select top 10 nome_aluno from alunos order by 2 desc

Para o Oracle, obteramos resultado semelhante com o seguinte comando:


select nome_aluno from
(select nome_aluno from alunos order by 1 desc)
where rownum < 11;

Observe que obtm-se as linhas de um conjunto j ordenado, o que garante


o resultado desejado.
Vimos ento que ROWNUM no representa um mecanismo confivel para
retornar a ensima linha fsica de uma tabela. Para isto, utilizamos
ROWID:
select rowid, nome_aluno from alunos
where nome_aluno like 'G%';

Sada:
ROWID
-----------------AAAH3fAAIAAAABiAAR
AAAH3fAAIAAAABiAAU
AAAH3fAAIAAAABiAAV
AAAH3fAAIAAAABiAAW

NOME_ALUNO
-----------------------------Grson Orion
Geraldo Capricornius
Genaro Bootes
Gago Ursa

Infelizmente, os valores de ROWID aparecem codificados conforme o seguinte


critrio:
Do Caractere ...

Significado

1 ao 6

Segmento

7 ao 9

Arquivo

10 ao 15

Bloco

16 ao 18

Linha
bloco

dentro

do

Para traduzir um ROWID, devemos utilizar funes do Package embutido


DBMS_ROWID:
select file_name from dba_data_files
where relative_fno = (select dbms_rowid.rowid_relative_fno (rowid) from alunos where
nome_aluno like 'G%' and rownum = 1);

Sada:
FILE_NAME
-----------------------------------------------------------E:\ORACLE\ORADATA\ACAD9\USERS01.DBF

Oracle 9i Fundamental

298

O Package embutido DBMS_ROWID apresenta outras funes. Vejamos


algumas:
Funo

Resumo

ROWID_BLOCK_NUMBER

Retorna o nmero do bloco em que a linha em


questo est armazenada.

ROWID_ROW_NUMBER

Nmero da linha.

ROWID_TO_ABSOLUTE_F
NO

Nmero absoluto55 do arquivo contendo a linha.

ROWID_TO_RESTRICTED

Exibe um ROWID no formato utilizado previamente


verso 8.

22.4 - Encadeamento de Linhas


Imagine o seguinte cenrio: uma Tablespace que contm trs tabelas
distribudas por 16 blocos:
Blocos

Tabela

Observaes

1a6

Alunos

7 a 10

Cursos

Sexto bloco
ocupado

11 a 14

Instrutore
s
Bloco 14 parcialmente ocupado
Nenhuma

15 e 16

est

parcialmente

Suponha que tenha ocorrido uma insero na tabela CURSOS. Isto causar
a ocupao de parte do dcimo quinto bloco, provocando uma evidente
fragmentao.
Um problema mais grave aconteceria caso houvesse uma alterao que
demandasse mais espao em ALUNOS. Por exemplo, se um VARCHAR2 de
20 bytes fosse modificado para 40, poderiam acontecer dois fatos
indesejveis: toda a linha seria movida para outro bloco (migrao) ou
parte da linha seria gravada em outro bloco (encadeamento). Em qualquer
dos casos, aconteceria uma inconveniente fragmentao.
O destino de parte ou toda a linha alterada poderia ser o final do sexto
bloco ou, pior, o dcimo quinto.
Para listar linhas quebradas, deve-se incialmente executar o script
\oracle\ora92\rdbms\admin\utlchain.sql (ele criar uma tabela de
trabalho deno-minada CHAINED_ROWS). Depois, coletam-se as linhas
encadeadas com o coman-do:

55

Uma importante novidade introduzida na verso 8 a alterao do formato


do ROWID para que sejam contemplados arquivos relativos. Isto permitiu
aumentar drasticamente a capacidade de endereamento de linhas.

Oracle 9i Fundamental

299

analyze table alunos list chained rows;

Para list-las, faa:


select head_rowid from chained_rows
where table_name = 'ALUNOS';

A soluo desse problema acontece em trs etapas:


1. Exportao dos objetos que constam na Tablespace. No caso, as
trs tabelas, mais as que forem dependentes (HISTORICO);
2. Excluso das tabelas;
3. Importao dos dados.
Os detalhes de implementao dos passos 1 e 3 sero vistos no captulo
25.
Quando a tabela possuir chaves estrangeiras apontando para ela, o
cumprimento da segunda etapa causar transtornos, j que inicialmente
devem-se desligar os cons-traints. s vezes, resulta mais prtico exportar
todo o Schema, destru-lo e voltar a import-lo.

22.5 - Materialized Views


Em ambientes em que h necessidade de consultar enormes bases de
dados que tambm esto sendo alteradas, a concorrncia de leituras e
gravaes pode causar srios problemas de performance. Uma bela sada
consiste em criar Materialized Views, capazes de armazenar dados
espalhados por vrias tabelas e ainda contendo agregaes. Ainda existe a
vantagem das atualizaes peridicas (refreshing), o que garante o
sincronismo entre as bases consultadas e atualizadas.
O exemplo seguinte revela como criar uma Materialized View atualizada sob
demanda56:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

create materialized view mv_instrutores


build immediate
Refresh
complete on demand
As
select nome_instrutor, nome_curso, count(*) Alunos
from instrutores i , turmas t, cursos c, historico h
where i.cod_instrutor = t.cod_instrutor
and t.cod_curso = c.cod_curso
and t.cod_turma = h.cod_turma
group by nome_instrutor, nome_curso;

Observaes

56

As tabelas que alimentam uma Materialized View so ditas master


tables;

O exemplo consta no arquivo 22_Ex_Materialized_Views.sql.

Oracle 9i Fundamental

300

Em vez da opo IMMEDIATE (linha 2), poder-se-ia utilizar


DEFERRED e os dados somente seriam inseridos na primeira
atualizao;
Automatiza-se a atualizao dos dados utilizando a clusula ON
COMMIT em vez de ON DEMAND (linha 4). Tambm possvel
determinar uma periodicidade, digamos semanal, na atualizao:
refresh fast next sysdate + 7

Aps a criao, deve-se informar ao Otimizador de Queries que h


um novo recurso que pode ser utilizado. Isto deve ser feito via
Package embutido DBMS_STATS, como visto no prximo item;

Curiosamente, a sintaxe padro SQL-92 contendo clusulas join foi


rechaada.

Uma vez criadas, as consultas sero muito mais eficientes j que no existe
necessidade de realizar joins ou agregaes:
select * from mv_instrutores order by Alunos;

Alterada a base, atualiza-se a Materialized View com uma chamada ao


Package embutido DBMS_MVIEW:
begin
dbms_mview.refresh('MV_INSTRUTORES');
end;
/

22.6 - Index-Organized Tables (IOTs)


Tabelas muito consultadas em base a valores exatos ou intervalos so belas
candidatas a uma organizao alternativa. Em vez da tradicional HEAP em
que no h uma ordem especfica para as linhas, h necessidade de
estruturas de ndice separadas para acelerar o acesso e as linhas so
identificadas via ROWID, pode-se utilizar a opo INDEX na clusula
ORGANIZATION do comando create table. Cria-se, na verdade, um objeto
hbrido denominado IOT (Index-Organized tables), em que tanto chaves
como dados esto em uma mesma estrutura de rvore-B.
Uma decorrncia interessante dessa organizao consiste na insero
ordenada. Por exemplo, imagine uma IOT possuindo milhares de linhas e
contendo a chave primria baseada em um campo alfanumrico. Ao
acontecerem incluses, ser necessrio abrir espao para que as novas
linhas possam entrar. Isto, evidentemente, causar problemas de
performance.
Concluindo, IOTs representam um recurso adequado para tabelas muito
consultadas e pouco atualizadas. E, de preferncia, as buscas devem
basear-se nos campos da chave primria, esta, alis, de presena
obrigatria.
Oracle 9i Fundamental

301

Suponha que desejssemos criar uma tabela que guardasse os CEPs de


todos os logradouros do pas. Claramente, uma vez carregada, sofreria
poucas alteraes. Ento:
create table ceps (
cep
char(10) primary key,
uf
char(2),
municipio varchar (20),
logradouro
varchar (40))
organization index
tablespace users;

Observaes

Por ser essencialmente uma tabela, um IOT, podem-se utilizar os


comandos insert, update, delete, etc. Inclusive, podemos
acrescentar chaves estrangeiras ou novos ndices a outros
campos que no estejam na chave primria;
Como no h ROWID, demanda-se menos espao;
Resulta impossvel alterar a organizao interna de uma tabela
HEAP para IOT e vice-versa. Para realizar esta tarefa, devem-se
exportar as linhas, eliminar a tabela, recri-la sob nova
organizao e importar as linhas;
Curiosamente, o parmetro de utilizao de espao PCTUSED
no pode ser utilizado em IOTs. O mesmo ocorre em ndices,
como veremos no captulo seguinte.

22.7 - Parties
Quando uma tabela muito grande possui crescimento desordenado, isto ,
alguns trechos sofrem inseres em ritmos diferentes de outros, convm
particion-la. Imagine que a tabela ALUNOS apresente o seguinte
comportamento:

Cariocas so inseridos taxa de 1.000 ao ms;


Alguns paulistas so inseridos e outros eliminados;
Mineiros e capixabas so apenas consultados.

Para minimizar os problemas causados pela fragmentao e melhorar o


tempo de resposta geral, podemos dividir uma tabela em diversas parties,
cada uma ocupando uma Tablespace prpria.
Por exemplo, a tabela Alunos poderia ser criada da seguinte maneira57:
create table alunos
(matricula
number(3)
57

constraint alunos_pk primary key,

O comando seguinte encontra-se


tambm criam-se as Tablespaces.

em

22_Monta_Tabelas_Particoes.sql.

Oracle 9i Fundamental

302

nome_aluno
varchar2(30) constraint alunos_nome_nu not null,
tel_aluno
varchar2(10),
endereco_aluno varchar2(30),
cidade_aluno
varchar2(20) default 'Rio de Janeiro',
uf
char(2)
default 'RJ' constraint alunos_uf_ch
check (uf in ('SP', 'MG', 'RJ', 'ES')))
partition by range (uf)
(partition p1 values less than ('L')
-- capixabas
tablespace capixabas pctused 80 pctfree 5,
partition p2 values less than ('Q')
-- mineiros
tablespace mineiros pctused 80 pctfree 5,
partition p3 values less than ('RZ')
-- cariocas
tablespace cariocas pctused 30 pctfree 55,
partition p4 values less than (maxvalue)
-- paulistas
tablespace paulistas pctused 50 pctfree 35);

Observaes

Para que seja possvel criar parties, deve-se checar a presena


da opo de particionamento. Isto pode ser comprovado no
cabealho do SQL*Plus58:
Conectado a:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 Production

As parties representam, na verdade, segmentos. Isto pode ser


comprovado pelo comando apresentado em seguida:
select segment_name, segment_type, tablespace_name
from dba_segments
where owner = 'DBAACAD'
and segment_type IN ('TABLE','TABLE PARTITION')
order by 2;

Sada:
SEGMENT_NAME
-----------------------------
ALUNOS
ALUNOS
ALUNOS
ALUNOS

SEGMENT_TYPE
TABLESPACE_NAME
------------------ -----------------TABLE
TABLE
TABLE
TABLE

PARTITION
PARTITION
PARTITION
PARTITION

CAPIXABAS
MINEIROS
CARIOCAS
PAULISTAS

Note com os valores dos parmetros de utilizao de espao


(PCTFREE e PCTUSED) foram estipulados segundo as
caractersticas de utilizao de cada partio.

Uma vez alimentadas as tabelas59, para visualizar os dados de apenas uma


partio, poderamos emitir o comando:
select nome_aluno, uf from alunos partition(p2);
58

59

Trata-se do mesmo SQL*Plus Worksheet, porm utilizando uma interface mais


rude. Mais detalhes no Apndice A.
Alimente as tabelas utilizando o script 22_Alimenta_Dados.sql.

Oracle 9i Fundamental

303

NOME_ALUNO
-----------------------------Tadeu Perseu
Luis Eridanus Rios
Jos Neves Gemini

UF
-MG
MG
MG

A insero ou excluso de linhas no sofre alteraes quando a tabela


particionada; entretanto, devem-se evitar alteraes (UPDATE) no campochave da partio, neste caso, UF.
Uma nova partio poderia ser acrescentada60:
alter table alunos
split partition p1 at ('C')
into
(partition p11 tablespace baianos,
partition p12 tablespace capixabas);

Evidentemente, deve-se criar previamente a Tablespace Baianos e tambm


alterar a restrio sobre o campo UF para que aceite alunos da Bahia.
Comprovando:
select partition_name, tablespace_name
from user_tab_partitions
where table_name = 'ALUNOS';
PARTITION_NAME
TABLESPACE_NAME
------------------------------ ---------------------P2
MINEIROS
P3
CARIOCAS
P4
PAULISTAS
P11
BAIANOS
P12
CAPIXABAS

Antes de inserir alunos baianos, devemos reconstruir a chave primria de


Alunos:
alter table historico drop constraint HISTORICO_aluno_fk;
alter table alunos drop constraint alunos_pk;
alter table alunos add constraint alunos_pk primary key(matricula);
insert into alunos
(matricula, nome_aluno, tel_aluno, endereco_aluno, uf, cidade_aluno)
values (32, 'Vitria Vulpecula', '322-6432',
'R. do Farol, 100 casa 2', 'BA', 'Salvador');
alter table historico add constraint historico_aluno_fk
foreign key (matricula) references alunos (matricula);

Comprovando a insero:
select nome_aluno, uf from alunos partition(p11);
NOME_ALUNO
UF
------------------------------ -Vitria Vulpecula
BA

60

O comando apresentado em seguida, alm do que cria a Tablespace para


os baianos, encontra-se em 22_Altera_Tabela_Particoes.sql.

Oracle 9i Fundamental

304

Uma partio pode ser excluda sempre e quando no existam referncias


tabela:
alter table alunos drop partition p11;
alter table alunos drop partition p11
*
ERRO na linha 1:
ORA-02266: chaves exclusiva/primria na tabela referenciadas por chaves externas
ativadas

22.8 - Estatsticas
Durante a anlise de um select, o Otimizador de queries do Oracle
precisa decidir rapidamente o melhor caminho. Ser que vale a pena
utilizar um determinado ndice? Ou talvez uma combinao de outros dois?
Ou ser que uma varredura completa na tabela (Full Table Scan) seria
mais adequada?
Estas questes giram, invariavelmente, em torno de um ponto
crucial: o volume. Se a tabela for grande, utilizam-se ndices, seno,
prefere-se uma varredura nos prprios dados (isto se no se tratar de uma
IOT, j que, neste caso, percorrer a tabela ou o ndice da chave primria d
no mesmo).
Mas, durante a avaliao de um comando, simplesmente no h
tempo de verificar o montante de linhas processadas. Por isso, existem as
estatsticas que consistem em nmeros que revelam a distribuio das
chaves e a seletividade (quantas vezes uma determinada chave aparece
repetida).
Estatsticas devem ser geradas aps significativas alteraes no
volume de dados, alterao na estrutura ou em algum ndice. A frequncia
de atualizao deve ser compatvel com o nvel de atualizaes de uma
tabela, ou seja, tabelas apenas consultadas devem ter suas estatsticas
coletadas uma vez preenchidas. J aquelas tabelas muito alteradas devem
ter suas estatsticas atualizadas de forma recorrente.
At a verso 8i o comando responsvel pela gerncia de estatsticas
era o analyze table. A partir da 8i e principalmente na 9i, recomenda-se
enfaticamente a utilizao do Package embutido DBMS_STATS. Ele coleta e
gerencia estatsticas de uma coluna, ndice, tabela ou Schema.
Imagine que a tabela ALUNOS tenha acabado de ser carregada, entretanto
o otimizador parece no saber disto...
select num_rows from dba_tables where table_name = 'ALUNOS';
NUM_ROWS
----------

Atualizando as estatsticas:
begin
Oracle 9i Fundamental

305

dbms_stats.gather_table_stats('dbaacad', 'alunos');
end;
/

E agora:
select num_rows from dba_tables where table_name = 'ALUNOS';
NUM_ROWS
---------32

Em vez da tabela ALUNOS, poderamos coletar estatsticas da


Materialized View criada recentemente. H outras rotinas para coleta de
estatsticas semelhantes utilizada anteriormente:

GATHER_INDEX_STATS
GATHER_SCHEMA_STATS
GATHER_DATABASE_STATS
GATHER_SYSTEM_STATS

Uma forma mais elegante de exibir estatsticas consiste em utilizar a rotina


GET_TABLE_STATS:61
create or replace procedure lista_linhas
is
linhas number;
blocos number;
media number;
begin
dbms_stats.get_table_stats ('dbaacad', 'alunos',null, null, null, linhas, blocos,
media);
dbms_output.put_line('Linhas: ' || to_char(linhas));
dbms_output.put_line('Blocos: ' || to_char(blocos));
end;
/

Ativando:
execute lista_linhas

Sada:
Linhas: 32
Blocos: 5

Outras rotinas desempenham papel semelhante:

61

GET_COLUMN_STATS
GET_INDEX_STATS
GET_SYSTEM_STATS

A rotina apresentada em seguida se encontra em 22_Lista_Estatisticas.sql.

Oracle 9i Fundamental

306

22.9 - Reorganizao
Uma proposta marcante da verso 9i consiste em aumentar ao mximo a
disponibilidade dos dados, isto , permitir que o DBA realize suas tarefas
de manuteno sem afetar os tempos de acesso s tabelas. Antes da
verso 9i, tarefas como alteraes na estrutura da tabela (campos,
constraints, Triggers, parmetros de armazenamento, parties etc.),
criao de ndices ou at mesmo atualizao de estatsticas eram
impensveis enquanto houvesse algum usurio acessando dados.
Graas ao novo pacote embutido DBMS_REDEFINITION, permite-se
minimizar o intervalo de tempo necessrio para bloquear a tabela. Deve-se
frisar, entretanto, que o processo de natureza DDL, ou seja, no h como
alterar dados presentes na tabela de origem.
O desafio consiste em alterar parmetros de utilizao de espao
(PCTFREE, PCTUSED) de uma partio, adicionar uma nova coluna
(DATA_NASC), acrescentar um constraint (impedir o cadastro de alunos
com menos de 15 ou mais de 100 anos) e desenvolver um trigger (atualiza
uma tabela auxiliar) sobre a tabela ALUNOS. Seguiremos o seguinte roteiro:
1. Utilizando a rotina CAN_REDEF_TABLE verificaremos se a tabela em
questo pode ser processada. Caso ela no possua chave primria ou
faa parte de uma Materialized View, no poder ser trabalhada por
DBMS_REDEFINITION;
2. Criaremos uma tabela intermediria idntica a ALUNOS. Ela ser o alvo
das mudanas e quando o processo estiver concludo, tomar o lugar da
original;
3. Preencheremos a tabela intermediria com dados a partir da rotina
START_REDEF_TABLE;
4. Realizaremos as alteraes previstas sobre a tabela intermediria;
5. Sincronizaremos as tabelas original e intermediria. Isto benfico para
descarregar as atualizaes de dados ocorridas na principal. Lembrese que centenas de usurios estaro realizando comandos DML (insert,
update, delete) sobre a tabela original;
6. Trocaremos a principal pela intermediria. Durante este passo,
geralmente curto, a tabela original ficar bloqueada;
7. Eliminaremos a antiga tabela principal.

22.9.1 - Testando Viabilidade do Processo


Antes mesmo de iniciar o processo, convm criar uma tabela teste
com um subconjunto representativo de linhas e aplicar-lhe os passos
seguintes. Isto far com que eventuais erros que ocorram durante as
alteraes na tabela possam ser corrigidos. Uma vez azeitado o roteiro,
pode-se aplic-lo na tabela de produo.
Oracle 9i Fundamental

307

Tendo certeza de que o roteiro ser cumprido risca, iniciamos o


processo. Inicialmente, deve-se verificar se ALUNOS pode ser redefinida:
exec dbms_redefinition.can_redef_table ('DBAACAD', 'ALUNOS');

Caso nenhum erro surja do comando apresentado, seguimos em frente.

22.9.2 - Criao da Tabela Intermediria


Neste passo ser criada uma rplica da tabela original denominada
INTERIM. Ela deve possuir os mesmos campos, constraints, Triggers, etc.
(linhas ainda no). Infelizmente, ela deve estar no mesmo Schema da
original, portanto constraints e Triggers devem ser renomeados.
O comando de criao, alm dos outros utilizados neste tpico, esto no
script 22_Redefine_Alunos.sql. Observe os novos nomes de constraints.
Perceba que l existem parties. Inclusive, a criao delas poderia ter
acontecido sob patrocnio de DBMS_REDEFINITION.

22.9.3 - Preenchimento dos Dados


Uma vez criada a rplica, ela deve receber os dados da principal.
Dependendo do volume dos dados, isto pode causar um srio impacto na(s)
tablespace(s) hospedeira(s):
exec dbms_redefinition.start_redef_table ('DBAACAD', 'ALUNOS', 'INTERIM');

A partir deste momento, quaisquer inseres, atualizaes ou excluses


sobre a tabela ALUNOS sero guardadas para que possam ser reaplicadas
ao final do processo de redefinio. Caso o volume de transaes seja muito
extenso, podem-se realizar sincronismos peridicos, como veremos na
quinta etapa.

22.9.4 - Novas Caractersticas


Inicialmente sero alterados os parmetros de utilizao de espao da
partio dos capixabas:
alter table interim modify partition p12 pctfree 25 pctused 40;

Observe que a tabela alvo INTERIM e no ALUNOS! A seguir, acrescentase um novo campo:
alter table interim add peso number(3) null;

Um novo constraint:
alter table interim
add constraint alunos_peso_ch2
check (peso between 20 and 200);

E, finalmente, o trigger:
Oracle 9i Fundamental

308

create or replace trigger t_aft_row_Alunos2


after insert
on interim
for each row
declare v_faixa number(3);
begin
if :new.peso <= 50 then v_faixa := 50;
elsif :new.peso <= 80 then v_faixa := 80;
elsif :new.peso <= 100 then v_faixa := 100;
else v_faixa := 200;
end if;
update faixas_peso set quantos = quantos + 1
where faixa = v_faixa;
end;

A criao e o preenchimento da tabela FAIXAS_PESO esto no arquivo


22_Redefine_Alunos.sql.

22.9.5 - Sincronismo
Imagine que, durante o processo, dezenas de transaes envolvendo
a tabela ALUNOS foram executadas. Suponha que dois novos cariocas
tenham sido inseridos:
insert into alunos (matricula, nome_aluno) values (50, 'Leonardo Guimares Terra');
insert into alunos (matricula, nome_aluno) values (51, 'Thiago Guimares Terra');
commit;

Aplicando o sincronismo para que a etapa final no seja muito demorada:


exec dbms_redefinition.sync_interim_table ('DBAACAD', 'ALUNOS', 'INTERIM');

Agora, ambas tabelas possuem a mesma quantidade de linhas novamente.

22.9.6 - Troca de Tabelas


Uma vez concluda a etapa de mudanas e realizado o sincronismo, chegou
final-mente a hora de aplicar as alteraoes na tabela principal:
exec dbms_redefinition.finish_redef_table ('DBAACAD', 'ALUNOS', 'INTERIM');

Observe que o comando seguinte vlido:


select count(peso) from alunos;

Entretanto, ele provocar um erro:


select count(peso) from interim;

22.9.7 - Eliminao
A tabela intermediria, que agora est como era ALUNOS antes do
processo, pode ser tranquilamente (?) eliminada:
drop table interim;

E a terrvel sada:
Oracle 9i Fundamental

309

ERRO na linha 1:
ORA-02449: chaves primrias/exclusivas na tabela referenciadas por chaves
externas

O que aconteceu? Ora, o processo funciona esplendidamente para a tabela


sendo alterada, mas o que dizer quanto s relacionadas? A tabela
HISTORICO, por incrvel que parea, ainda aponta para INTERIM. Isto no
chega a ser um drama, naturalmente:
Basta eliminar a chave estrangeira:
alter table historico drop constraint historico_aluno_fk;

E voltar a cri-la:
alter table historico add constraint historico_aluno_fk
foreign key (matricula) references alunos (matricula);

22.10 - Tabelas Externas


Uma importante novidade introduzida pela verso 9i foi a possibilidade de
acessar dados que estejam em arquivos textos com se fossem tabelas do
banco. Trata-se de um timo recurso a ser utilizado como etapa prvia
completa migrao de dados legados, ou seja, que estejam fora do Oracle.
Antes de qualquer acesso externo, deve-se informar ao Oracle algum
diretrio vlido de onde arquivos possam ser lidos. Isto acontece via
comando create directory62 cuja utilizao poderia ser:
create directory fonte as 'E:\LivroO9\Scripts\ParteIII';

A seguir, cria-se uma tabela espelho que seja uma imagem do arquivo
texto:
create table instrutores_externos
(cod_instrutor
number,
nome_instrutor
char(30))
organization external
(type oracle_loader
default directory fonte
access parameters
(
records delimited by newline
fields terminated by ","
(
cod_instrutor
integer external,
nome_instrutor
char
)
)
location ('22_novos_instrutores.txt')
)

Observaes
62

Os exemplos deste tpico esto em 22_Ex_Tabela_Externa.sql.

Oracle 9i Fundamental

310

A tabela criada somente pode ser lida;


Os parmetros que identificam a fonte seguem o padro adotado
pela ferramenta SQL*Loader;
Analise o contedo do arquivo 22_Novos_Instrutores.txt e constate
como a organizao dos campos deve coincidir com a tabela espelho.

Uma vez criada, a tabela pode ser lida como outra qualquer:
select * from instrutores_externos

E a sada:
COD_INSTRUTOR
------------1
2
3
4
5
6
7

NOME_INSTRUTOR
-----------------------------Juan Ignacio Sequeira
Felipe Terra Campos
Nicolas Sequeira
Rafael Terra Campos
Martin Sequeira
Antonio La Manna
Valentina La Manna

EXERCCIOS
1. Recrie a tabela HISTORICO, conforme os seguintes parmetros:
PctFree e PctUsed: 10 e 40.
Essa tabela tem propenso fragmentao?
2. Insira centenas de registros na tabela recm-criada.
Utilize a rotina AlimentaHistorico criada a partir do script
21_Alimenta_Historico.sql.
3. Verifique o espao ocupado.
Investigue DBA_FREE_SPACE.
4. Analise o seguinte comando e explique sua utilidade.
select dbms_rowid.rowid_to_restricted (rowid, 0)
from alunos
where nome_aluno like 'Z%';

O formato ROWID em verses prvias 8 possui trs partes:


nmero do bloco (caracteres 1 ao 8), linha dentro do bloco (9 ao
12) e nmero do arquivo (trs ltimos).

5. Certifique-se de que a tabela ALUNOS est particionada e monte uma


consulta que revele quantas linhas da tabela h por arquivo.
O join associar DBA_DATA_FILES e ALUNOS. Eles esto unidos,
pois o campo FILE_ID
da primeira est relacionado com
DBMS_ROWID_
RELATIVE_FNO da segunda. Lembre-se que a funo pede um
ROWID...
Oracle 9i Fundamental

311

6. Quando acontecem problemas de fragmentao e linhas encadeadas?


Como resolv-los?
7. Abra o script 22_Lista_Extents.sql. Analise-o cuidadosamente e depois
execute-o.
8. Abra
o
script
22_Lista_Tamanho_Linhas.sql.
cuidadosamente e depois execute-o.

Analise-o

9. Abra o script 22_Monta_Tabelas_Particoes.sql. Analise-o cuidadosamente e crie uma nova tabela de cursos particionada por carga
horria.
10.

Atualize as estatsticas de seu Schema.


Utilize a rotina GATHER_SCHEMA_STATS presente no Package
embutido DBMS_STATS.

11.
Abra o script 22_Lista_Estatisticas.sql. Generalize a rotina para
que seja possvel listar estatsticas de qualquer tabela.
12.
Neste exerccio, voc comprovar que quanto maior o valor de
PCTFREE, ocorrem menos inseres por bloco e, portanto, h mais
blocos.
Siga o roteiro:
a) Emita o comando truncate table sobre a tabela HISTORICO;
b) Anote os valores de PCTFREE e PCTUSED:
PCTFREE

c) Carregue 620 linhas em HISTORICO.


Caso a rotina ainda no
21_Alimenta_Historico.
Para inserir 620 alunos, faa:

PCTUSED

exista,

execute

script

exec AlimentaHistorico (20,31);

d) Emita o comando apresentado em seguida para que os valores de


USER_TABLES possam ser atualizados:
begin
dbms_stats.gather_table_stats('dono', 'HISTORICO');
end;

e) Anote o nmero de linhas, blocos e linhas por bloco da tabela


HISTORICO:
select num_rows, blocks, num_rows/blocks
from user_tables where table_name = 'HISTORICO';

Uma provvel sada seria:

Oracle 9i Fundamental

312

NUM_ROWS
BLOCKS NUM_ROWS/BLOCKS
--------- --------- --------------620
4
155

Se preferir, utilize a rotina desenvolvida no exerccio 11.


a) Emita novamente o comando truncate table sobre a tabela
HISTORICO;
b) Altere o valor de PCTFREE para 60;
c) Alimente novamente a tabela com 620 linhas, atualize as
estatsticas e repita a consulta do item e.
13.
Certifique-se de que a Materialized View MV_INSTRUTORES existe e
constate que a tabela INSTRUTORES no pode ser trabalhada com
DBMS_REDEFINITION.
Utilize a rotina CAN_REDEF_TABLE presente no Package
embutido DBMS_REDEFINITION.
14.
Aprimore o roteiro descrito em 22.9 acrescentando Triggers que
prevejam atualizaes de pesos ou excluso de alunos.

Oracle 9i Fundamental

313

REFERNCIA RPIDA
Tarefa

Como fazer

Criar um Segmento de
Tabela

Comando create table

Alterar um Segmento de
Tabela

Comando alter table

Eliminar um Segmento de
Tabela

Comando drop table

Listar Segmentos de Tabela


ou informaes afins

Vises: DBA_SEGMENTS, DBA_TABLES,


DBA_EXTENTS, DBA_FREE_SPACE

Listar informaes sobre


parties

Vises: DBA_TAB_PARTITIONS,
USER_TAB_PARTITIONS,
ALL_TAB_PARTITIONS

Gerar estatsticas

Pacote embutido DBMS_STATS, rotinas


GATHER_XXX_STATS, em que XXX pode ser
INDEX, TABLE, SCHEMA, DATABASE ou
SYSTEM.

Listar estatsticas

Viso DBA_TABLES ou Pacote embutido


DBMS_STATS, rotinas GET_XXX_STATS, em que
XXX pode ser INDEX, TABLE, COLUMN, ou
SYSTEM.

Eliminar estatsticas

Pacote embutido DBMS_STATS, rotinas


DELETE_XXX_STATS, onde XXX pode ser
COLUMN, INDEX, TABLE, SCHEMA, DATABASE
ou SYSTEM.

Efetuar alteraes
estruturais em uma tabela
sem impactar os acessos

Utilize as rotinas do Package embutido


DBMS_REDEFINITION descritas no item 22.9. Se
for necessrio o cancelamento do processo, faa:
exec dbms_redefinition.abort_redef_table ('dono',
'principal', 'auxiliar');

Criar uma tabela externa

Inicialmente crie um objeto DIRECTORY, depois


execute o CREATE TABLE com ORGANIZATION
EXTERNAL e contendo parmetros de localizao
do arquivo-fonte.

Oracle 9i Fundamental

314

Captulo 23 SEGMENTOS DE NDICE


OBJETIVOS

Compreender a importncia dos Segmentos de ndice;


Criar, alterar ou eliminar Segmentos de ndice pelo SQL*Plus
Worksheet;
Conhecer a estrutura de ndices rvore-B e Bitmap;
Acompanhar a utilizao dos Segmentos de ndice;
Trabalhar com parties.

NOVIDADES

A nova viso V$OBJECT_USAGE e o novo Package embutido


DBMS_METADATA auxiliam na tarefa de eliminar ndices pouco ou
nada utilizados.

ARQUIVOS NECESSRIOS

23_Ex_Cria_Indices.sql;
23_Ex_Gera_DDL.sql;
23_Monta_Indice_Particoes.sql;
23_Recria_Indices.sql.

PR-REQUISITOS

Dominar comandos SQL dos tipos DDL, DML e DCL;


Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;
Conhecer o conceito de Tablespace e sua composio;
Criar, alterar, excluir ou listar Tablespaces;
Conhecer o conceito de Segmento e sua composio;
Conhecer Segmentos de Tabela e suas variaes, tais como: IOTs
e Materialized View.

TEORIA
23.1 - Fundamentos
Vimos no captulo 6 que ndices representam estruturas auxiliares com
nico intuito de acelerar os tempos de acesso a dados de uma tabela. Foi

Oracle 9i Fundamental

315

visto tambm que prejudicam outras operaes, tais como: inserts, deletes e
updates; da o cuidado que se deve ter ao cri-los.

Sempre que o Oracle cria um ndice, seja de forma automtica devido a


constraints PRIMARY KEY e UNIQUE ou explcita por meio do comando
create index, aloca-se, na verdade, um Segmento de ndice.
Segmentos de ndice podem ser classificados quanto unicidade dos
dados:
Unique

Valores nicos. Exemplo: constraints que resultam de chaves


primrias.

Non-Unique

Aceita valores duplicados.

Quanto composio, ndices podem ser dos tipos:

Compostos

Mais de um campo. Em um comando select que faa filtros de


linha ou ordenaes que utilizem campos pertencentes a
ndices compostos, deve-se colocar a coluna mais utilizada
primeiro.

Simples

Um campo apenas.

O comando create index possui uma sintaxe bem mais ampla do que a
discutida na primeira parte do livro: alm da especificao de campos,
ainda possvel detalhar a Tablespace, Parmetros de Armazenamento
(INITIAL, NEXT, etc. para aquelas que constarem em Tablespaces com
gerncia de Extents baseada em Dicionrio), que se sobrepem aos
definidos na Tablespace hospedeira, e Parmetros de Utilizao de Espao,
que determinam como sero configurados os blocos do ndice.
A sintaxe ainda simplificada do comando mostrada em seguida:
CREATE [UNIQUE | BITMAP] INDEX nome
ON tabela (campo1 ASC|DESC, ..., campoN ASC|DESC)
[TABLESPACE nome]
[PCTFREE inteiro entre 0 e 100]
[INITRANS inteiro]
[MAXTRANS inteiro]
[STORAGE
(INITIAL
inteiro [K | M]
NEXT
inteiro [K | M]
MINEXTENTS
inteiro
MAXEXTENTS
inteiro
PCTINCREASE
inteiro entre 0 e 100)]
[LOGGING | NOLOGGING]
[NOSORT]
[NOPARALLEL | PARALLEL inteiro]
[PARTITION detalhes de particionamento]

As palavras-chave e os parmetros esto detalhados em seguida:


Clusula

Detalhes

Nome

Nome do Segmento de ndice.

Oracle 9i Fundamental

316

Clusula

Detalhes

UNIQUE

Indica no duplicidade de valores. Podem existir vrios valores


nulos.

BITMAP

No utiliza rvores-B e sim uma estrutura alternativa. Indicada


para tabelas muito grandes, muito consultadas e pouqussimo
atualizadas. Esta clusula no pode ser utilizada junto com a
UNIQUE.

Tabela

Nome da tabela qual o ndice estar associado. Um ndice


pertence a apenas uma tabela.

Campos

Nomes de campos que constituiro as chaves. Se houver mais


de um, trata-se de um ndice Composto.

ASC | DESC

Ordenao ascendente ou descendente. A escolha de uma ou


outra opo depende de como acontecem as consultas sobre o
campo.

TABLESPACE

Nome da Tablespace na qual estar inserido o Segmento de


ndice sendo criado.

Parmetros de
Utilizao de
Espao

Idem Segmentos de Tabela (veja 22.1), com exceo de


PCTUSED, no utilizado.

STORAGE

Parmetros de Armazenamento utilizados quando a gerncia de


Extents for do tipo Dicionrio (veja mais detalhes em 20.3).
Valem as mesmas dicas aplicadas a tabelas quanto utilizao
de Extents (veja 22.1)
Uma vez alocado espao, nenhum outro Segmento de ndice o
utiliza at que ocorra um drop index.

LOGGING |
NOLOGGING

Idem Segmentos de Tabela (veja 22.1).

NOSORT

Acelera o processo de criao do ndice, pois assume que os


dados estejam ordenados crescentemente de acordo com as
chaves. Caso a ordenao no exista, ocorrer um erro. Indicase esta opo ao criar um ndice para uma tabela recmpreenchida e com ordenao conhecida.

PARALLEL |
NOPARALLEL

Idem Segmentos de Tabela (veja 22.1).

PARTITION

Detalhes de particionamento. Veja 23.5.

Primeiro exemplo63: ndice composto


create index CursoInstrutor_Turmas_idx
on Turmas
(cod_curso asc, cod_instrutor desc)
tablespace academicas
pctfree 20;

63

Os exemplos seguintes constam no arquivo exemplo 23_Ex_Cria_Indices.sql.

Oracle 9i Fundamental

317

Observaes
Seguindo os conselhos da OFA (captulo 20, item 20.2), seria
aconselhvel gravar ndices em uma Tablespace prpria. Isto ser
realizado na seo de Exerccios deste captulo;
Para listar os ndices de uma tabela, faa:
select index_name, tablespace_name
from ind
where table_name = 'TURMAS';
INDEX_NAME
-----------------------------CURSOINSTRUTOR_TURMAS_IDX
TURMAS_PK

TABLESPACE_NAME
-----------------------------ACADEMICAS
ACADEMICAS

Uma vez criado e aps substanciais alteraes no volume de dados da


tabela associada, convm atualizar as estatsticas do ndice:
begin
dbms_stats.gather_index_stats('dbaacad',
'cursoinstrutor_turmas_idx');
end;

Para facilitar a compreenso do Banco de Dados, recomenda-se


enfaticamen-te seguir uma conveno rgida que dite normas quanto
denominao de ndices. Qual deve ser seguida, no importa. O
que vale a presena de uma e segui-la fielmente;
No se pode criar um ndice sobre um campo ou conjunto de campos
que j estejam indexados, seja de forma implcita (via constraints),
seja explicita-mente via create index.

Segundo exemplo: Campo calculado


create index NomeMaiusculo_Instrutores_idx
on Instrutores (upper(nome_instrutor))
tablespace academicas;

Observaes

O ndice recm-criado ajudaria em buscas do tipo:


select *
from instrutores
where upper(nome_instrutor) = 'CAMELOPARDALIS VIEIRA';

Vale ressaltar que a criao do ndice teria sucesso mesmo que j


existisse outro ndice ou mesmo constraint sobre o campo
NOME_INSTRUTOR.
Oracle 9i Fundamental

318

Terceiro exemplo: IOT


create index UF_CEPs_idx
on ceps (uf)
tablespace academicas;

Observao

CEPS foi criada no captulo anterior e possui uma organizao


distinta da padro. Trata-se de uma Index-Organized Table (veja
22.6 para obter mais detalhes).

23.2 - Organizao Interna


Vimos na sintaxe do comando create index que um ndice pode ser
organizado de duas maneiras: em forma de rvore-B (B*tree) ou como um
mapa de bits (bitmap). Vejamos detalhes de cada uma.

23.2.1 - rvore-B
Veja um exemplo simplificado na seguinte figura:

Este diagrama revela a estrutura de um ndice criado sobre uma tabela


possuindo dois campos: Matrcula e Nome. O ndice em questo permite
que rapidamente sejam localizados os registros da tabela segundo o campo
Nome. O princpio utilizado idntico ao de um ndice remissivo de um
livro qualquer: em vez de realizar buscas seqenciais no livro, prefere-se
localizar a pgina em que determinado assunto est.
Como pode ser visto na figura, existem duas partes: Nvel Folha (Leaf
Blocks) revelando a ordenao pelo campo sobre o qual se criou o ndice e
Nvel No Folha (Branch Blocks) possuindo blocos que permitiro o acesso
mais rpido aos dados. Perceba que se chega ao Nvel Dados (tabela
propriamente dita) por meio de ROWIDs que constam no Nvel Folha.
Oracle 9i Fundamental

319

Como j dito, ndices so Segmentos constitudos por Extents e estes por


Blocos. Cada Bloco pode comportar uma ou mais chaves, dependendo de
seu tamanho. Por simplicidade, a figura apresentada anteriormente revela
duas chaves por Bloco. Normalmente existem vrias, o que permite criar
atalhos para uma grande quantidade de registros.
Por exemplo, supondo que o campo Nome do exemplo anterior possua em
mdia vinte caracteres e que um Bloco possa comportar 7.17264 caracteres
teis (os demais so de controle), teramos at 358 chaves por Bloco.
Aplicando figura anterior, teramos como acessar rapidamente 2.864 (8 x
358) registros. E aumentando a quantidade de pginas no Nvel Folha,
crescemos o montante de linhas referenciadas.
Mas como acontecem as buscas em estruturas de rvore? Vamos fazer dois
exemplos, sendo um em que a procura seja coroada com sucesso e outro
em que o argumento buscado no exista na tabela.

Primeiro exemplo: Busca-se Felipe


Passo

Procedimento

Comea por B1 (raiz)

Se Felipe <= lvaro, ento v para B2;


Se Felipe > lvaro e Felipe <= Epaminondas, ento v para V para B3
B2
Se Felipe > Epaminondas, ento v para B3
Se Felipe <= Epaminondas, ento v para B6;
Se Felipe > Epaminondas e Felipe <= Francisco, ento v V para B6
para B6
Se Felipe > Francisco, ento v para B7
Se Felipe = Epaminondas, ento v para B15 (ACHOU)
Se Felipe = Felipe, ento v para B14 (ACHOU)
V
para
Se Felipe <> Epaminondas e Felipe <> Felipe, ento NO (ACHOU)
ACHOU

B14

Segundo exemplo: Busca-se Bento


Passo

Procedimento

Comea por B1

Se Bento <= lvaro, ento v para B2;


Se Bento > lvaro e Bento <= Epaminondas, ento v para V para B2
B2
Se Bento > Epaminondas, ento v para B3

64

Assumiu-se o seguinte: tamanho do bloco igual a 8192 bytes (8K); rea de


controle (overhead area) e reservada para transaes: 200 bytes e, com
PCTFREE igual a 10, retiram-se ainda 820 bytes.

Oracle 9i Fundamental

320

Passo

Procedimento

Se Bento <= lvaro, ento v para B4;


Se Bento > lvaro e Bento <= Carla, ento v para B4
Se Bento > Carla, ento v para B5

V para B4

Se Bento = lvaro, ento v para B10 (ACHOU)


Se Bento = Antonio, ento v para B12 (ACHOU)
NO ACHOU
Se Bento <> lvaro e Bento <> Antonio, ento NO ACHOU

Buscas em rvore tendem a ser mais rpidas do que seqenciais. Ainda no


exemplo da figura anterior, qualquer nome que seja procurado exigir no
mximo quatro Blocos visitados, entretanto, se a tabela fosse uma
seqncia linear de Blocos, teramos at oito visitas, caso o argumento
esteja na ltima linha. Veja um comparativo entre quantidades de acessos
para cada nome buscado:
Argumento

Blocos acessados em
busca em rvore

Blocos acessados em
busca seqencial

Carla

Daniel

lvaro

Francisco

Antonio

Gago

Felipe

Epaminondas

Observe que a busca em rvore resulta mais interessante para os quatro


ltimos nomes, h empate com Francisco e a busca seqencial ganha para
os trs primeiros. Esta (ainda pequena) diferena tende a aumentar
medida que a tabela cresce, pois a quantidade de Blocos no ndice aumenta
menos do que na Tabela.
Claro que os Blocos que constituem uma tabela tambm possuem vrios
registros, entretanto, em tabelas grandes, com muitos campos e muitas
linhas, a tendncia que as linhas estejam afastadas umas das outras,
inclusive acontecendo o fenmeno Row Chaining (encadeamento de linha veja detalhes em 22.4). Isto prova que, para tabelas pequenas, em que
todas as linhas entram em um Bloco ou dois, no faz sentido utilizar
ndices.

23.2.2 - Bitmap65
65

Este tipo de ndice somente pode ser utilizado na edio Enterprise. Veja
detalhes sobre instalao do Oracle e respectivas edies no Apndice G.

Oracle 9i Fundamental

321

Imagine uma tabela com os seguintes dados:


Matrcula

Nome

UF

Carla

RJ

Daniel

MG

11

lvaro

RJ

17

Francisco

SP

20

Antonio

RJ

23

Gago

RJ

29

Felipe

SP

31

Epaminondas

MG

Suponha que se tenha criado um ndice do tipo Bitmap sobre o campo UF.
Ele seria assim representado:
UF = MG

UF = RJ

UF = SP

Observe o seguinte

O ndice possui tantas linhas quanto a tabela e tantas colunas


quanto valores diferentes do campo indexado. Isto faz com que um
grande nmero de valores distintos inviabilize a utilizao de ndices
bitmap;
A presena de um nmero um na linha x e coluna y significa
presena de valor. Por exemplo, vemos na representao
apresentada anteriormente que existe um nmero um na terceira
linha e segunda coluna. De fato, o contedo do campo UF da
terceira linha RJ;
No existem ROWIDs no ndice. Em vez disso funes internas so
invocadas para que seja possvel converter um mapa de bits em um
conjunto de ROWIDs representando linhas. Este fato complica

Oracle 9i Fundamental

322

bastante a utilizao de ndices Bitmap em tabelas muito


transacionadas.
Dada a caracterstica do ndice, no se deve us-lo para campos
cujas buscas consistirem em operadores >, >=, <= ou <. Recomendase criar esse tipo de ndice para campos buscados de forma exata: =
ou <>, alm de operadores lgicos (AND, OR, NOT);
Ao deparar-se com o seguinte comando:
select * from tabela where uf = 'MG' or uf = 'SP'

realiza-se a seguinte operao:


UF = MG

UF = SP

Resultado

OR

E rapidamente seriam retornadas as linhas 2, 4, 7 e 8.

23.3 - Alterao de Segmentos de ndice


A sintaxe ainda simplificada do comando alter index :
ALTER INDEX nome
PCTFREE inteiro entre 0 e 100
INITRANS inteiro
MAXTRANS inteiro
STORAGE
(clusulas de armazenamento)
MONITORING | NOMONITORING USAGE
ALLOCATE EXTENT (SIZE inteiro [K | M]) | DATAFILE nome
DEALLOCATE UNUSED [KEEP numero [K | M]]
REBUILD
TABLESPACE nome

Observaes

A clusula USAGE permite acompanhar a utilizao de um


ndice. Mais detalhes em 23.4;
Caso o ndice seja atrelado a uma tabela que sofre vrias
inseres, atualiza-es ou excluses, o tamanho do ndice
crescer, mesmo que a quantidade de registros permanea mais

Oracle 9i Fundamental

323

ou menos constante. Nestes casos, convm reconstru-lo


(clusula REBUILD), podendo, inclusive, mudar a Tablespace.
Supondo que exista uma Tablespace exclusiva para ndices, o
seguinte comando alteraria o ndice recm-criado:

alter index CursoInstrutor_Turmas_idx


rebuild
tablespace indices;

O comando drop index elimina um ndice.

23.4 - Acompanhamento
Um risco natural na utilizao de ndices consiste na presena de muitos
que no sejam utilizados. Talvez tenham sido criados para atender a um
caso muito especfico que jamais tenha se repetido. Lembre-se que ndices
ocupam espao e tomam preciosos milissegundos de operaes de
atualizao, portanto devem existir os estritamente necessrios.
Uma grata novidade da verso 9i consiste na possibilidade de acompanhar
a utili-zao de ndices. E, caso perceba-se que alguns so pouco ou nada
utilizados, possvel elimin-los.
Suponha que exista uma forte suspeita que o ndice NOMEMAIUSCULO_
INSTRUTORES_IDX no esteja sendo usado com a desejada freqncia.
Comeamos por ligar o acompanhamento sobre ele:
alter index NOMEMAIUSCULO_INSTRUTORES_IDX monitoring usage;

Confirma-se que o ndice est sendo monitorado consultando


V$OBJECT_USAGE:
select monitoring, used, start_monitoring, end_monitoring
from v$object_usage where table_name = 'INSTRUTORES';

E uma possvel sada:


MON USE START_MONITORING
--- --- ------------------YES NO 05/21/2002

END_MONITORING
------------------15:15:06

Esta listagem informa que desde a hora exibida, nenhum ndice


monitorado da tabela INSTRUTORES foi utilizado.
Evidentemente o tempo de acompanhamento depende de cada ambiente.
Pode ser de uma hora, um dia, um ms. Cuidado especial deve ser tomado
com os ndices criados especialmente para relatrios mensais ou anuais.
Claro que seria mais aconselhvel cri-los apenas momentos antes da
emisso de tais relatrios.
Outro cuidado a ser tomado reside nas estatsticas. s vezes um ndice no
utilizado simplesmente porque se esqueceu de coletar as estatsticas para
ele ou para a tabela.
Oracle 9i Fundamental

324

Uma vez decidido que um dado ndice deva morrer, inicialmente deve-se
inter-romper o acompanhamento:
alter index NOMEMAIUSCULO_INSTRUTORES_IDX nomonitoring usage;

Consultando V$OBJECT_USAGE, teramos:


MON USE START_MONITORING
END_MONITORING
--- --- ------------------- ------------------NO NO 05/21/2002 15:15:06 05/24/2002 15:17:00

Apenas por precauo, antes de eliminar o ndice, convm gerar o create


index que o gerou. Isto pode ser feito pelo SQL Navigator ou pelo novssimo
Package embutido DBMS_METADATA, cujo resultado seria66:
create index "dbaacad"."nomemaiusculo_instrutores_idx" on
"dbaacad"."INSTRUTORES" (upper("nome_instrutor"))
pctfree 10 initrans 2 maxtrans 255 tablespace "academicas";

Segue o comando que gerou a instruo anterior:


select dbms_metadata.get_ddl ('INDEX', U.INDEX_NAME) cria_indice
from v$object_usage U where used = 'NO';

23.5 - Parties
Assim como Segmentos de Tabela, ndices tambm aceitam
particionamentos. Recomenda-se, inclusive, que os Segmentos de ndice de
uma tabela dividida em parties tambm sejam particionados.
O comando seguinte cria um ndice particionado no campo UF de ALUNOS:
create index uf_alunos_idx on alunos(uf)
local
(partition p11 tablespace baianos,
partition p12 tablespace capixabas,
partition p2 tablespace mineiros,
partition p3 tablespace cariocas,
partition p4 tablespace paulistas);

Observaes

A palavra reservada local indica que a organizao fsica do ndice


ser um espelho da tabela qual est atrelado;
Seria recomendvel criar Tablespaces prprias para as parties do
ndice.
O comando anterior cria, na verdade, cinco Segmentos de ndice que
podem ser gerenciados em separado. Por exemplo:
alter index uf_alunos_idx

66

Os comandos que geraram a sada apresentada em seguida encontram-se em


23_Ex_Gera_DDL.sql.

Oracle 9i Fundamental

325

rebuild partition p11


pctfree 30;

EXERCCIOS
1. Crie uma Tablespace exclusiva de ndices denominada INDICES.
Fique vontade para sugerir arquivos e parmetros de
armazenamento.
2. Crie um ndice para a tabela ALUNOS de acordo com os seguintes
parmetros:
a) Tablespace INDICES;
b) Campos: UF e Cidade;
c) PctFree: 10.
Este ndice tem propenso fragmentao?
3. Verifique a existncia do novo ndice.
Investigue DBA_INDEXES, IND e DBA_SEGMENTS.
4. Transfira CURSOINSTRUTOR_TURMAS_IDX para a nova Tablespace.
5. Recrie a chave primria da tabela ALUNOS.
6. Analise o script 23_Recria_Indices.sql e depois transfira todos os
ndices para a nova Tablespace INDICES.
7. A partir do script 23_Recria_Indices.sql elabore outro que permita
iniciar o acompanhamento de todos os ndices de um dado Schema.
8. Neste exerccio voc aprender uma sutileza sobre constraints e
ndices. Siga o roteiro:
a) Crie uma tabela com dois campos, sendo o primeiro no nulo;
b) Crie um ndice denominado PK_tabela, nico e associado ao
primeiro campo;
c) Acrescente um constraint do tipo Primary Key associado ao
campo recentemente indexado. Mas, ateno, o nome do
constraint deve ser o mesmo do ndice.
Diferente do que ocorre normalmente, a criao do constraint NO
provocar a criao de um ndice! Associa-se automaticamente ao
ndice homnimo. Este fenmeno tambm ocorre caso no se d
nome algum ao constraint.
9. Abra
o
script
23_Monta_Indice_Particoes.sql.
Analise-o
cuidadosamente e crie um novo ndice para a tabela CIRSOS no
campo carga horria.
10.
Nos comandos create table e alter table existe uma clusula
denominada USING INDEX. Descubra sua utilidade.
11.
Reflita: como garantir que as chaves primrias das tabelas,
criadas via constraints, possam ser armazenadas em uma
tablespace prpria de ndices?
Oracle 9i Fundamental

326

REFERNCIA RPIDA
Tarefa

Como fazer

Criar um Segmento de ndice

Comando create index

Alterar um Segmento de ndice

Comando alter index

Eliminar um Segmento de
ndice

Comando drop index

Listar Segmentos de ndice ou


informaes afins

Vises: DBA_SEGMENTS
DBA_EXTENTS
DBA_INDEXES
DBA_FREE_SPACE
IND(o mesmo que USER_INDEXES)

Monitorar a utilizao de
ndices

Siga o roteiro:
a) Aplique o comando alter index com clusula MONITORING USAGE;
b) Consulte periodicamente
V$OBJECT_USAGE;
c) Interrompa o acompanhamento
utilizando a clusula NOMONITORING
USAGE de ALTER INDEX

Gerar DDL de um objeto

Utilize o Package embutido


DBMS_METADATA.

Listar informaes sobre


parties

Vises: DBA_IND_PARTITIONS
USER_IND_PARTITIONS
ALL_IND_PARTITIONS

Oracle 9i Fundamental

327

ANOTAES

Oracle 9i Fundamental

328

Captulo 24 SEGURANA
OBJETIVOS

Identificar o papel de um Usurio no Banco;


Conceituar termos como Schema, Papel (Role), Privilgio e Perfil
(Profile);
Criar usurios, levando em considerao limites de utilizao de
recursos;
Alterar ou eliminar Usurios;
Atribuir privilgios de sistema e de objeto a usurios criados;
Gerenciar Roles;
Criar, alterar ou excluir Profiles;
Realizar autenticaes via Sistema Operacional;
Auditar sesses, tabelas e comandos.

NOVIDADES

Como j dito no Captulo 19, no existe mais o usurio


INTERNAL. Tambm, a conexo utilizando SYS deve ser
obrigatoriamente caracterizada como AS SYSOPER ou AS
SYSDBA;
Como j comentado no Captulo 20, agora possvel caracterizar
previamente uma Tablespace como a temporria padro para os
usurios que venham a ser criados.

ARQUIVOS NECESSRIOS

24_Cria_Profile.sql;
24_Gera_Verifica_Senha.sql;
24_Ex_Auditorias.sql;
Monta_Tabelas.sql.

PR-REQUISITOS

Conectar-se ao Servidor via SQL*Plus Worksheet;


Criar tabelas (comando CREATE TABLE);
Alterar a estrutura de tabelas previamente criadas (comando
ALTER TABLE);
Eliminar tabelas (comando DROP TABLE);
Inserir dados em tabelas (comando INSERT);
Oracle 9i Fundamental

329

Consultar dados j armazenados (comando SELECT);


Pesquisar o Dicionrio de Dados;
Alterar contedos de linhas (comando UPDATE);
Eliminar linhas (comandos DELETE e TRUNCATE TABLE);
Conhecer o conceito de transao e manipular os comandos
relacionados (COMMIT, ROLLBACK);
Criar e manipular views.

TEORIA
24.1 - Fundamentos
A razo de ser de um Banco de Dados e seu DBA so os usurios. Tudo o
que o DBA faz, em ltima anlise, tem por objetivo atender s necessidades
do usurio. Infelizmente, nem sempre a relao DBA-usurio das mais
tranqilas: freqente-mente um sabe muito pouco sobre as verdadeiras
angstias do outro. Posto isto, o DBA deve-se adaptar da melhor forma s
necessidades deles.
Para que essa adaptao seja o mais serena possvel, o DBA deve conhecer
em detalhes as questes seguintes:
a. O que o usurio quer?
b. De que o usurio precisa?
c. Existe outro usurio que queira ou necessite da mesma coisa?
d. Qual seria o nvel mnimo de segurana aceitvel?
e. E o mximo?
f. Existem regras na empresa que restrinjam a utilizao do Banco
pelo usurio?
Um dos pontos fortes do Oracle a segurana que ele oferece na
manipulao de objetos. Uma tabela, view ou synonym somente pode ser
manipulado por outros caso o dono ou o DBA deixem. Neste captulo, sero
criados usurios, em princpio sem direitos nem para realizar conexes.
Gradativamente recebero privilgios at que alcancem o status mximo: o
de DBA.
Alguns conceitos devem ser esclarecidos:
Conceito

Explicao

Usurio

Indivduo que se conecta ao Banco e utiliza objetos dele.


Tambm pode criar objetos e permitir que outros usurios os
manipulem.

Schema

Conjunto de objetos (tabelas, ndices, vises, etc.) de um


usurio. Pode ser listado com o comando: select * from cat;

Oracle 9i Fundamental

330

Conceito

Explicao

Privilgio

Direito que um usurio recebe para fazer algo. Existem duas


categorias: os de sistema (uns 125 na verso 9.0, 141 na 9.2)
que permitem desde realizar conexes at eliminar qualquer
tabela, e os de objeto (13) que afetam apenas um objeto: desde
ler at eliminar.

Papel (Role)

Conjunto de privilgios agrupados e com um nome. Facilita


bastante a gerncia de privilgios.

Perfil
(Profile)

Limites que restringem as aes de um usurio. Mais detalhes


em 24.5.

O DBA deve saber criar usurios (comando create user), atribuir-lhes


privilgios de sistema ou objeto e, de preferncia, criar papis (roles) que
concentrem grupos de privilgios que possam ser atribudos a mais de um
usurio.

24.2 - Usurios
Geralmente, quem cria usurios o DBA, ou algum designado por ele e
com privilgio para tal. A sintaxe simplificada do comando que cria
usurios a seguinte:
CREATE USER nome
IDENTIFIED [BY senha | EXTERNALLY]
DEFAULT TABLESPACE nome
TEMPORARY TABLESPACE nome
QUOTA inteiro [K | M] ON tablespace
PROFILE profile
PASSWORD EXPIRE
ACCOUNT [LOCK | UNLOCK]

Em que:
Clusula

Detalhes

Nome

Identificao do usurio criado.

IDENTIFIED

H duas possibilidades: ou via senha ou associando o usurio


Oracle a um usurio do Sistema Operacional (EXTERNALLY). A
senha deve possuir um mnimo de seis caracteres (recomendvel,
mas no obrigatrio), po-dendo conter nmeros ou letras. No
devem ser bvias e freqentemente devem ser alteradas.

DEFAULT
TABLESPACE

Tablespace destino de tabelas ou ndices criados pelo usurio,


quando outra no for especificada. No pode ser nem temporria,
nem do tipo UNDO. Esta clusula sempre deve ser utilizada, j
que, quando omitida, utiliza-se SYSTEM.

TEMPORARY
TABLESPACE

Tablespace temporria utilizada pelos comandos emitidos pelo


usurio. Se omitida, utiliza-se a Tablespace caracterizada
previamente como temporria padro (mais detalhes em 20.3).

Oracle 9i Fundamental

331

Clusula

Detalhes

QUOTA

Espao que pode ser utilizado em determinada Tablespace. Ela


pode ser repetida tantas vezes quantas forem as Tablespaces nas
quais o usurio em questo pode alocar espao. Em vez de um
inteiro seguido por K ou M, tambm pode-se especificar
UNLIMITED.

PROFILE

Conjunto de regras que limita diversos recursos do usurio. Mais


detalhes em 24.5.

PASSWORD
EXPIRE

Expira imediatamente a senha, obrigando que uma nova seja


especificada antes da primeira conexo.

ACCOUNT

Especificando LOCK, impede que o usurio realize conexes at


que seja utilizada a clusula ACCOUNT UNLOCK do comando
alter user.

Exemplo:
create user monick
identified by leonardo
default tablespace users
quota 1 m on users;

Ao criar um Banco e dependendo dos recursos instalados, vrios usurios


so automaticamente criados, porm vale destacar trs:
Senha
tpica

Observaes

SYS

CHANGE_O
N_
INSTALL

Dono da maioria dos objetos internos do Banco criado


nico que possui direitos para abrir ou fechar a
instncia/banco. Alis, deve-se reduzir ao mximo a
presena de sesses que utilizem SYS.
Trata-se do nico usurio capaz de conectar-se
quando o banco estiver fechado. Isto porque sua
autenticao transcende o banco corrente; ela acontece
via Arquivo de Senhas (Password File).

SYSTEM

MANAGER

DBA que deve ser utilizado apenas para criar o DBA de


fato do Banco (por exemplo, DBAACAD).

SCOTT

TIGER

Exemplo de usurio dono de tabelas. til apenas como


exemplo.

Usurio

Caso as senhas de SYS e SYSTEM tenham os valores tpicos mencionados,


elas devem ser mudadas imediatamente e guardadas a sete chaves. Tratase de uma boa medida alter-las periodicamente.
Recomenda-se que, no mnimo, existam mais dois usurios com status de
DBA: o DBA de fato e o dono das tabelas de produo.

Oracle 9i Fundamental

332

Para comprovar a existncia de um usurio, pode-se utilizar a view do


Dicionrio de Dados all_users:
select * from all_users;
USERNAME
USER_ID CREATED
------------------------------ ---------- -------SYS
0 04/09/01
SYSTEM
5 04/09/01
OUTLN
11 04/09/01
DBSNMP
17 04/09/01
ORDSYS
29 04/09/01
...
SCOTT
66 04/09/01
DBAACAD
67 20/04/02
MONICK
78 15/06/02

Usurios com status de DBA (possuem privilgio de sistema para mudar


senhas) ou o prprio usurio podem alterar a senha de acesso ao Oracle,
utilizando o comando alter user:
alter user monick identified by thiago;

Por motivos de segurana, pode-se suspender temporariamente um usurio


(digamos que ele precisou ausentar-se por uns tempos):
alter user monick account lock;

Deve-se observar que, quando um usurio destrudo, todos os objetos


criados por ele tambm so eliminados:
drop user monick cascade;

Evidentemente, nem todos podem eliminar usurios. Somente aqueles que


tiverem direito para tal.

24.3 - Privilgios
24.3.1 - Privilgios de Sistema
Ao ser criado, um usurio no tem direito nem de se conectar. Para que
possa ser considerado um usurio, ele deve receber alguns privilgios de
sistema. Veja alguns exemplos dos 141 existentes:
create session
create table
alter table
create view
create user
drop user
Ainda existem outros mais fortes:
Oracle 9i Fundamental

333

drop any table


select any table
alter any sequence
backup any table
create any view
analyze any67
sysdba
sysoper
Deve-se ressaltar o papel de SYSDBA e SYSOPER. Basicamente, elas
foram a conexo pelo usurio SYS, isto , caso tenha-se concedido um
destes privilgios a, digamos, USUQQ, o comando seguinte faz com que se
abra-se uma sesso para SYS:
connect usuqq/senhaqq as sysdba
show user
USER "SYS"

Como SYSDBA ou SYSOPER68 representam SYS, deve-se tomar muito


cuidado na concesso destes privilgios. Outro detalhe: toda conexo via
SYS obrigatoriamente pede AS SYSDBA ou AS SYSOPER.
Observe que o fato de um usurio poder criar outro no significa que possa
destru-lo. Ele tambm deve possuir o privilgio drop user.
Para conceder privilgios de sistema a um usurio, utilizamos o comando
grant cuja sintaxe :
GRANT {privilgio[,privilgio,...]
TO { usurio [,usurio,...] | ROLE | PUBLIC }
[WITH ADMIN OPTION]

em que:

Privilgio

So os privilgios de sistema aos quais o usurio ter


direito. Pode-se utilizar a insensata clusula ALL
PRIVILEGES para conceder todos os privilgios existentes.

Usurio

Quem receber os privilgios, tambm conhecido por


grantee.

ROLE

Tambm podem ser concedidos privilgios a roles,


represen-tando uma forma de agrup-los, para que
possam ser atribudos de uma vez a usurios. Mais
detalhes em 24.4.

67

68

Usurios com esta permisso podem atualizar estatsticas em qualquer


schema.
A diferena entre os dois bastante sutil. SYSOPER pode fazer tudo que
SYSDBA faz, exceto criar bancos.

Oracle 9i Fundamental

334

PUBLIC

Concede os privilgios a todos os usurios do banco.

WITH ADMIN OPTION

Permite que o usurio que recebeu os privilgios (grantee)


conceda-os a outros (grantors). Se forem retirados os
privilgios concedidos com esta opo, eles no sero
removidos dos usurios que os receberam depois.

Uma vez criado o usurio, ele deve receber privilgios de conexo. Veja:
connect monick/thiago
ERROR:
ORA-01045: user MONICK lacks CREATE SESSION privilege; logon denied
Aviso: Voc no est mais conectado ao ORACLE.

Para resolver o problema anterior, basta:


connect dbaacad/senha
Connected.
grant create session to monick;
Grant succeeded.

Agora Monick j pode se conectar e visualizar as views do Dicionrio de


Dados que comecem por all_ e user_.
Para visualizar os privilgios de sistema, devem-se investigar user_sys_privs
e dba_sys_privs (esta para usurios com status de DBA):
Select * from

user_sys_privs;

USERNAME PRIVILEGE
ADM
--------- -------------------------------------- --MONICK
CREATE SESSION
NO

Para retirar algum privilgio de sistema, usa-se o comando revoke:


connect system/manager
Connected.
revoke create session from monick;
Revoke succeeded.

Este comando somente pode ser disparado por quem emitiu o grant, ou
tiver privilgios de sistema adequados.

24.3.2 - Privilgios de Objeto


Privilgios de objeto servem, basicamente, para que outros usurios, que
no o dono, ou aqueles que tenham privilgios de sistema do tipo ANY,
possam trabalhar com os objetos.
Os privilgios de objeto so treze; vejamos os onze mais importantes:
Privilgio

Tabela

View

Sequence

Rotinas

Oracle 9i Fundamental

Materialized
View

Directory

335

Privilgio

Tabela

alter

delete

View

Sequence

Rotinas

Materialized
View

Directory

x
x

execute

index

insert

references

select

update

on commit
refresh

x
x

read

write

Observaes
Ainda existem os privilgios QUERY REWRITE e UNDER que so
utilizados em objetos no abordados neste livro;
Privilgios INSERT, UPDATE e DELETE para Views ou
Materialized Views aplicam-se apenas s que forem atualizveis
(mais detalhes sobre MVs em 22.5);
Os privilgios READ e WRITE foram utilizados implicitamente em
22.10 (Tabelas Externas) ao criar um objeto DIRECTORY.
Para conceder privilgios de objeto, tambm utilizamos o comando grant.
Sua sintaxe :

GRANT {privilgio[,privilgio,...] } [(colunas)]


ON objeto
TO { usurio [,usurio,...] | ROLE | PUBLIC }
[WITH GRANT OPTION]

em que:

privilgio

So os privilgios de objeto aos quais usurio ter direito.


Tambm pode-se cometer a imprudncia de utilizar ALL
para conceder todos os privilgios.

colunas

Campos que podero ser modificados.

objeto

Nome de tabela, view, sequence ou procedure.

usurio

Quem receber os privilgios.

ROLE

Tambm podem ser concedidos privilgios para roles.


Mais detalhes em 22.4.

PUBLIC

Concede os privilgios a todos os usurios do banco.

Oracle 9i Fundamental

336

WITH
OPTION

GRANT

Permite que o usurio que recebeu os privilgios


(grantee) conceda-os a outros. Se forem retirados os
privilgios concedidos com esta opo, eles tambm sero
removidos dos usurios que os receberam depois.

Exemplos
grant select, insert on cursos to monick;

Ainda que no recomendvel, podem-se conceder privilgios por campo:


grant update (carga_horaria, preco) on cursos to monick

with grant option;

A tarefa anterior pode ser melhor desempenhada utilizando views.


O comando seguinte deve ser evitado a qualquer custo:
grant all on cursos to public;

Para visualizar os privilgios de objetos, pode-se investigar user_tab_privs:


select grantee, table_name, grantor, privilege from user_tab_privs;
GRANTEE
---------DBAACAD
DBAACAD
DBAACAD
MONICK
MONICK

TABLE_NAME
-----------------------------DBMS_FLASHBACK
FONTE
FONTE
CURSOS
CURSOS

GRANTOR
---------SYS
SYS
SYS
DBAACAD
DBAACAD

PRIVILEGE
---------------EXECUTE
WRITE
READ
INSERT
SELECT

Existem outras vises que revelam preciosas informaes sobre privilgios:


USER_TAB_PRIVS
USER_TAB_PRIVS_MADE
USER_TAB_PRIVS_RECD

Privilgios do tipo objeto em nvel de tabela. A


primeira constitui a soma das outras duas:
concedidas (MADE) e recebidas (RECD).

USER_COL_PRIVS
USER_COL_PRIVS_MADE
USER_COL_PRIVS_RECD

Idem a anterior, porm em nvel de campo.

Exceto para as vises cujos nomes terminam por MADE e RECD, existe
uma equivalente DBA_, mais completa e cujos acessos so permitidos
apenas a usurios com status de DBA, ou seja, aqueles que receberam o
papel DBA (mais detalhes em 24.4).
Para retirar algum privilgio de objeto, tambm utilizamos o comando
revoke:
revoke insert on cursos from monick;

Este comando somente pode ser emitido por quem emitiu o grant, ou tiver
privilgios de sistema adequados. Outro detalhe: no se pode conceder ALL
e depois retirar INSERT, por exemplo.

Oracle 9i Fundamental

337

24.4 - Roles
Role um grupo de privilgios (sistema ou objeto), reunidos sob um nico
nome, que pode ser concedido a um ou mais usurio/roles. O Oracle j
oferece 24 roles predefinidas na verso 9.0 e 30 na 9.2:
select * from dba_roles;
ROLE
-----------------------------CONNECT
RESOURCE
DBA
...
AUTHENTICATEDUSER
OLAP_DBA
SALES_HISTORY_ROLE

PASSWORD
-------NO
NO
NO
NO
NO
NO

Toda role pblica. No se trata de um objeto que pertena a algum.


Quem tiver privilgio para criar roles o faz com seguinte: comando abaixo:
CREATE ROLE nome_role [IDENTIFIED BY senha];

E uma vez criada, uma role pode receber privilgios e ser concedida a um
usurio/role:
create role gerencia;
Role created.
grant create table, create view to gerencia;
Grant succeeded.
grant gerencia to monick;
Grant succeeded.

Para visualizar roles concedidas ao usurio corrente, deve-se investigar


user_role_privs:
connect monick/thiago
Connected.
select * from user_role_privs;
USERNAME
------------------------MONICK
MONICK

GRANTED_ROLE
-----------------------------CONNECT
GERENCIA

ADM
--NO
NO

DEF
--YES
YES

OS_
--NO
NO

Conectado como DBA, pode-se utilizar DBA_ROLE_PRIVS, e para visualizar


atribuies entre roles, deve-se investigar ROLE_ROLE_PRIVS:
select * from role_role_privs;
ROLE
-----------------------------DBA
DBA
DBA
DBA
DBA

GRANTED_ROLE
-----------------------------OLAP_DBA
XDBADMIN
JAVA_ADMIN
JAVA_DEPLOY
WM_ADMIN_ROLE

Oracle 9i Fundamental

ADM
--NO
NO
NO
NO
NO

338

DBA
DBA
DBA
DBA
DBA
DBA
OLAP_DBA
EXP_FULL_DATABASE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
IMP_FULL_DATABASE
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE

EXP_FULL_DATABASE
IMP_FULL_DATABASE
DELETE_CATALOG_ROLE
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE
GATHER_SYSTEM_STATISTICS
SELECT_CATALOG_ROLE
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE
HS_ADMIN_ROLE
HS_ADMIN_ROLE

NO
NO
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO

18 linhas selecionadas.

Para retirar algum privilgio de uma role ou a prpria role de um usurio,


tambm se usa o comando revoke:
revoke create view from gerencia;
Revoke succeeded.
revoke gerencia from monick;
Revoke succeeded.

Estes comandos somente podem ser emitidos por quem emitiu os grant, ou
tiver privilgios de sistema adequados.
Apenas um ltimo cuidado: nem todos os privilgios de objeto podem ser
concedidos a roles:
Sim

No

select, insert, update, delete, execute, alter e


on commit refresh

references, index, read e write

24.5 - Profiles
Quando os recursos disponveis (tempo de CPU, tempo de conexo, espao
em memria) forem fatores crticos, o DBA pode criar profiles (perfis) e
tambm atribu-los a usurios.
Existem 16 limites cujos valores podem ser atribudos a um ou mais
usurios:

sessions_per_user

Sesses
simultneas.
Deve
ser
levado
em
considerao que uma aplicao (Oracle Forms, por
exemplo) pode chamar outra, o que provocaria uma
nova sesso.

cpu_per_session

Medido em milissegundos. Quando esgotado, deve-se


fazer uma nova conexo.

cpu_per_call

Tempo de cpu
milissegundos.

por

Oracle 9i Fundamental

comando.

Medido

em

339

connect_time

Tempo de conexo em minutos. O usurio s percebe


que seu limite foi esgotado ao tentar emitir um
comando.

idle_time

Tempo ocioso
anterior.

em

minutos.

Vale

observao

logical_reads_per_session Leituras lgicas e fsicas por sesso.


logical_reads_per_call

Leituras lgicas e fsicas por comando.

private_sga

Quanto espao pode alocar na Shared SQL Area.


Somente vlido quando estiverem ligadas opes de
Shared Server69.

composite_limit

Custo obtido a partir de medidas de outros limites:


cpu_per_session,
logical_reads_per_session,
connect_time e private_sga_per_session.
Para atribuir um custo, utiliza-se o comando alter
resource cost item valor.
Os
valores
correntes
esto
na
viso
RESOURCE_COST.

failed_login_attempts

Quantas tentativas seguidas causaro o bloqueio da


conta.

password_*

Conjunto com seis medidas que controlam diversos


aspectos do funcionamento da senha (tempo de
expirao, tempo de bloqueio, etc.).

Todo banco possui, pelo menos, um profile denominado DEFAULT.


Para criar um profile, utiliza-se o comando create profile:
CREATE PROFILE nome LIMIT
limite1 valor
limite2 valor
...

Por exemplo70:
create profile PHospede Limit
sessions_per_user 1
cpu_per_session unlimited
connect_time 3
idle_time 1;
Profile created.

Para comprovar a existncia:


select resource_name, limit
from dba_profiles
where profile = 'PHOSPEDE';

69
70

Para saber mais sobre SS, consulte o Captulo 19, item 19.3.2.1.
O comando seguinte encontra-se em 24_Ex_Profile.sql.

Oracle 9i Fundamental

340

E a sada:
RESOURCE_NAME
-------------------------------COMPOSITE_LIMIT
SESSIONS_PER_USER
CPU_PER_SESSION
CPU_PER_CALL
LOGICAL_READS_PER_SESSION
LOGICAL_READS_PER_CALL
IDLE_TIME
CONNECT_TIME
PRIVATE_SGA
FAILED_LOGIN_ATTEMPTS
PASSWORD_LIFE_TIME
PASSWORD_REUSE_TIME
PASSWORD_REUSE_MAX
PASSWORD_VERIFY_FUNCTION
PASSWORD_LOCK_TIME
PASSWORD_GRACE_TIME

LIMIT
--------------------DEFAULT
1
UNLIMITED
DEFAULT
DEFAULT
DEFAULT
1
3
DEFAULT
DEFAULT
DEFAULT
DEFAULT
DEFAULT
DEFAULT
DEFAULT
DEFAULT

O comando alter profile altera um perfil:


alter profile PHospede Limit
sessions_per_user 2
connect_time 5;

A criao de profiles pode ser uma tarefa intil, caso no se habilite sua
utilizao. Isto ocorre de uma forma ou outra:
Alterar parmetro RESOURCE_LIMIT para TRUE:
alter system set resource_limit = true scope=both;

Comando alter system:


alter system set resource_limit = true;

Como j dito, um usurio pode ser associado a um profile na sua criao


ou alterao:
alter user monick profile phospede;

24.6 - Autenticao via Sistema Operacional


Quando houver sincronia entre as administraes de rede e de Bancos de
Dados, recomenda-se ter a opo de realizar conexes que sejam
autenticadas pelo Sistema Operacional. Isto proporciona mais segurana,
j que no existe a necessidade de explicitar senhas em Scripts.
Para que seja possvel esse tipo de autenticao, devem-se inicialmente
checar dois parmetros:
SHOW PARAMETERS AUTHENT
NAME
-----------------------------------os_authent_prefix
remote_os_authent

TYPE
----------string
boolean

VALUE
----------------------OPS$
FALSE

Oracle 9i Fundamental

341

Enquanto o primeiro informa o prefixo dos usurios identificados


externamente, o segundo simplesmente revela a possibilidade de existirem
tais autenticaes. Infelizmente, trata-se de parmetros estticos, ou seja,
alteraes devem acontecer no arquivo de parmetros e somente vigoram
na abertura de Banco seguinte.
Uma vez alterado o parmetro REMOTE_OS_AUTHENT, possvel criar um
usurio que seja validado fora do Oracle:
create user ops$administrator identified externally;

Agora, estando conectado como ADMINISTRATOR,


conexes ao Oracle simplesmente fazendo:

pode-se

realizar

connect /

Caso a conexo no acontea diretamente no Servidor ou Instncia


default, altera-se o comando anterior para:
connect / @host_string

24.7 - Auditoria
Auditoria representa um interessante recurso capaz de rastrear aes
executadas por usurios. Apesar de onerar o funcionamento geral do
Banco, recomenda-se utiliz-lo sempre que for necessrio documentar o
que cada indivduo estiver fazendo; talvez para melhorar polticas de
utilizao de recursos; talvez para investigar possveis desvios.
Tudo comea com o parmetro esttico AUDIT_TRAIL que, por default,
assume o valor NONE. Para que seja possvel realizar auditorias, o valor
deste parmetro deve ser alterado para DB.
Uma vez alterado o parmetro e reiniciada a instncia, pode-se utilizar o
comando audit, que admite trs possibilidades: sesso, tabela ou comando
sobre tabela.
Por exemplo:
audit session

Toda conexo subseqente, tenha ela sucesso ou no, ser gravada em


SYS.AUD$ que, alis, deve ter seu crescimento monitorado para que no
ocorram problemas de espao na Tablespace SYSTEM. Recomenda-se
limpar seu contedo periodicamente.
Aps algumas conexes, pode-se investigar SYS.AUD$ a partir da viso
DBA_AUDIT_SESSION71:
71

O comando seguinte, bem como diretivas de formatao necessrias, foi


extrado de 24_Ex_Auditorias.sql.

Oracle 9i Fundamental

342

select

Username, Decode (ReturnCode, '0', 'Conectado',


'1005', 'Falta Senha',
'1017', 'Senha Invlida', ReturnCode) "Mensagem",
To_char(Timestamp, 'DD-MM-YYYY HH24:MI:SS') "Conexo",
To_char(Logoff_Time, 'DD-MM-YYYY HH24:MI:SS') "Desconexo"
from DBA_AUDIT_SESSION;

E uma possvel sada:


Usurio Oracle
--------------DBAACAD
LIMITADO
LIMITADO
DBAACAD

Mensagem
-----------------------------Conectado
Conectado
Senha Invlida
Senha Invlida

Conexo
------------------17-06-2002 14:54:07
17-06-2002 14:54:15
17-06-2002 14:54:23
17-06-2002 14:54:31

Desconexo
------------------17-06-2002 14:54:15
17-06-2002 14:54:23

Para encerrar auditorias de conexes, faa:


noaudit session;

Comandos especficos tambm podem ser acompanhados. A relao


completa encontra-se na viso AUDIT_ACTIONS. Por exemplo:
select * from audit_actions where name like '%TABLE%';

E a sada:
ACTION
---------1
12
15
39
40
41
62
85

NAME
--------------------------CREATE TABLE
DROP TABLE
ALTER TABLE
CREATE TABLESPACE
ALTER TABLESPACE
DROP TABLESPACE
ANALYZE TABLE
TRUNCATE TABLE

Supondo que o usurio MONICK tenha direitos de criar tabelas, o comando


seguinte daria incio ao rastreamento de comandos envolvendo tabelas:
audit table by monick;

Para checar as aes concludas, deve-se investigar a viso


DBA_AUDIT_OBJECT:
select
Owner "Dono", Obj_Name "Objeto", Action_Name "Ao",
Decode (ReturnCode,
'0', 'Sucesso',ReturnCode) "Mensagem",
To_char(Timestamp, 'DD-MM-YYYY HH24:MI:SS') "Instante"
from DBA_AUDIT_OBJECT
where owner = 'MONICK';

E uma possvel sada:


Dono
Objeto
Ao
Mensagem
--------------- ------------------------------ --------------------------- ---------MONICK
NUMS
CREATE TABLE
Sucesso

Finalmente, podem-se rastrear comandos que manipulam uma tabela


especfica:
Oracle 9i Fundamental

343

audit insert on dbaacad.instrutores;

O resultado tambm encontra-se em DBA_AUDIT_OBJECT.

24.8 - Regras de Ouro


Existem algumas diretrizes que devem ser seguidas para melhorar a
segurana de um Banco de Dados. Vejamo-las:
1. Isole o Banco de Produo.
O Servidor contendo o Banco de Dados de produo deve ser
protegido de acessos externos indevidos, ou seja, devem ser
implantados mecanismos de proteo adequados em nvel de
Sistema Operacional.
2. Separe produo de desenvolvimento.
No corra o risco de perder dados por descuidos de programadores
que pensavam estar conectados ao Servidor de Desenvolvimento.
3. Remova usurios inteis.
Ao instalar o Banco, muitos usurios so criados, sendo que muitos
podem ser excludos sem prejuzo nenhum. Muitas aplicaes que
trabalham com Bancos Oracle tambm costumam criar usurios.
Lembre-se: usurios padres so convites para entradas indevidas.
4. Estabelea um cronograma de alterao de senhas para todos, inclusive
para os DBAs.
Nada de manter a mesma senha por muito tempo. As iniciais de SYS
e SYSTEM devem ser alteradas imediatamente!
5. Implemente mecanismos que garantam a complexidade de senhas.
Trabalhe com profiles e, se possvel, crie uma rotina prpria para
controle de senhas (veja exemplo no exerccio).
6. Realize Auditorias freqentes.
Procure saber quem est fazendo o que e de qual forma.
7. Restrinja os direitos das conexes entre Servidores (dblinks).
DBLINKS representam pontes que unem Bancos de Dados, s
vezes situados em Servidores diferentes.
8. Restrinja a distribuio de nomes de Servidores, Instncias, Bancos e
Objetos.
Quanto menos pessoas souberem detalhes internos do banco,
melhor.

EXERCCIOS
1. Assegure-se que TEMP seja a Tablespace temporria padro para
futuros usurios.
Emita o comando:
Oracle 9i Fundamental

344

alter database default temporary tablespace temp;

No se angustie caso acontea o erro ORA-12907; ele


simplesmente informa que a Tablespace j foi designada como
padro.
2. Crie seu usurio DBA, caso ele j no exista. Conectado como SYSTEM,
crie o usurio DBAACAD e conceda-lhe privilgios mximos.
Atribua-lhe a Role DBA.

3. Conectado como DBAACAD, execute o script Monta_Tabelas.sql.


4. Ainda conectado como DBAACAD, crie outro usurio. Nome LIMITADO,
senha LIM e Tablespace de dados padro USERS.
5. Tente conectar-se como LIMITADO/LIM e analise a mensagem gerada:
ERROR:
ORA-01045: user LIMITADO lacks CREATE SESSION privilege; logon denied
Aviso: Voc no est mais conectado ao ORACLE.

6. Volte a se conectar como DBAACAD e atribua a LIMITADO a role


predefinida CONNECT.
7. Conecte-se como LIMITADO e liste todos os usurios do Banco.
8. Trave LIMITADO.
Utilize a clusula ACCOUNT LOCK do comando alter user.
Para destravar, utilize ACCOUNT UNLOCK.
9. Suspenda LIMITADO.
Utilize a clusula PASSWORD EXPIRE do comando alter user.
Para reativar o usurio, basta atribuir-lhe uma senha vlida.
10.
Tente listar a tabela INSTRUTORES de DBAACAD a partir de
LIMITADO e analise a mensagem gerada:
select * from dbaacad.instrutores;
select * from dbaacad.instrutores
*
ERRO na linha 1:
ORA-00942: a tabela ou view no existe

11.

Liste o(s) papel(is) recebidos por LIMITADO.


Investigue a viso USER_ROLE_PRIVS ou SESSION_ROLES (mais
simples).
A viso SESSION_PRIVS tambm resulta interessante.

12.
Sem desconectar-se de LIMITADO, conecte-se novamente em
DBAACAD e crie uma role, R1, com o privilgio CREATE USER.
Confira a criao da role em DBA_ROLES.
Assim como usurios, roles podem ser criadas com senha.
13.
Atribua a nova role a LIMITADO.
automaticamente que a recebeu.
Oracle 9i Fundamental

Veja

se

ele

percebe

345

Conectado como LIMITADO, crie um usurio. Voc receber a


seguinte mensagem:

create user u2 identified by u2;


create user u2 identified by u2
*
ERRO na linha 1:
ORA-01031: privilgios insuficientes

Para resolver esse problema, basta emitir o comando SET ROLE


R1.
Caso a role tenha sido criada com senha, o comando anterior
muda para:
SET ROLE R1 IDENTIFIED BY SENHAR1

No se esquea de conceder tambm privilgio de conexo ao


novo usurio. Quem ser capaz disto: DBAACAD ou LIMITADO ?

14.
Deixe que LIMITADO possa ler a tabela INSTRUTORES de DBAACAD
e verifique se ele poderia passar adiante este direito.
Conceda direito de leitura a LIMITADO sobre INSTRUTORES com
a opo WITH GRANT OPTION (voc perceber que resulta
impossvel utilizar esta clusula em GRANTs para roles).
Ative a sesso de LIMITADO e constate que a permisso j
vigora.
Ao referenciar a tabela INSTRUTORES, estando conectado como
LIMITADO ou U2, no se esquea do prefixo representando o
schema dono da tabela.
15.

Liste privilgios de objeto atribudos a LIMITADO.


Conecte-se
como
LIMITADO
e
investigue
USER_TAB_PRIVS_RECD.

viso

16.
Retire o direito de leitura em sua tabela INSTRUTORES. Comprove
que aqueles que receberam por LIMITADO tambm perderam o
privilgio.
17.

Liste os limites do profile DEFAULT.

18.
Pelo Enterprise Manager Console crie um usurio, USUQQ, senha,
SENHA, e atribua-lhe a role RESOURCE.
Clique com o boto direito do mouse sobre a pasta Usurios
(Rede, Bancos de Dados, nome Instncia, Segurana) e selecione
o comando Criar.
A Tablespace default deve ser USERS.
Perceba que na guia Atribuio (a segunda) j consta a role
Connect.
19.
Ainda pelo Enterprise Manager Console, crie um profile com as
seguintes caractersticas:
a) ..Nome ................................................... Producao
Oracle 9i Fundamental

346

b) ..Tempo de conexo................................. 10 minutos


c) ..Tempo de inatividade ............................ 1 minuto
d) ..Sesses concorrentes ............................ 1
Atribua esse profile a USUQQ.
Para que os Profiles sejam efetivos, no se esquea de emitir, no
SQL*Plus Worksheet, o comando seguinte:
alter system set resource_limit = true;

O efeito desse comando ser visto nas prximas conexes...

20.
Conecte-se como o novo usurio e deixe a conexo ociosa por mais
de um minuto.
O que aconteceu? Nada? Ento emita algum comando ...
21.
Conecte-se novamente e depois tente abrir novamente o SQL*Plus
Worksheet e conectando-se como USUQQ.
Lembre-se que este usurio pode ter apenas uma sesso aberta.
22.

23.

Estando conectado como USUQQ, liste seus limites.


Investigue
as
vises
USER_RESOURCE_LIMITS
USER_PASSWORD_LIMITS.

Analise o corpo da funo VERIFICA_SENHA:


create or replace function verifica_senha
(username varchar2,
password varchar2,
old_password varchar2)
return boolean is
begin
-- verifica se a senha igual ao usurio
if password = username then
raise_application_error(-20001, 'senha igual a usuario');
end if;
-- verifica tamanho mnimo
if length(password) < 4 then
raise_application_error(-20002, 'tamanho da senha menor que 4');
end if;
-- verifica palavras bvias
if nls_lower(password) in ('senha', 'banco', 'oracle') then
raise_application_error(-20002, 'senha muito simples');
end if;
-- tudo bem:
return(true);
end;
/

A rotina anterior foi extrada do Script utlpwdmg.sql, que pode ser


encontrado em \oracle\ora92\rdbms\admin.
24.

Conectado como SYS, execute o script 24_Gera_Verifica_Senha.sql.


Note a necessidade da conexo como SYS. Altere a senha se for
preciso.
Observe que o Profile Producao foi alterado!

25.

Para USUQQ quais das senhas seguintes seriam vlidas ?


Oracle 9i Fundamental

347

a.
b.
c.
d.
e.
f.

usuqq
usuqqq
usu
123
oracle
o!r1cle
Qual das senhas anteriores a melhor ?
Uma forma alternativa de mudar a senha de um usurio seria
pelo comando PASSWORD do SQL*Plus Worksheet.

26.
Altere a funo VERIFICA_SENHA para que:
a. O tamanho mnimo seja 8.
b. No possam ser utilizadas as senhas: botafogo, saopaulo,
riodejaneiro.
27.
Elimine o perfil PRODUCAO.
Como existem usurios associados, deve-se utilizar a clusula
CASCADE.
Note que usurio nenhum pode ficar sem perfil. Logo, qual ser o
profile de USUQQ ?
28.

Repita o exerccio 21
O que aconteceu ?

29.
Com auxlio do comando create profile, crie um perfil denominado
PRODUCAO com os valores apresentados em seguida:
FAILED_LOGIN_ATTEMPTS................................................................3
PASSWORD_LOCK_TIME ...................................................................1/1440 (1 minuto)

Atribua este profile a USUQQ.


30.

Tente conectar-se trs vezes seguidas com USUQQ e senha errada.


Na quarta tentativa acontecer algo interessante:
connect usuqq/u;
ERROR:
ORA-28000: the account is locked

Espere um minuto e volte a conectar-se, porm agora com a


senha correta.

31.
Com auxlio do comando alter profile, modifique PRODUCAO com os
valores seguintes:
PASSWORD_REUSE_TIME ......................... Unlimited
PASSWORD_REUSE_MAX.......................... 3
32.
Altere a senha de USUQQ para S, depois mude-a para B e,
finalmente, tente mud-la novamente para S.
O histrico das senhas fica armazenado na tabela
SYS.USER_HISTORY$.
Oracle 9i Fundamental

348

33.
Modifique novamente PRODUCAO com os seguintes valores:
PASSWORD_LIFE_TIME ............................. 7
PASSWORD_GRACE_TIME......................... 3
34.
Adiante a data do sistema em oito dias e conecte-se como USUQQ.
Analise a mensagem mostrada:
connect usuqq/senha
ERROR: ORA-28002: the password will expire within 3 days
Connected.

35.
Adiante a data do sistema em mais quatro dias e tente a conexo
como USUQQ.
Analise a mensagem mostrada:
SQL> connect usuqq/senha
ERROR:
ORA-28001: the password has expired
Changing password for usuqq
Old password: *****
Operating System error occurred
Password unchanged
Warning: You are no longer connected to ORACLE.
SQL>

Para resolver este problema, conecte-se em DBAACAD e altere a


senha de USUQQ.

36.
Crie um usurio igual sua conta do Sistema, que possa ser
validado externamente.
Verifique
os
parmetros
OS_AUTHENT_PREFIX
e
REMOTE_OS_AUTHENT. Enquanto o primeiro revela o prefixo
dos usurios a serem validados externamente, o segundo informa
se esta validao possvel.
Nenhum dos dois parmetros dinmico, portanto mudanas
incorrero em derrubar e abrir a instncia corrente.
Ao criar o usurio, utilize a clusula IDENTIFIED EXTERNALLY.
Para testar o efeito do comando anterior, faa no SQL*Plus
Worksheet:
connect / @host_string

37.
Faa com que seja impossvel ao usurio recm-criado conectar-se
de outra forma que no seja pelo Sistema Operacional.
Ao criar o usurio, utilize a clusula IDENTIFIED BY VALUES
'impossivel'.
38.
Como ela foge ao padro Oracle (16 caracteres maisculos), no
pode ser descriptografada.

Oracle 9i Fundamental

349

Essa soluo, entretanto, no impede que algum usurio com


status de DBA altere a senha para outra aceita pelos padres
criptogrficos do Oracle.
A relao de usurios com respectivas senhas criptografadas est
em DBA_USERS.

39.

Reflita:
Na criao do usurio, qual seria a vantagem de identific-lo
externamente, via prefixo OPS$, e ainda fornecer senha explcita
?
Qual seria a conseqncia de fazer OS_AUTHENT_PREFIX nulo ?
O que se ganha, efetivamente, com esse recurso ?
Pense na utilizao de programas externos, tais como EXP que
permite exportar dados.
Quais seriam os riscos desse recurso ?

40.

Habilite a auditoria no Banco.


Localize o parmetro AUDIT_TRAIL, mude seu valor para DB,
feche o banco e reinicie-o.

41.

Habilite a auditoria no Banco para conexes.


Conectado como DBA, emita o comando audit session;.

42.
Realize vrias conexes; algumas com sucesso, outras no.
43.
Em uma sesso DBA, investigue a viso DBA_AUDIT_SESSION com
os seguintes comandos:
set linesize 300
column OS_Username format a15 heading "Usurio SO"
column Username format a15 heading "Usurio Oracle"
column terminal format a15 heading "Estao"
column Mensagem format a30
select
OS_Username, Username, Terminal,
Decode (ReturnCode,
'0', 'Conectado',
'1005', 'Falta Senha',
'1017', 'Senha Invlida', ReturnCode) "Mensagem",
To_char(Timestamp, 'DD-MM-YYYY HH24:MI:SS') "Conexo",
To_char(Logoff_Time, 'DD-MM-YYYY HH24:MI:SS') "Desconexo"
from DBA_AUDIT_SESSION;

44.

O cdigo anterior est no Script 24_Ex_Auditorias.sql.

Desabilite a auditoria no Banco para conexes.


Conectado como DBA, emita o comando noaudit session.;

45.
Investigue a viso AUDIT_ACTIONS para visualizar os comandos
auditveis.
46.

Habilite a auditoria no Banco para manipulao de tabelas.


Emitindo o comando audit table, os comandos alter, alter, analyze,
create, drop ou truncate table, que tenham sucesso ou no, passam
a ser registrados.
Oracle 9i Fundamental

350

47.
Em outra conexo, crie uma tabela, altere-a, acrescentando-lhe mais
uma coluna, insira-lhe algumas linhas e depois a destrua. Emita alguns
dos comandos de forma errnea propositalmente.
48.
Em uma sesso DBA, investigue a viso DBA_AUDIT_OBJECT com
os seguintes comandos:
-- Formatao de Colunas
set linesize 300
column OS_Username format a15 heading "Usurio SO"
column Username format a15 heading "Usurio Oracle"
column terminal format a15 heading "Estao"
column Mensagem format a30
column Objeto format a30
column Dono format a15
select
OS_Username, Username, Terminal, Owner "Dono",
Obj_Name "Objeto", Action_Name "Ao",
Decode (ReturnCode,
'0', 'Sucesso',ReturnCode) "Mensagem",
To_char(Timestamp, 'DD-MM-YYYY HH24:MI:SS') "Instante"
from DBA_AUDIT_OBJECT;

Este cdigo est no Script 24_Ex_Auditorias.sql.


49.
Desabilite a auditoria para manipulao em tabelas.
Conectado como DBA, emita o comando noaudit table.
50.
Habilite a auditoria na tabela INSTRUTORES para comandos
SELECT.
Emitindo o comando audit select on instrutores, todo e qualquer select
sobre a tabela passa a ser registrado.
Realize vrias consultas a INSTRUTORES a partir de vrias
sesses. Faa algumas erradas.
51.
Procure
os
acessos
a
INSTRUTORES
investigando
DBA_AUDIT_OBJECT.
52.
Desabilite a auditoria em INSTRUTORES para consulta.
Conectado como DBA, emita o comando noaudit select on instrutores.

REFERNCIA RPIDA
Tarefa
Criar usurios

Eliminar usurio

Como fazer
Utilize o comando create user.
Para comprovar sucesso da
USER_USERS ou ALL_USERS.

operao,

investigue

Utilize o comando drop user. Caso existam objetos, utilize


a clusula CASCADE:
drop user limitado cascade;
No podem existir conexes ativas do usurio em questo.

Oracle 9i Fundamental

351

Tarefa

Como fazer

Conceder
privilgios de
sistema

Utilize o comando Grant privilgio to usurio/Role with


admin option.
A clusula WITH ADMIN OPTION permite passar adiante
o privilgio de sistema recebido.

Consultar
privilgios de
sistema

Vises:
DBA_SYS_PRIVS,
ROLE_SYS_PRIVS.

Conceder
privilgios de
objeto

USER_SYS_PRIVS,

Utilize o comando:
grant. privilgio on tabela to usurio /role with grant option.

A clusula WITH GRANT OPTION no funciona se o


destino for uma role.

Consultar
privilgios de
objeto

Vises: ALL_COL_PRIVS (soma de ALL_COL_PRIVS_MADE e


ALL_COL_PRIVS_MADE); ALL_TAB_PRIVS (soma de
ALL_TAB_PRIVS_MADE e ALL_TAB_PRIVS_RECD),
DBA_COL_PRIVS, DBA_TAB_PRIVS, USER_COL_PRIVS (soma de
USER_COL_PRIVS_MADE e USER_COL_PRIVS_MADE);
USER_TAB_PRIVS (soma de USER_TAB_PRIVS_MADE e
USER_TAB_PRIVS_RECD).

Revogar privilgios

Utilize o comando revoke privilgio from usurio/ role.

Criar role

Utilize o comando create role.


Vises: DBA_ROLES, DBA_ROLE_PRIVS, USER_ROLE_PRIVS,

Consultar roles

ROLE_ROLE_PRIVS, ROLE_SYS_PRIVS, ROLE_TAB_PRIVS,


SESSION_ROLES.

Criar um profile

Comando CREATE PROFILE.

Alterar um profile

Comando ALTER PROFILE. Exemplo:


alter
profile
producao
limit
password_reuse_time
unlimited;

Eliminar um
profile

Comando DROP PROFILE. Caso existam


associados, utilize a clusula CASCADE:
drop profile producao cascade;

usurios

Listar informaes
de profiles

Vises: DBA_USERS, ALL_USERS, DBA_PROFILES

Listar limites de
profiles

Vises:
USER_PASSWORD_LIMITS.

Associar um profile
a um usurio

Comando alter user.

Autenticao via
SO

O parmetro esttico REMOTE_OS_AUTHENT deve estar


como true. J OS_AUTHENT_PREFIX informa o prefixo
dos usurios a serem autenticados externamente. Ao criar
o usurio, utilize a clusula IDENTIFIED EXTERNALLY.

USER_RESOURCE_LIMITS,

Oracle 9i Fundamental

352

Tarefa

Como fazer

Auditoria

O parmetro esttico AUDIT_TRAIL deve estar como DB.


O comando AUDIT inicia o rastreamento; NOAUDIT
encerra. A auditoria pode acontecer por sesso, comando
ou objeto.

Consultar
comandos
auditveis

Viso AUDIT_ACTIONS.

Consultar
resultado da
auditoria

Vises DBA_AUDIT_SESSION e DBA_AUDIT_OBJECT.

Oracle 9i Fundamental

353

Captulo 25 BACKUP & RECOVER


OBJETIVOS

Reconhecer a importncia da atividade de backup;


Identificar os tipos de cpia/recuperao disponveis;
Realizar cpias/recuperaes lgicas ou fsicas;
Discutir vantagens do pacote DBMS_FLASHBACK para rpidas
recuperaes;
Trabalhar com a ferramenta LogMiner;
Ativar/desativar o Modo Archive;
Realizar cpias/recuperaes com o Recovery Manager.

NOVIDADES

Como j visto no Captulo 21, o Package embutido


DBMS_FLASHBACK oferece uma rpida maneira de efetuar
recuperao de dados cuja perda tenha acontecido recentemente;
Os utilitrios EXP e IMP receberam novas funcionalidades, como,
por exem-plo, a possibilidade de exportar/importar uma
Tablespace;
A funcionalidade LogMiner tambm foi melhorada. Na verso 9.0
j possvel capturar comandos DDL e na 9.2, h mais
procedures em DBMS_LOGMNR. Outra alterao importante
reside na obrigatoriedade em fornecer a Supplemental Log Data;
O transporte de Tablespaces entre Bancos de Dados agora no
esbarra na limitao de tamanhos de bloco distintos entre origem
e destino;
Com o desaparecimento do Server Manager, todo Backup fsico
deve aconte-cer via SQL*Plus. Em vez de executar comandos do
Sistema Operacional via ! (ponto de exclamao), agora utiliza-se
o comando host;
O Recovery Manager ganhou melhorias significativas; h novos
comandos (@, @@, CONFIGURE, SHOW, BLOCKRECOVER,
SPOOL). Agora possvel arma-zenar de forma permanente
alguns parmetros. Alguns comandos mudaram (ALLOCATE
CHANNEL, entre outros).

ARQUIVOS NECESSRIOS

25_Testa_LogMiner.sql;
Oracle 9i Fundamental

354

25_Gera_Cold.sql;
25_Hot.sql;
25_Fazhot.bat;
25_Gera_Avaliacoes.sql.

PR-REQUISITOS

Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;


Identificar elementos da arquitetura Oracle;
Conhecer os conceitos de Instncia, Tablespace, Usurio,
Schema, Tabela;
Conhecer o package embutido DBMS_FLASHBACK;
Estado de esprito para enfrentar situaes crticas.

TEORIA
25.1 - Fundamentos
Imagine que voc um dia venha a desempenhar o cobiado papel de DBA
em uma prspera empresa do ramo petroleiro. Numa clida tarde de
dezembro, o Diretor Geral (custo hora R$ 350) apareceria em carne e osso
em sua sala pela primeira vez em sua vida e pediria para que seja
armazenado no Banco de Dados Oracle um texto que ele mesmo teria
preparado por quatro horas (custo hora/homem R$ 1.400).
Seria um esboo que elucidaria uma poltica de vendas capaz de
revolucionar a maneira como normalmente so gerenciados postos de
gasolina. Se a idia fosse implementada corretamente, os lucros gerados
trariam imenso prestgio filial brasileira.
Acontece que a tal idia tinha sido fruto de um lampejo genial ocorrido
durante um banho matinal. E, dada a importncia do assunto, o Diretor
decidira, sabiamente, guardar o trabalho no local mais seguro da empresa:
o Banco Oracle.
Agora imagine que voc no tivesse o salutar costume de realizar cpias de
segu-rana e, numa trgica noite de vero, uma chuva torrencial
acompanhada de assusta-dores raios e estrondosos troves provocasse
uma sobrecarga no sistema eltrico da empresa e seu querido Servidor de
Dados tivesse seus discos pulverizados.
Qual seria a real dimenso financeira da perda? R$ 1.400 ? No! Alm de
engordar as estatsticas de desemprego deste pas, voc seria o responsvel
direto por um prejuzo intangvel. Quanto vale um lampejo dessa natureza?
Impossvel calcular!
Qualquer problema que ocorra com a consistncia do Banco , em ltima
anlise, culpa do DBA. Cabe a ele garantir que o Banco esteja sempre
Oracle 9i Fundamental

355

saudvel e, caso ocorram perdas, que a recuperao seja o mais rpida e


transparente possvel. Portanto, a questo no se h backup, mas o quo
rpido ele pode ser recuperado.
Uma das principais tarefas do administrador de dados manter uma
poltica de segurana de dados consistente para recuperao de
informaes que foram perdi-das ou corromperam-se. Uma poltica de
backup validada seria como ter botes salva-vidas em um navio. Espera-se
nunca precisar deles, mas quando forem necessrios, tm de estar a postos
e resolver a situao.
Montar uma poltica competente de backup talvez seja a tarefa mais crtica
de um DBA. No realizar cpias de segurana inadmissvel, j que
existem diversos fatores que conspiram contra a integridade de dados:
Comandos mal utilizados: drop, delete, truncate table, update;
Usurios mal-intencionados (nunca se devem contrariar as
pessoas com plenos direitos de acesso s bases de dados
crticas);
Roubo de dados;
Vrus;
Falhas de hardware;
Desastres (enchentes, apages, terremotos, meteoros, atentados,
etc.).
Infelizmente, o nico culpado por qualquer perda sempre um, o DBA.
Mas isto no chega a ser um drama, caso exista uma robusta poltica de
backup.
Basicamente, o trabalho de elaborao de uma poltica de backup consiste
em responder algumas questes:

O QU:

Quais bancos devem ser copiados? Aqueles contendo dados de


produ-o, certamente sim, mas o que dizer dos criados para
realizar testes? E aqueles alimentados regularmente com
dados que j existam em outro lugar?

FREQNCIA:

Vale a pena copi-los quando ocorram alteraes importantes


(antes ou aps) ou regularmente? A criticidade dos dados dir
se acontecero cpias a cada semana, dia, hora ou minuto.

O quanto est se disposto a investir? Ser que o bastante


para adquirir uma unidade de fita, um disco rgido na rede ou,
INVESTIMENTO:
talvez, montar uma soluo envolvendo mais de um
Servidor72?

72

O Oracle 9i apresenta uma funcionalidade bastante poderosa denominada


Real Application Clusters (RAC) que aumenta significativamente a
disponibilidade dos dados a partir da reunio fsica de dois Servidores
ou mais. Infelizmente, este recurso no ser tratado neste livro.

Oracle 9i Fundamental

356

QUEM:

Quem ser o primeiro indivduo a ser contactado em caso de


ocor-rerem perdas? Quem ser responsvel por decidir
quando, como e onde acontecero backups? Em algumas
empresas exige-se um alto grau de compromisso, inclusive
assinando termos de responsabilidade.

DESTINO

Normalmente, o destino de uma cpia de segurana um disco


(local ou remoto) ou, quando o espao disponvel for exguo ou
caro, uma unidade de fita. Geralmente cpias recentes vo
para disco e depois alguma ferramenta externa encarrega-se de
copi-las para fita.

ESTRATGIA

Como ser visto em breve, o Oracle oferece diversos


mecanismos capazes de efetuar cpias e recuperaes. Quais
devem ser utilizados e como eles devem cooperar entre si
constituem a estratgia de backup/ recuperao para um dado
banco.

SIMULAES

As perdas so inevitveis. O DBA no tem o poder de evitar um


desastre natural, uma falha de hardware ou impercia de
usurio. Mas ele pode e deve estar preparado para o momento
da recuperao, cuja tnica ser uma grande carga emocional.
Os holofotes estaro voltados para o DBA e pessoas nervosas a
observ-lo trabalhar constituem um cenrio que ele
decididamente deve evitar. Sendo assim, o DBA pre-cisa
treinar fazendo simulaes de perdas para que, nos momentos
de crise, no aconteam surpresas desagradveis.
Outra vantagem das simulaes peridicas consiste em validar
a cpia de segurana. Quo desesperadora situao no deve
ser aquela na qual descobre-se que a fita contendo os dados
crticos est avariada!
Normalmente, essas simulaes consistem em recuperar o
contedo de destinos de backup para avaliao e provocar
perdas que meam a eficcia da estratgia.

Neste captulo abordaremos os mtodos utilizados para garantir uma cpia


efetiva do banco de dados e a possibilidade de sua recuperao, em virtude
de uma falha qualquer.
Veremos exemplos de backup apenas para arquivos em disco. Para cpias
em fita, sugere-se adotar ferramentas de terceiros como ArcServe ou
BackupExec. No caso especfico do Windows 2000, todas as unidades de
fitas compatveis com o Sistema Operacional podem ser utilizadas, j que a
configurao da unidade ser feita a partir do Painel de Controle.
O Oracle trabalha com o seguinte esquema de cpias de
segurana/recuperao:

Oracle 9i Fundamental

357

Lgica

Realizadas pelos utilitrios especficos EXP e


IMP. O primeiro pode copiar todos os objetos
do banco, de um determinado Schema, de
uma dada Tablespace ou mesmo de uma
tabela, e armazena o resultado em um
arquivo binrio que depois pode ser lido pelo
segundo.
Veja mais detalhes em 25.2.

Exportao/
Importao

Trata-se do recurso Log Miner, introduzido


Recuperao
na
verso 8i. Por meio dele possvel
via Packages DBMS_LOGMNR_D e
investigar
os comandos presentes nos Redo
Embutidos
DBMS_LOGMNR
Log Files ou Archived Logs e at reverter
seus efeitos. Mais detalhes em 25.3.
DBMS_FLASHBACK

A partir da leitura de Segmentos de Undo,


permite obter uma fotografia dos dados em
algum ponto do passado recente. Mais
detalhes no Captulo 21, item 21.4.

Transporte
de
Tablespaces

Combinando com cpias fsicas de arquivos, podem-se utilizar EXP e


IMP para copiar Tablespaces entre Bancos (Transportable
Tablespaces). Veja 25.5.

Fsica

Cold

Estando Banco e Instncia fechados, copia


todos os arquivos, via SO, para outro disco.
Mais detalhes em 25.6.

Mixta

O Banco deve ser fechado, os arquivos


copiados fisicamente, porm, como o
processo ARCH est ligado, a recuperao
pode ser feita at um deter-minado instante.

Hot

O Banco pode estar aberto, mas o processo


ARCH deve estar funcionando. Trabalha em
nvel de Tablespaces, que devem estar em
estado On-line.
Esta tcnica mais eficiente, j que a SGA
no precisa ser esvaziada. Tambm
indicada para bancos 24x7x365, isto , que
nunca podem ser indisponibilizados. Mais
detalhes em 25.7.

Recovery
Manager

Na verso 8 foi introduzida a ferramenta RMAN (Recovery Manager)


e melhorada nas verses seguintes. Com o advento da 9i, o RMAN
finalmente atingiu sua maturidade oferecendo um completo
ferramental que permite realizar cpias e recuperaes at em nvel
de bloco. Como interage intima-mente com o Arquivo de Controle
da instncia sendo trabalhada, oferece inmeras facilidades, como,
por exemplo, informar h quantos dias uma determinada
Tablespace no sofre uma cpia de segurana. Mais detalhes em
25.8.

Oracle 9i Fundamental

358

25.2 - Operaes Lgicas


25.2.1 - Exportao
Estando o Banco aberto e funcionando perfeitamente, podem-se realizar
cpias lgicas que produziro arquivos binrios. As razes podem ser
vrias: segurana, necessidade de desfragmentar tabelas, transporte de
Schemas.
O utilitrio de exportao EXP, do tipo linha de comando, pode ter sua
sintaxe investigada da seguinte maneira:
C:\>exp help=y
Export: Release 9.2.0.1.0 - Production on Sex Jul 5 15:28:47 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Voc pode deixar que a Exportao solicite os parmetros. Para isso,


informe o comando comando seguido do seu nome de usurio/senha:
Exemplo: EXP SCOTT/TIGER

Ou ento poder controlar como a Exportao ser executada entrando


com o comando EXP seguido de vrios argumentos. Para especificar
parmetros, voc usa palavras-chave:
Formato:
Exemplo:

EXP KEYWORD=valor ou KEYWORD=(valor1,valor2,...,valorN)


EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
ou TABLES=(T1:P1,T1:P2), se T1 for tabela particionada

USERID deve ser o primeiro parmetro da linha de comandos.


Palavra-chave
Descrio (Default)
Palavra-chave Descrio
(Default)
-------------------------------------------------------------------------USERID
nome de usurio/senha FULL
exportar arquivo inteiro (N)
...
Exportao encerrada com xito, sem advertncias.

A tabela seguinte explica os parmetros mais importantes73:


Parmetro

Descrio

USERID

Cadeia de conexo: usurio/senha e @host (quando a conexo


acontecer a partir de um Cliente ou existir mais de uma
instncia no Servidor de Dados). Caso este parmetro seja
omitido, os dados de conexo sero pedidos interativamente.

FILE

Arquivo destino da cpia.

FULL

Indica que o banco completo deve ser exportado. Somente


permitido para quem tiver o papel EXP_FULL_DATABASE.
Valores possveis: Y ou N (default).

73

Veja a descrio completa dos parmetros na documentao do Oracle, manual


Utilities (Captulo 1).

Oracle 9i Fundamental

359

Parmetro

Descrio

OWNER

Em vez de exportar o banco completo, pode-se escolher um ou


mais Schemas.

TABLES

Em vez de exportar o banco completo, ou mesmo um Schema


inteiro, pode-se escolher uma ou mais tabelas.

TABLESPACES

Em vez de exportar o banco completo, pode-se escolher uma ou


mais Tablespaces.

BUFFER

Quantidade de bytes utilizados para armazenar linhas de


tabelas que sero exportadas. O default depende do Sistema
Operacional. Sugerido: 64.000.

COMPRESS

Muito utilizado para tabelas que residam em Tablespaces cujo


gerenciamento seja baseado no Dicionrio de Dados (veja
detalhes em 20.3). Este parmetro faz com que o segmento seja
criado em apenas um Extent, fazendo com que fique
desfragmentado. Valores possveis: Y (default) ou N.

ROWS

Informa se as linhas das tabelas devem ser exportadas (Y) ou


no (N). O default Y.

LOG

Grava as mensagens emitidas pela exportao no arquivo


indicado por este parmetro.

TRANSPORT_
TABLESPACE e
TTS_FULL_CHE
CK

Geram metadados das Tablespaces por transportar (mais


detalhes em 25.5).

Perceba que os parmetros FULL, OWNER, TABLES e TABLESPACES so


mutuamente exclusivos

Primeiro Exemplo: exportao completa


C:\>exp dbaacad/dbaacad file=e:\backup\completo.dmp full=y log=e:\backup\saida.txt
buffer=64000

Observaes

No podem existir quebras de linha na digitao do comando;


A instruo anterior poderia residir em um arquivo de lote;
Uma viso simplificada da sada seria:

Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production


With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Exportao executada no conjunto de caracteres de WE8MSWIN1252 e no conjunto de
caracteres de AL16UTF16 NCHAR
Sobre exportar o banco de dados inteiro ...
. exportando definies de tablespace
. exportando perfis
. exportando definies de usurio
. exportando funes

Oracle 9i Fundamental

360

. exportando custos de recurso


. exportando definies de segmento de rollback
. exportando vnculos de banco de dados
. exportando nmeros de seqncia
. exportando nomes alternativos de diretrios
. exportando namespaces de contexto
. exportando nomes da biblioteca de funo externa
. exportando sinnimos do tipo PBLICO
. exportando sinnimos do tipo privado
. exportando definies de tipos de objeto
. exportando objetos e aes procedurais de sistema
. exportando objetos e aes procedurais anteriores ao esquema
. exportando definies de cluster
. sobre exportar tabelas de SYSTEM ... via Caminho Convencional ...
. . exportando tabela
AQ$_INTERNET_AGENT_PRIVS
0 linhas
...
. . exportando tabela
XCF
0 linhas
. . exportando tabela
XDF
0 linhas
. sobre exportar tabelas de DBAACAD ... via Caminho Convencional ...
. . exportando tabela
ALUNOS
31 linhas
. . exportando tabela
CURSOS
10 linhas
. . exportando tabela
HISTORICO
100 linhas
. . exportando tabela
INSTRUTORES
10 linhas
. . exportando tabela
TURMAS
20 linhas
. exportando sinnimos
. exportando views
. exportando restries referenciais de integridade
. exportando procedimentos armazenados
. exportando operadores
. exportando tipos de ndices
. exportando ndices funcionais, extensveis e de bitmap
. exportando aes contabilizveis
. exportando gatilhos
. exportando views materializadas
. exportando logs de snapshot
. exportando filas de servio
. exportando filhos e grupos de renovao
. exportando dimenses
. exportando objetos e aes procedurais posteriores ao esquema
. exportando tabela histrica do usurio
. exportando opes de auditoria default e do sistema
. exportando estatstica
Exportao encerrada com xito, sem advertncias.

exportadas
exportadas
exportadas
exportadas
exportadas
exportadas
exportadas
exportadas

Segundo Exemplo: exportao de dois Schemas


C:\>exp dbaacad/dbaacad file=e:\backup\schemas.dmp owner=(dbaacad, scott)
log=e:\backup\schemas.txt buffer=64000 compress=y

Observao

Os parnteses so desnecessrios caso apenas um Schema seja


exportado.

Terceiro Exemplo: exportao de uma Tablespace


C:\>exp dbaacad/dbaacad file=e:\backup\users.dmp tablespaces=users
log=e:\backup\users.txt buffer=64000 compress=y

Oracle 9i Fundamental

361

Quarto Exemplo: exportao de uma Tabela


C:\>exp dbaacad/dbaacad file=e:\backup\alunos.dmp tables=alunos
log=e:\backup\alunos.txt buffer=64000 compress=y rows=n

Observaes

Se houvesse mais de uma tabela, elas deveriam aparecer


separadas por vrgulas e a lista delimitada por parnteses;
V-se que foi exportada apenas a definio da tabela (sem
linhas), j que o parmetro ROWS est como N. O arquivo
gerado, ALUNOS.DMP, apesar de possuir um formato
proprietrio, pode ser aberto com um editor de textos comum
(Bloco de Notas, por exemplo).

25.2.2 - Importao
A importao somente faz sentido se houver um arquivo produzido pelo
utilitrio de exportao. Recomenda-se sua utilizao quando houver
necessidade de transportar um Schema, ou uma dada tabela, ou mesmo
Tablespace.
O utilitrio de exportao IMP, do tipo linha de comando, pode ter sua
sintaxe investigada da seguinte maneira:
C:\>imp help=y
Import: Release 9.2.0.1.0 - Production on Dom Jul 7 09:18:34 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Voc pode deixar que a Importao emita um prompt solicitando os


parmetros, entrando com o comando comando seguido do seu nome de
usurio/senha:
Exemplo: IMP SCOTT/TIGER

Ou ento, voc pode controlar a forma como a Importao ser executada


entrando com o comando IMP seguido de vrios argumentos. Para
especificar parmetros, voc usa palavras-chave:
Formato: IMP KEYWORD=valor ou KEYWORD=(valor1,valor2,...,valorN)
Exemplo: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
ou TABLES=(T1:P1,T1:P2), se T1 for tabela particionada
USERID deve ser o primeiro parmetro da linha de comandos.
Palavra-chave Descrio (Default)
Palavra-chave Descrio (Default)
-----------------------------------------------------------------------------USERID
nome de usurio/senha FULL
importar arquivo inteiro (N)
...
Importao encerrada com xito, sem advertncias.

Oracle 9i Fundamental

362

A tabela seguinte explica os parmetros mais importantes74:


Parmetro

Descrio

USERID

Cadeia de conexo: usurio/senha e @host (quando a conexo


acontecer a partir de um Cliente ou existir mais de uma
instncia no Servidor de Dados). Caso omitido, ser pedido.

FILE

Arquivo origem da cpia.

FULL

Indica que o banco completo deve ser importado. Somente


permitido para quem tiver o papel IMP_FULL_DATABASE.
Valores possveis: Y ou N (default).

FROMUSER

Indica Schema origem.

TOUSER

Schema destino.

TABLES

Lista de tabelas a serem importadas.

TABLESPACES e
TTS_OWNERS

Utilizados em conjunto com TRANSPORT_TABLESPACE = Y.


Mais detalhes em 25.5.

SHOW

Lista contedo do arquivo origem. Apenas utilizvel com


FULL=Y, FROMUSER, TOUSER e TABLES.

IGNORE

Indica se a importao no deve ser interrompida ao primeiro


erro (Y). Default: N.

COMMIT

Indica se deve ser realizado um COMMIT quando a quantidade


de bytes transferida atingir o indicado no parmetro BUFFER
(Y), ou ao final de cada tabela importada (N). Apesar de ser N o
valor padro, recomenda-se enfaticamente utilizar Y.

BUFFER

Quantidade de bytes utilizada para armazenar linhas de


tabelas que sero exportadas. O default depende do Sistema
Operacional. Sugerido: 64.000.

ROWS

Informa se as linhas das tabelas devem ser importadas (Y) ou


no (N). O default Y.

LOG

Grava as mensagens emitidas pela importao no arquivo


indicado por este parmetro.

Perceba, mais uma vez, que os parmetros FULL, FROMUSER/TOUSER,


TABLESPACES e TABLES no devem ser utilizados no mesmo comando.
Os exemplos seguintes complementam os criados no item anterior, 25.2.1 Exportao.

Primeiro Exemplo: mostra o contedo do arquivo por importar


Supondo que no quarto exemplo no tenha sido utilizado o parmetro
ROWS=N, comando seguinte proporciona uma forma mais confivel de
extrair a definio da tabela ALUNOS:
74

Veja a descrio completa dos parmetros na documentao do Oracle, manual


Utilities (Captulo 2).

Oracle 9i Fundamental

363

C:\>imp dbaacad/dbaacad file=e:\backup\alunos.dmp tables=alunos show=y log =


e:\backup\imp_alunos.txt

Observaes
A instruo no realiza importao alguma;
Veja como ficaria o arquivo IMP_ALUNOS.TXT:
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Arquivo de exportao criado por EXPORT:V09.02.00 via caminho convencional
importao realizada nos conjuntos de caracteres WE8MSWIN1252 e NCHAR AL16UTF16
. importando objetos de DBAACAD para DBAACAD
"CREATE TABLE "ALUNOS" ("MATRICULA" NUMBER(3, 0), "NOME_ALUNO" VARCHAR2(30) "
"CONSTRAINT "ALUNOS_NOME_NU" NOT NULL ENABLE, "TEL_ALUNO" VARCHAR2(10), "END"
"ERECO_ALUNO" VARCHAR2(30), "CIDADE_ALUNO" VARCHAR2(20), "UF" CHAR(2)) PCTF"
"REE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1"
" FREELIST GROUPS 1) TABLESPACE "USERS" LOGGING NOCOMPRESS"
" ALTER TABLE "ALUNOS" MODIFY ("CIDADE_ALUNO" DEFAULT 'Rio de Janeiro')"
" ALTER TABLE "ALUNOS" MODIFY ("UF" DEFAULT 'RJ' )"
. . saltando a tabela "ALUNOS"
"CREATE UNIQUE INDEX "ALUNOS_PK" ON "ALUNOS" ("MATRICULA" ) PCTFREE 10 INIT"
"RANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1) TA"
"BLESPACE "USERS" LOGGING"
"ALTER TABLE "ALUNOS" ADD CONSTRAINT "ALUNOS_UF_CH" CHECK (uf in ('SP', 'MG'"
", 'RJ', 'ES')) ENABLE NOVALIDATE"
"ALTER TABLE "ALUNOS" ADD CONSTRAINT "ALUNOS_PK" PRIMARY KEY ("MATRICULA") "
"USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 FREELI"
"STS 1 FREELIST GROUPS 1) TABLESPACE "USERS" LOGGING ENABLE "
"ALTER TABLE "ALUNOS" ENABLE CONSTRAINT "ALUNOS_UF_CH""
Importao encerrada com xito, sem advertncias.

Segundo Exemplo: importao completa


C:\>imp dbaacad/dbaacad file=e:\backup\completo.dmp full=y log=e:\backup\saida.txt
buffer=64000 ignore=y commit=y;

Observaes

No podem existir quebras de linha na digitao do comando;


A instruo anterior poderia residir em um arquivo de lote;
Apesar de ser Y o default para o parmetro IGNORE, resolveu-se
utiliz-lo para enfatizar sua importncia. Ele concede mais
flexibilidade ao comando, j que no necessrio que o banco
destino esteja completamente vazio.

Terceiro Exemplo: importao de um Schemas


C:\>imp dbaacad/dbaacad file=e:\backup\schemas.dmp fromuser=dbaacad
touser=monick log=e:\backup\imp_schemas.txt buffer=64000 ignore=y commit=y

Oracle 9i Fundamental

364

Observao

Para que o comando anterior obtenha xito, deve ter sido criado
previamente um Schema denominado MONICK que possua, no
mnimo, os papis predefinidos CONNECT e RESOURCE.

Quarto Exemplo: importao de uma Tabela


Suponha que a tabela HISTORICO tenha sido eliminada inadvertidamente.
Poderamos recuper-la a partir do arquivo gerado pela exportao do
terceiro exemplo de 25.2.1:
C:\>imp dbaacad/dbaacad file=e:\backup\users.dmp tables=historico
log=e:\backup\imp_historico.txt buffer=64000 ignore=y commit=y

Observao

Note que a importao da tabela HISTORICO no precisa vir de


um arquivo gerado pela nica exportao desta tabela. Tambm
poder-se-ia traz-la de uma exportao completa.

25.3 LogMiner
A funcionalidade LogMiner (introduzida na verso 8i, mas muito melhorada
na 9i) permite extrair informaes dos Redo Log Files ou Archived Redo Log
Files. Alm das possibilidades oferecidas para Auditoria ( possvel saber
como estavam os dados antes de um dado momento), faz tambm com que
pequenos erros de usurio possam ser revertidos sem a necessidade de
importaes ou paradas de Banco.
Antes que a busca comece, entretanto, deve-se cumprir duas exigncias
bsicas: criar um dicionrio de dados e avisar que dados complementares
devem ser registrados a partir desse momento.
Normalmente, gera-se o dicionrio de dados como um arquivo externo
(caminho indicado pelo parmetro de inicializao UTL_FILE), que deve ser
regularmente copiado para uma rea de back up. Caso UTL_FILE esteja
nulo, algum valor deve receber75:
alter system set utl_file_dir =
'E:\oracle\admin\Acad9\udump' scope=spfile;

Infelizmente, o parmetro recm-alterado no dinmico, o que significa a


obrigatoriedade em fechar a instncia e reabri-la para que a mudana
surta efeito. Veja como faz-lo relembrando o item 19.4.

75

O comando seguinte somente faz sentido caso a instncia tenha sido aberta
com um arquivo de parmetros binrio (SPFILE.ORA). Caso no tenha sido,
altere o arquivo de parmetros texto (INIT.ORA). Para saber mais,
consulte o Captulo 19.

Oracle 9i Fundamental

365

Uma vez fechada e reaberta a instncia, pode-se enfim criar o desejado


Dicionrio de Dados para o LogMiner. Ele conter uma imagem dos
metadados do Banco. Conectado como SYS, faa76:
execute dbms_logmnr_d.build('dictionary.ora',
'e:\oracle\admin\acad9\udump', options =>
dbms_logmnr_d.store_in_flat_file);

Apenas certifique de que nenhum comando DDL esteja sendo executado no


momento da criao do Dicionrio de Dados, pois ele ser desconsiderado
para o LogMiner. Como j dito, periodicamente deve-se resguardar
DICTIONARY.ORA e uma nova verso gerada aps alteraes significativas
nos metadados.

Ateno

Caso no se diga nada em contrrio, as tabelas destinadas ao


LogMiner sero criadas na Tablespace SYSTEM. Para no
sobrecarreg-la, recomenda-se utilizar outra Tablespace, o que
pode ser obtido com o comando:
execute dbms_logmnr_d.set_tablespace('example');

A segunda exigncia bsica consiste em avisar ao Oracle Server que mais


infor-maes devem ser gravadas nos Redo Log Files para que o LogMiner
possa executar seu trabalho:
alter database add supplemental log data;

Este comando permite algumas variaes nas quais possvel aumentar a


quantidade de informaes a ser gravada nos Redo Log Files, objetivando
melhorar o trabalho do LogMiner. Entretanto, isto pode causar problemas
de desempenho.
A partir deste ponto, o trabalho consiste em:
1. Informar o arquivo de busca (Redo ou Archived);
2. Disparar a busca;
3. Realizar a consulta de comandos e, eventualmente, disparar outros
que desfaam o efeito deles, sempre e quando no sejam do tipo DDL
(create, alter, truncate etc.). Neste caso pode-se, no mximo, saber
quem disparou o comando;
4. Encerrar a busca.
Como exemplo, faremos uma atualizao desastrada:
update cursos set preco = 0;
commit;

76

Os comandos deste item esto em 25_Testa_LOGMNR.sql.

Oracle 9i Fundamental

366

O primeiro passo consiste em identificar o Redo Log File em que aconteceu


o fatdico comando e cadastr-lo junto ao LogMiner. Imagine que tenha
sido o Redo Log File corrente:
select member from v$log v inner join v$logfile l
on l.group# = v.group#
where v.status = 'CURRENT';

E uma suposta sada:


MEMBER
------------------------------------------------E:\ORACLE\ORADATA\ACAD9\REDO03.LOG

Agora j possvel informar ao LogMiner onde deve procurar. Conectado


como SYS, faa:
execute dbms_logmnr.add_logfile (options => dbms_logmnr.new,
Logfilename => 'E:\ORACLE\ORADATA\ACAD9\REDO03.LOG');

Opcionalmente, pode-se fornecer mais um arquivo de busca:


execute dbms_logmnr.add_logfile (options => dbms_logmnr.addfile,
Logfilename => 'E:\ORACLE\ORADATA\ACAD9\REDO01.LOG');

E caso no seja mais necessrio, retir-lo:


execute dbms_logmnr.add_logfile (options => dbms_logmnr.removefile,
Logfilename => 'E:\ORACLE\ORADATA\ACAD9\REDO01.LOG');

Ainda como SYS, dispara-se a busca:


execute dbms_logmnr.start_logmnr
(DictFileName => 'E:\oracle\admin\Acad9\udump\dictionary.ora', StartTime =>
to_date('7-Jul-2002 16:00:00', 'DD-MON-YYYY HH24:MI:SS'),
Endtime => to_date('7-Jul-2002 18:00:00', 'DD-MON-YYYY HH24:MI:SS'));

Este comando poderia no consultar o Dicionrio de Dados gerado como


arquivo externo e sim acessar dinamicamente os metadados mais atuais:
execute dbms_logmnr.start_logmnr
(Options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG,
StartTime => to_date('7-Jul-2002 16:00:00', 'DD-MON-YYYY HH24:MI:SS'),
Endtime => to_date('7-Jul-2002 18:00:00', 'DD-MON-YYYY HH24:MI:SS'));

O inconveniente em desconsiderar o arquivo externo est em no poder


acessar comandos que acessaram tabelas que existiam quando o arquivo
foi gerado e agora no existem mais.
Consultando a base gerada77:
select sql_undo from v$logmnr_contents
where username = 'DBAACAD'
and seg_name = 'CURSOS';

E a sada:
SQL_UNDO
77

Liste a estrutura de V$LOGMNR_CONTENTS. Perceba que o campo SQL_REDO


uma imagem do comando desastrado.

Oracle 9i Fundamental

367

-------------------------------------------------------------------------update "DBAACAD"."CURSOS" set "PRECO" = '800' where "PRECO" = '0' and ROWID =
'AAAHZxAAJAAAAB2AAA';

10 linhas selecionadas.

Perceba que os comandos listados podem ser executados para que os


efeitos da operao desastrada sejam revertidos.
Para encerrar uma sesso de buscas com LogMiner, faa:
execute dbms_logmnr.end_logmnr;

Este salutar comando far com que o LogMiner libere recursos previamente
alocados. Antes de comear uma nova busca, devem-se recadastrar os
arquivos Redo ou Achive.

25.4 DBMS_FLASHBACK
Como visto no Captulo 21, pode-se utilizar o pacote embutido
DBMS_FLASHBACK para realizar recuperaes relativamente recentes. Ele
trabalha consultando Segmentos de Undo cujos dados podem ser
preservados por tantos segundos quanto indicado no parmetro
UNDO_RETENTION.
Como no h certeza absoluta de que os dados necessrios estejam nos
Segmentos de Undo78, no se deve confiar cegamente nesse pacote. O ideal
seria combinar sua funcionalidade com outras, para que as probabilidades
de recuperao sejam mximas. Assim, deve-se garantir a execuo de
exportaes lgicas que garantam o resguardo de dados crticos em um
intervalo prximo ao determinado por UNDO_RETENTION. Por exemplo,
caso estime-se o tempo de reteno em cinco horas (18.000 segundos),
poder-se-ia agendar uma exportao lgica das tabelas regularmente
alteradas para, digamos, de quatro em quatro horas.
O problema das exportaes lgicas est em seu carter esttico, ou seja,
se s onze da manh realizou-se uma cpia de uma determinada tabela
permanentemente alterada e aconteceu uma perda s duas, o arquivo
gerado pelo EXP no ter utilidade caso sejam necessrias as alteraes
ocorridas nestas trs horas.
Para estas situaes, recomenda-se a tcnica de Log Miner, que, como
visto, extrai dos Redo Log Files (ou Archived Redo Log Files) os comandos
que permitam reverter os efeitos da perda, sempre e quando no sejam do
tipo DDL.
Perdas que causem indisponibilidade da instncia (quebra de um disco, por
exemplo) no podem ser sanadas com DBMS_FLASHBACK. Pode-se voltar
um Cold Backup ou, melhor, um Hot Backup, que consiste nos arquivos de
78

Lembre-se que ser requisitada a rea destinada ao trabalho de


DBMS_FLASHBACK quando no houver possibilidade de expanso fsica dos
Segmentos de Undo. Tambm ser impossvel qualquer recuperao, caso a
tabela tenha sofrido um comando DDL (Alter, Truncate).

Oracle 9i Fundamental

368

dados e dos Archived Redo Log Files. Melhor do que Cold ou Hot,
entretanto, seria utilizar o Recovery Manager, que proporciona
recuperaes mais geis, j que as cpias produzidas tendem a ser mais
otimizadas.
Como se v, o Oracle oferece vrios recursos de recuperao de dados e o
pacote DBMS_FLASHBACK apenas um deles. Recomenda-se
enfaticamente ao DBA conhec-los todos, para que, em momentos de crise,
possa escolher a tcnica mais adequada, ou seja, que garanta o menor
tempo possvel de inatividade no Banco.

25.5 - Tablespaces Transportveis


A partir da verso 8i introduziu-se a facilidade de copiar dados entre
instncias mais rapidamente do que utilizando exportao/importao. O
processo consiste em:
1. Identificar uma ou mais Tablespaces que possam ser transportadas;
2. Verificar se o transporte possvel. Por exemplo, no se pode levar uma
Tablespace contendo uma tabela que possua uma chave primria cujo
ndice resida numa segunda Tablespace. Veremos um procedimento que
checa a viabilidade de transporte;
3. Fazer com que a(s) Tablespace(s) na origem seja(m) apenas de leitura;
4. Copiar fisicamente os arquivos que constituam a(s) Tablespace(s) origem
para o diretrio em que sero anexados instncia destino;
5. Exportar metadados utilizando EXP;
6. Na instncia destino, importar metadados com IMP;
7. Voltar Tablespaces, na origem e no destino, modalidade de gravao.
Antes de comear os trabalhos, observe o seguinte:
Origem e destino devem ser da mesma plataforma, isto , no possvel
copiar uma Tablespace sob Unix para Windows2000 e vice-versa;
Se origem e destino tiverem tamanhos de bloco diferentes, o destino
deve possuir algum valor para o parmetro DB_XX_CACHE_SIZE,
em que XX representa o tamanho do bloco da origem.
Neste item faremos uma cpia da Tablespace USERS da instncia ACAD9
para outra homnima em TESTE79. Para tornar o exemplo mais
interessante, suponha que a instncia origem possua tamanho de bloco
padro igual a 8KB, enquanto que na destino seja de 4KB. Caso no exista
uma rea na memria de TESTE para blocos de 8KB, temos que cri-la:
79

Supe-se que a instncia TESTE j tenha sido criada e no possua a


Tablespace USERS. Caso ela no exista, pea ao seu DBA para cri-la ou
consulte captulo 26 para criar Bancos de Dados e realizar acessos a mais
de uma instncia.

Oracle 9i Fundamental

369

alter system set db_8k_cache_size = 524288 scope=spfile;

O comando anterior destinou 512KB para blocos de 8KB, mas exige que a
instncia seja fechada e novamente aberta.
Para certificar-se que uma dada Tablespace pode ser transportada, ela deve
ser submetida procedure TRANSPORT_SET_CHECK. Conectado como
SYS em ACAD9, executa-se o comando:
execute dbms_tts.transport_set_check ('USERS', TRUE);

Ele checa a viabilidade do transporte (o segundo argumento informa que


constraints devem ser verificadas tambm). Para consultar o log da rotina
anterior, faa:
select * from transport_set_violations;

Caso no existam empecilhos ao transporte, impediremos que USERS sofra


gravaes enquanto durar o processo de transporte:
alter tablespace users read only;

A seguir, a cpia fsica. Primeiro conecte-se como DBA ao SQL*Plus80 (no


ambiente Windows, geralmente pode ser encontrado via Start, Programs,
Oracle - OraHome90, Application Development, SQL Plus) e execute o
comando sem quebra de linha81:
host copy E:\oracle\oradata\Acad9\USERS01.DBF e:\oracle\oradata\teste\users01.dbf

Ele far com que o arquivo fsico que constitui a Tablespace USERS seja
copiado. Note que poderiam ser vrios, caso houvesse mais de uma
Tablespace por transportar, ou USERS possusse mais de um Data File.
O passo seguinte consiste em gerar metadados:
C:\> exp transport_tablespace=y tablespaces=users file=e:\backup\def_users.dmp

Antes de prosseguir, duas observaes relevantes:


A varivel de ambiente ORACLE_SID deve receber o valor ACAD9.
No Windows2000, execute o programa regedit, localize-a e alterea. Isto far com que no seja necessrio utilizar o host string na
chamada ao EXP;
A gerao de metadados deve acontecer obrigatoriamente em
uma conexo SYS. E voc j sabe que toda conexo com SYS
deve ser como AS SYSDBA, portanto, uma vez digitado o
comando anterior, ser pedido um nome de usurio, ao qual
deve-se responder como:
Sys/senha as sysdba

80

81

Essencialmente SQL*Plus a j conhecida SQL*Plus Worksheet, porm de uma


forma um pouco mais rstica. Historicamente, sempre foi muito utilizada.
Veja algumas dicas de utilizao no Apndice A.
Por favor, ajuste o comando a seguir para que faa sentido em seu
ambiente.

Oracle 9i Fundamental

370

Uma vez gerados os metados com sucesso, USERS em ACAD9 j pode ser
novamente gravada:
alter tablespace users read write;

E que venha a importao:


C:\> imp transport_tablespace=y file=e:\backup\def_users.dmp datafiles=
e:\oracle\oradata\teste\users01.dbf, tablespaces = users tts_owners = (dbaacad,
monick) fromuser = (dbaacad, monick) touser = (dbateste, monick)

Cuja sada seria:


Import: Release 9.2.0.1.0 - Production on Qua Jul 10 12:49:17 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Nome do usurio: sys/senha as sysdba
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the
Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 Production
Arquivo de exportao criado por EXPORT:V09.02.00 via caminho convencional
Prestes a importar metadados do(s) tablespace(s) transportvel...
importao realizada nos conjuntos de caracteres WE8MSWIN1252 e NCHAR AL16UTF16
. importando objetos de DBAACAD para DBATESTE
. importando objetos de MONICK para MONICK
. importando objetos de DBAACAD para DBATESTE
. importando objetos de MONICK para MONICK
. importando objetos de DBAACAD para DBATESTE
Sobre ativao de restries...
Importao encerrada com xito, sem advertncias.

Perceba que:
A varivel de ambiente ORACLE_SID deve ter seu valor alterado
para TESTE;
O parmetro TTS_OWNERS informa os donos de objetos na
Tablespace original;
Graas dupla FROMUSER/TOUSER, pode-se fazer o
mapeamento de usurios;
DBATESTE e MONICK j devem existir em TESTE.
No se esquea que em TESTE, USERS ainda est como READ ONLY.

25.6 - Cold Backup


A maneira mais simples e, freqentemente, mais segura de realizar uma
cpia consiste em fechar a instncia nas formas normal (melhor) ou
imediata; copiar TODOS os arquivos constituintes (Data Files, Redo Log
Files, temporrios, controle, parmetros e senhas) para um local seguro e
depois abri-la novamente.
Quando se fecha uma instncia de maneira normal, garante-se que os
dados esto consistentes e no existem anomalias internas, muito comuns
Oracle 9i Fundamental

371

aps fechamentos abruptos. Em casos extremos, pode ser impossvel abrir


um Banco aps um shutdown abort.
Se por um lado este processo simples, ele no garante que os dados
estaro totalmente atualizados, j que, em caso de recuperao, ser
perdido o trabalho realizado entre o Cold e o momento da perda.
Recomenda-se ter mo um script, que deve ser atualizado a cada novo
arquivo inserido, a ser executado pelo SO e contendo comandos de cpia de
todos os arquivos. Analise o contedo de 25_Gera_Cold.sql:
set echo off pages 0 feed off
spool E:\Usuarios\Eduardo\LivroO9\Scripts\ParteIII\cold.bat
select 'copy '|| name || ' e:\cold ' from v$datafile;
select 'copy '|| name || ' e:\cold ' from v$controlfile;
select 'copy '|| name || ' e:\cold ' from v$tempfile;
select 'copy '|| member || ' e:\cold ' from v$logfile;
select 'copy E:\oracle\database\SPFILEACAD9.ORA e:\cold' from dual;
select 'copy E:\oracle\database\PWDACAD9.ORA e:\cold' from dual;
spool off

Quando executado, criar um arquivo de lote, COLD.BAT, contendo os


comandos de cpia necessrios. Quando houver necessidade de efetuar
uma recuperao a partir de um Cold, basta inverter o processo, ou seja,
com a instncia fechada copiar os arquivos desde a rea de backup para as
posies originais.
Caso se tenha obedecido ao padro OFA, no se deve esquecer que os
arquivos es-taro em discos diferentes.
Observe que NENHUM data file pode ser omitido. Caso falte um, o Banco
no po-der ser reaberto, assim o Script 25_Gera_Cold.sql deve ser
executado sempre que houver alteraes na quantidade de arquivos do
Banco.
Rama Velpuri e Anand Adkoli, no imprescindvel ORACLE 8 BACKUP &
RECOVERY HANDBOOK, na pgina 459, sugerem que os arquivos de log
no sejam copiados, j que podero ser reconstrudos no momento da
abertura do banco (opo RESETLOGS). Contudo, h um seno: esta opo
somente funciona se tiver acontecido um recovery (essencialmente
aplicaram-se transaes que constavam nos Archived Logs), fato que
raramente ocorre ao voltar um Cold. Para zerar o Redo Log File corrente,
faa:
alter database clear logfile group n

Onde n representa o Redo Log File corrente.

25.7 - Hot Backup


25.7.1 - Modo ArchiveLog
O Banco estar em modo ArchiveLog significa que o processo ARCH est
cons-tantemente lendo os Redo Log Files inativos e copiando-os para outro
local. Isto per-mitir operaes de cpia enquanto o Banco estiver aberto, o
que garante dados mais atualizados. Desta forma, um Redo Log File
Oracle 9i Fundamental

372

somente pode ser reutilizado quando o ARCH o tiver liberado. Deve--se


notar que cada arquivo produzido ser uma cpia fiel de algum Redo Log
File.
O aumento de segurana notvel: mesmo que a instncia seja terminada
de forma anormal, o modo ArchiveLog no retirado, pois esta informao
fica nos Control Files.
Existem situaes, contudo, em que no se recomenda a utilizao do
Modo ArchiveLog. Por exemplo, em ambientes de desenvolvimento ou em
Bancos que recebam seus dados a partir de uma aplicao externa. Neste
caso, para remediar uma perda, bastaria refazer a ltima carga.
Em caso de ocorrerem problemas com o modo ArchiveLog, deve-se
consultar ime-diatamente o arquivo de alertas (ALERT_sid.LOG). O espao
em disco utilizado pelo ARCH pode acabar, podem ter ocorrido problemas
fsicos no disco, o processo ARCH pode ter sido derrubado, etc.
Para habilitar o Modo ArchiveLog, deve-se efetuar seis passos:
Alterar os parmetros log_archive_start (true), log_archive_dest
(diretrio de destino para os arquivos gravados por ARCH) e
log_archive_format. Por exemplo82:
alter system set log_archive_start = true scope = spfile;
alter system set log_archive_dest =
'%ORACLE_HOME%\database\archive' scope = spfile;

Fechar o Banco.
Abrir o Banco parcialmente:
startup mount

Cuja sada poderia ser:


Instncia ORACLE iniciada.
Total System Global Area
72424008 bytes
Fixed Size
453192 bytes
Variable Size
58720256 bytes
Database Buffers
12582912 bytes
Redo Buffers
667648 bytes
Banco de dados montado.

Habilitar o Modo ArchiveLog:


alter database archivelog;

Disparar o processo ARCH:


archive log start;

Abrir o Banco:
alter database open;

82

Caso no se esteja utilizando o arquivo binrio de parmetros, deve-se


alterar o correspondente INIT.ORA

Oracle 9i Fundamental

373

Para confirmar a operao:


archive log list;

E a sada:
Modo log de banco de dados
Arquivamento
Arquivamento automtico
Destino de arquivamento
e:\oracle\database\archive
A seqncia de log on-line mais antiga
Prxima seqncia de log a arquivar
Seqncia de log atual

Modo de
Ativado
23
25
25

Outra forma:
select name, log_mode, checkpoint_change# from v$database;
NAME
LOG_MODE
CHECKPOINT_CHANGE#
--------- ------------ -----------------ACAD9
ARCHIVELOG
1368680

Para desabilitar o Modo ArchiveLog, devem-se efetuar o processo inverso:


Alterar os parmetros log_archive_start (false);
Fechar o Banco;
Abri-lo em estado Mount;
Emitir o comando alter database noarchivelog;
Abrir o Banco.

25.7.2 - Hot Backup


Estando o Banco em Modo ArchiveLog, o backup pode acontecer sem
indisponibilizar a Instncia. A cpia feita em nvel de Tablespaces, que
podem continuar sendo acessadas. Evidentemente, esta operao deve,
preferencialmente, acontecer em horrios de pouca atividade no Banco.
O roteiro o seguinte:
a. Cpia fsica das Tablespaces, inclusive SYSTEM:
alter tablespace nome begin backup;
Copiar fisicamente arquivos que constituem a Tablespace para o
diretrio destino;
alter tablespace nome end backup;
b. Cpia fsica dos Archived Redo Log Files:
Interrupo momentnea do Modo ArchiveLog;
Cpia dos Archived Redo Log Files;
c. Cpia fsica dos Control Files.
Durante o processo de cpia, o Servidor encarrega-se de no gravar
diretamente na Tablespace. Recomenda-se no fazer essa operao em
mais de uma Tablespace simultaneamente.

Oracle 9i Fundamental

374

O arquivo 25_Hot.sql fornece um exemplo de backup para o banco


original. Ativa-se o script pelo arquivo 25_FazHot.bat83
rem script que realiza hot backup
rem
rem
conexo
rem
connect / @acad9 as sysdba
rem
rem
limpa hot velho
rem
host del /Q e:\hot\*.*
rem
rem
copia arquivos de tablespaces
rem
host echo SYSTEM
alter tablespace SYSTEM begin backup;
host copy E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF e:\hot
alter tablespace SYSTEM end backup;
host echo UNDOTBS1
alter tablespace UNDOTBS1 begin backup;
host copy E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF e:\hot
alter tablespace UNDOTBS1 end backup;
host echo USERS
alter tablespace USERS begin backup;
host copy E:\ORACLE\ORADATA\ACAD9\USERS01.DBF e:\hot
alter tablespace USERS end backup;
demais Tablespaces
alter system switch logfile;
rem
rem
copia archived redo log files
rem
host echo archived redo log files
archive log stop;
host copy E:\oracle\database\archive\*.* e:\hot
archive log start;
rem
rem
copia control files
rem
host echo Control File
alter database backup controlfile to 'e:\hot\controlfile.bak';
rem
exit
rem
FIM

Observaes

83

Existe muita controvrsia quanto ao momento mais adequado


para eliminar Archived Redo Log Files. Teoricamente, uma vez
realizado o Hot Backup, os Archived Files criados antes do incio

Sempre deve-se evitar a criao de scripts contendo senhas; da a


necessidade de realizar conexes autenticadas pelo SO (mais detalhes em
24.6).

Oracle 9i Fundamental

375

do backup poderiam ser eliminados. Entretanto, pode acontecer


uma fatalidade: o hot backup recm-realizado pode se corromper
ou simplesmente perder-se. Qual seria a sada? Simples-mente
recuperar o Hot anterior com todos os Archived Redos gerados
depois dele, fato que seria impossvel caso eliminssemos
Archived Redos a cada Hot. Portanto, a regra geral consiste em
nunca perder Archived Redo Log Files!84.
Caso sejam acrescentados novos Data Files, esse arquivo deve
ser atualizado.
Perceba que no consta no Script a Tablespace Temporria85.
Isto no chega a ser um problema, j que, caso se perca a
Tablespace temporria, outra pode ser criada. A mesma restrio
aplica-se a Tablespaces que estejam bloqueadas para gravao
(READ ONLY).
O contedo do arquivo que invoca o backup (25_fazhot.bat) pode
ser o seguinte:
sqlplus /nolog @25_hot.sql > e:\saida.txt

Como veremos em breve, a recuperao a partir de um Hot Backup baseiase no Arquivo de Controle mais recente. Da a importncia de existirem
vrias cpias, espalhadas por vrios discos. Relembre o Captulo 19 (item
19.1.2): graas ao parmetro CONTROL_FILES podemos garantir essas
cpias.
Uma tima idia seria agendar a execuo do arquivo anterior para que
ocorra em horrios prefixados. No Windows 2000, tarefas podem ser
agendadas via Start, Programs, Accessories, System Tools, Scheduled
Tasks.

25.7.3 - Recuperao a partir de um Hot Backup


Recuperao (recovery) significa fazer com que os arquivos de um Banco de
Dados estejam em sincronia com seu Arquivo de Controle. Isto acontece
graas ao SCN (System Change Number) presente nos cabealhos dos Data
Files, bem como no Arquivo de Controle. Como vimos no Captulo 19,
atualizam-se SCNs aps a ocor-rncia de checkpoints.
Uma vez constatada a necessidade de recuperao, devem-se analisar as
causas:

84

85

Uma interessante alternativa consiste


em utilizar os parmetros
LOG_ARCHIVE_DEST_x, em que X pode variar entre 1 e 10. No Apndice E,
voltaremos a eles.
Na verdade isto ocorreu porque a Tablespace em questo possua
Gerenciamento de Extents Local. Se fosse baseado em Dicionrio, deveria
constar no Script.

Oracle 9i Fundamental

376

Causa

Fazer

Instncia
derrubada

Nestes casos, a recuperao automtica. O Oracle verifica


os arquivos, sincroniza-os e desfaz transaes no
concludas. Deve-se analisar o arquivo de alerta para buscar
possveis causas.
Basta alterar o parmetro control_files para que
no se faa referncia ao arquivo perdido.
Caso todos tenham sido perdidos, utilize o
Control files
comando alter database backup controlfile to trace;86
e, em seguida:
create control file;

Disco inacessvel
devido
corrupo de
arquivos:

Data files

Recupere arquivo do ltimo backup, coloque o


banco em estado mount, utilize o comando
recover database e abra o banco.
Eventualmente, o banco pode ser aberto sem
um dado arquivo, contanto que ele no possua
dados cruciais. Com o banco em estado mount,
basta emitir o comando:
alter database datafile nome offline drop;

Archived
Redo Log
Files

Comando
inapropriado

Impossvel
recuper-los.
Devem
ser
multiplexados ou constar em discos espelhados.

Roteiro:
a) Fechar o Banco;
b) Recuperar pelo SO os arquivos copiados no ltimo Hot
ou Cold Backup;
c) Abrir o Banco em estado Mount;
d) Ainda no SQL*Plus, usar o comando recover database opo;
e) Abrir o Banco reiniciando os logs: alter database open
resetlogs.
f) Realizar um Cold Backup.

Os Redo Log Files j so naturalmente copiados para Archived Redo Log


Files pelo processo ARCH. Alm disso, as probabilidades de perdas so
menores, j que eles devem ser espelhados para outro disco via
multiplexao.
Evidentemente, se no tiver sido realizado nenhum backup do tipo HOT,
restar apenas o COLD, ainda que ele tambm possa ser utilizado em
conjunto com os Archived Redo Logs, sempre e quando o Banco estiver em
Modo ArchiveLog.
As opes mais importantes do comando recover database so:
86

Tenha em mente que este comando apaga toda e qualquer informao gravada
pelo RMAN, inviabilizando quaisquer recuperaes futuras via RMAN. Faa
quantas cpias for possvel de seu Control File!

Oracle 9i Fundamental

377

UNTIL CANCEL: acontecem recuperaes at que o DBA cancele;


UNTIL TIME: fornecida data/hora limite no formato: YYYY-MMDD:HH24:MI:SS;
UNTIL CHANGE num: nmero do checkpoint;
USING BACKUP CONTROLFILE: indicada quando todos os
Control Files tiverem sido perdidos e seja necessrio recuperar
um do backup.

Em caso de arquivos corrompidos, h ainda mais trs possibilidades:

recover tablespace nome


recover datafile nome
recover logfile nome

25.8 Recovery Manager


25.8.1 - Terminologia
Recovery Manager (RMAN) representa a forma mais inteligente de realizar
cpias de segurana e recuperaes. Trata-se de um programa
independente do Oracle Server, porm interage intensamente com ele. No
fundo, no passa de um conjunto de comandos de alto nvel que lem e
gravam no Control File de um Banco-alvo. Embora possua um aspecto
hostil, recomenda-se enfaticamente investir tempo em seu aprendizado.
Um dos grandes diferenciais do RMAN em relao aos Hots Backups reside
no fato de realizar as operaes em nvel de bloco em vez de arquivo. Desta
forma, ele consegue copiar apenas os blocos que foram alterados desde a
ltima cpia, o que proporciona muito mais velocidade na operao, alm
de viabilizar a migrao de bancos entre plataformas heterogneas.
Antes de conhecermos operaes bsicas possveis com RMAN, vale
esclarecer alguns termos largamente utilizados pelo utilitrio:
Termo

Significado

Target Database

Banco de Dados cujo Arquivo de Controle ser lido ou


gravado para levar a cabo operaes de backup ou
recuperao.

Recovery Database

Banco de Dados em que sero armazenados os metadados


gerados pelo RMAN. Apesar de possvel, no deve coincidir
com o Target Database. Inclusive, o ideal seria cri-lo em
outro Servidor, o que permitiria gerenciar vrios Bancosalvo.

Oracle 9i Fundamental

378

Termo

Significado

Recovery Catalog

Metadados (tabelas, vises, procedures) criados no


Recovery Database a partir do Arquivo de Controle do
Target Database para controlar as operaes de cpia e
recuperao.

Channel Process

Processo (como definido no Captulo 19, item 19.3.2)


criado no Target Database para efetuar uma cpia ou
recuperao. Criado pelo comando allocate channel.

Backup Piece

Arquivo gerado por um backup. Possui formato


proprietrio e pode ser o resultado da combinao de
vrios arquivos fsicos.

Backup Set

Grupo de Backup Pieces.

Cpia

Resultado de um backup, mas com formato


proprietrio. Seria como realizar um Hot Backup.

Restore

Copiar um arquivo fsico desde o local em que foi gravado


o backup at a rea de produo.

Recovery

Procedimento consistindo em recuperar blocos perdidos.

Disk Buffer

reas de memria alocadas para backup ou restore


envolvendo reas em disco.
Durante um backup so alocados para arquivos em disco
sendo lidos. Tambm so utilizados quando o destino do
backup estiver em disco.
Durante um restore so alocados para arquivos em disco
sendo gravados ou lidos, caso o destino do backup esteja
em disco.

Tape Buffer

reas de memria alocadas para backup ou restore


envolvendo reas em fita.
Durante um backup so reas de memria alocadas para
arquivos com destino em fita.
Durante um restore so alocados para arquivos sendo lidos
em fita.

no

Observaes

O RMAN pode ler vrios arquivos simultaneamente para gerar um


Backup Piece. Esta tcnica chama-se Multiplexing.
Dois parmetros desempenham papis primordiais durante os
trabalhos do RMAN: BACKUP_TAPE_IO_SLAVES (dinmico) e
DBWR_IO_SLAVES (esttico).
Quando BACKUP_TAPE_IO_SLAVES possuir o valor TRUE, a
gravao em fita pode ser assncrona, ou seja, enquanto os dados
estiverem sendo gravados em fita, o Processo Servidor responsvel
pela interao com a fita pode desempenhar outras tarefas. Outro
benefcio vem da utilizao da SGA (mais especificamente Large Pool
Oracle 9i Fundamental

379

Area, quando houver valor para LARGE_POOL_SIZE), em vez da


PGA.
J DBWR_IO_SLAVES implementa acessos assncronos a disco
(mais de um em simultneo) e somente pode ser utilizado quando o
disco sendo processado no suportar operaes assncronas e o
valor do parmetro DB_WRITER_PROCESSES (esttico) for maior
que um. Tambm utiliza a SGA em vez da PGA.
Quando o destino de Backups for uma fita, deve existir uma
ferramenta de terceiros capaz de interagir com o RMAN para
viabilizar o acesso. Isto porque o RMAN no capaz de ler ou gravar
diretamente de uma unidade de fita. Na verdade, ele apenas possui
uma API genrica (Oracle SBT API) que deve ser configurada na
ferramenta de terceiros.

25.8.2 - Preparao
Neste item ser preparado o ambiente necessrio para trabalhar com o
RMAN. Assume-se a existncia de outra instncia, TESTE87, que
desempenhar o papel de Recovery Database.
Quando gerou-se a instncia TESTE, foi automaticamente criado um
usurio deno-minado RMAN. Ele j possui os metadados e permisses
necessrios para interagir com o utilitrio RMAN, entretanto sua conta est
bloqueada e a senha expirada:
connect / @teste as sysdba
alter user rman account unlock;

A prxima vez que o usurio RMAN tentar uma conexo, ser pedida uma
nova senha.
Assumindo que o usurio RMAN j tenha validado sua nova senha, o
prximo passo consiste em ativar o utilitrio de linha RMAN e conectar-se
ao que ser o Recovery Database:
C:\ >rman
Recovery Manager: Release 9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
RMAN> connect catalog rman/rman@teste
conectado ao banco de dados do catlogo de recuperao
RMAN>

Observe que o Recovery Catalog j existe e repousa sob domnios do


usurio RMAN. Caso seja necessrio criar os metadados sob outro usurio,
o seguinte comando deve ser aplicado:
RMAN> create catalog;

A seguir, deve-se realizar uma conexo ao Target Database:


RMAN> connect target dbaacad/dbaacad@acad9
87

Pode ser a mesma utilizada para testar a cpia de Tablespaces entre


instncias, assunto discutido no item 25.5

Oracle 9i Fundamental

380

conectado ao banco de dados de destino: ACAD9 (DBID=492139415)


RMAN>

Agora informa-se ao Recovery Catalog que ACAD9 ser seu Target


Database:
RMAN> register database;
banco de dados registrado no catlogo de recuperao
iniciar ressinc. completa do catlogo de recuperao
ressinc. inteira completa
RMAN>

A operao apresentada basicamente fez com que o contedo do Arquivo de


Controle do Target Database fosse transferido para o Recovery Catalog.
Pelo SQL*Plus Worksheet , conectado como RMAN na instncia TESTE,
possvel fazer algumas pesquisas muito interessantes:
select db_key, dbid, name from rc_database;

E a sada:
DB_KEY
DBID NAME
---------- ---------- -------1 492139415 ACAD9

Outra:
select name, CREATION_TIME,
INCLUDED_IN_DATABASE_BACKUP from rc_tablespace;
NAME
-----------------------------CWMLITE
DRSYS
EXAMPLE
INDX
ODM
SYSTEM
TOOLS
UNDOTBS1
USERS
XDB

CREATION
-------12/05/02
12/05/02
12/05/02
12/05/02
12/05/02
12/05/02
12/05/02
12/05/02
12/05/02
12/05/02

INC
--YES
YES
YES
YES
YES
YES
YES
YES
YES
YES

10 linhas selecionadas.

Observe que as Tablespaces pertencem ao Target Database.

25.8.3 - Backup
Voltando ao utilitrio RMAN, existem curiosas maneiras de descobrir que
um determinado Banco precisa de um backup:
RMAN> report need backup days=1;
Relatrio de arquivos cuja recuperao precisa mais de 1 dias de logs arquivados
Arquivo Dias Nome
---- ----- ------------------------------------------1
63
E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF
2
63
E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF
3
63
E:\ORACLE\ORADATA\ACAD9\CWMLITE01.DBF

Oracle 9i Fundamental

381

4
5
6
7
8
9
10

63
63
63
63
63
63
63

E:\ORACLE\ORADATA\ACAD9\DRSYS01.DBF
E:\ORACLE\ORADATA\ACAD9\EXAMPLE01.DBF
E:\ORACLE\ORADATA\ACAD9\INDX01.DBF
E:\ORACLE\ORADATA\ACAD9\ODM01.DBF
E:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF
E:\ORACLE\ORADATA\ACAD9\USERS01.DBF
E:\ORACLE\ORADATA\ACAD9\XDB01.DBF

O seguinte comando efetua uma cpia completa do Banco-alvo:


Run {
Allocate channel ch_1 device type disk format 'e:\backup\%U';
Backup database;
Release channel ch_1;}

Cujo resultado seria:


RMAN> Run {
2> Allocate channel ch_1 device type disk format 'e:\backup\%U';
3> Backup database;
4> Release channel ch_1;}
canal alocado: ch_1
canal ch_1: sid=17 devtype=DISK
Iniciando backup em 14/07/02
canal ch_1: iniciando conjunto de backups do arquivo de dados full
canal ch_1: especificando arquivo(s) de dados no conjunto de backups
Incluindo SPFILE atual no conjunto de backup
incluindo arquivo de controle atual no conjunto de backups
fno=00001 name=E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF do arquivo de dados de entrada
fno=00002 name=E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF do arquivo de dados de entrada
...
fno=00008 name=E:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF do arquivo de dados de entrada
canal ch_1: iniciando o componente 1 em 14/07/02
canal ch_1: componente 1 finalizado em 14/07/02
handle de componente=E:\BACKUP\01DTI6PH_1_1 comentrio=NONE
canal ch_1: conjunto de backups concludo, tempo decorrido: 00:02:57
Finalizado backup em 14/07/02
canal liberado: ch_1
RMAN>

Observaes

88

A instruo run {} indica a existncia de um grupo de comandos.


Nesse caso especfico, deve-se reservar um Channel Process (veja
Terminologia), efetuar a cpia completa e liberar recursos
previamente utilizados88;
No destino foi criado um Backup Piece cujo tamanho resulta
bastante menor do que a soma dos tamanhos dos arquivos fsicos
que o compem;
Caso houvesse mais de um disco destinado a cpias de segurana,
poderiam ter sido alocados mais Channel Processes para acelerar a

Na verdade a alocao de Channel Processes no precisaria ser explcita.


Veja em 25.8.5 como pr-configurar destinos.

Oracle 9i Fundamental

382

cpia (um para cada disco). Neste caso seriam criados dois Backup
Pieces, mas, perdendo um, o Backup Set ficaria inviabilizado;
Se o destino fosse uma unidade de fita e houvesse uma ferramenta
de terceiros configurada para compreender comandos do RMAN, a
requisio do Channel Process mudaria para:
Allocate channel ch_1 device type sbt;

Aps a concluso do Backup completo, a consulta aos arquivos


precisando ser copiados traria o j esperado resultado:
RMAN> report need backup days=1;
Relatrio de arquivos cuja recuperao precisa mais de 1 dia de logs
arquivados
Arquivo Dias Nome
---- ----- ------------------------------------------RMAN>

E pelo SQL*Plus Worksheet , conectado como RMAN na instncia


TESTE, tambm se verifica o sucesso da cpia:
select db_id, backup_type, pieces,
to_char(start_time, 'dd/mm/yy hh24:mi:ss') momento
from rc_backup_set;
DB_ID BACKUP_TYPE
PIECES MOMENTO
---------- -------------------- ---------- ----------------492139415 D
1 14/07/02 17:20:54

Imagine que aps a cpia apresentada tenha-se criado mais uma


Tablespace no Target Database:
create tablespace avaliacoes
datafile 'e:\oracle\oradata\acad9\acadaval.ora' size 10 m;

Para sincronizar o Arquivo de Controle do Target Database e o Recovery


Catalog, utiliza-se o comando resync catalog:
RMAN> resync catalog;
iniciar ressinc. completa do catlogo de recuperao
ressinc. inteira completa

Emitindo os comandos de consulta a metadados, como report, tambm


provoca-se o sincronismo (quando houver diferenas):
RMAN> report schema at time 'sysdate'89;
iniciar ressinc. completa do catlogo de recuperao
ressinc. inteira completa
Relatrio do esquema do banco de dados

89

O comando report schema at time 'sysdate-1'; no traria referncia


Tablespace recm-inserida.

Oracle 9i Fundamental

383

File K-bytes
---- ---------1
409600
2
204800
3
20480
4
20480
5
156800
6
25600
7
20480
8
10240
9
25600
10
39040
11
10240

Tablespace
-------------------SYSTEM
UNDOTBS1
CWMLITE
DRSYS
EXAMPLE
INDX
ODM
TOOLS
USERS
XDB
AVALIACOES

RB segs
------YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO

Nome do Arquivo de Dados


------------------E:\\SYSTEM01.DBF
E:\\UNDOTBS01.DBF
E:\\CWMLITE01.DBF
E:\\DRSYS01.DBF
E:\\EXAMPLE01.DBF
E:\\INDX01.DBF
E:\\ODM01.DBF
E:\\TOOLS01.DBF
E:\\USERS01.DBF
E:\\XDB01.DBF
E:\\ACADAVAL.ORA

A lista de sincronismos efetuados pode ser acompanhada de:


select to_char(RESYNC_TIME, 'dd/mm/yy hh24:mi:ss') Momento from rc_resync;
MOMENTO
----------------14/07/02 17:18:31
14/07/02 17:24:02

Em vez de realizar uma nova cpia completa do Banco-alvo para


resguardar a Tablespace recm-inserida, pode-se apenas copi-la:
Run {
Allocate channel ch_1 device type disk format 'e:\backup\%U';
Backup tablespace avaliacoes;
Release channel ch_1;}

Alm do Target Database completo e de suas Tablespaces, ainda podem-se


realizar cpias em nvel de Data File, Archived Log, Control File ou Backup
Set.

25.8.4 - Recuperao
Imagine que tenha sido criada uma nova tabela, AVALIACOES, na
Tablespace homnima90:
create table avaliacoes
(id_aval number(3) not null,
data_aval date not null,
texto varchar(200)) tablespace avaliacoes;

Suponha tambm que algumas linhas tenham sido inseridas:


insert into avaliacoes values (1, sysdate, 'Boa');
insert into avaliacoes values (1, sysdate, 'Ruim');
insert into avaliacoes values (1, sysdate, 'Excelente');
commit;

Por um contratempo qualquer, o Data File que constitua a Tablespace


Avaliaces perdeu-se. Desta forma, a instncia- alvo deve ser fechada
imediatamente:
RMAN> shutdown immediate

90

Os comandos seguintes encontram-se em 25_Gera_Avaliacoes.sql.

Oracle 9i Fundamental

384

banco de dados fechado


banco de dados desmontado
encerramento de instncia Oracle

Para que possa ser aberta em estado MOUNT:


RMAN> startup mount
conectado ao banco de dados de destino (no iniciado)
instncia Oracle iniciada
banco de dados montado
Total da rea Global do Sistema
72424008 bytes
Fixed Size
Variable Size
Database Buffers
Redo Buffers

453192
58720256
12582912
667648

bytes
bytes
bytes
bytes

Antes de levar a cabo a recuperao, convm checar o estado das cpias


disponveis:
RMAN> crosscheck backup91;
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=13 devtype=DISK
componente de backup submetido a verificao cruzada: localizado como 'AVAILABLE'
handle de componente de backup=E:\ORACLE\DATABASE\04DTIHQQ_1_1 id reg.=4
marcao=467224413
componente de backup submetido a verificao cruzada: localizado como 'AVAILABLE'
handle de componente de backup=E:\BACKUP\05DTIKJM_1_1 id reg.=5 marcao =467227257
componente de backup submetido a verificao cruzada: localizado como 'AVAILABLE'
handle de componente de backup=E:\BACKUP\06DTIL0G_1_1 id reg.=6 marcao =467227664
componente de backup submetido a verificao cruzada: localizado como 'AVAILABLE'
handle de componente de backup=E:\BACKUP\07DTILBT_1_1 id reg.=7 marcao =467228029
Fez a verificao cruzada de 4 objetos

Executando o comando seguinte:


RMAN> recover tablespace avaliacoes;

Teramos o seguinte erro:


Iniciando recover em 14/07/02
utilizando o canal ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569:
=============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 07/14/2002 17:36:29
RMAN-06094: datafile 11 must be restored

Ele aconteceu porque tentamos efetuar uma recuperao sem antes


aplicar a restaurao (veja terminologia em 25.8.1). Sendo assim, requerese a cpia mais recente do arquivo perdido desde a rea de backup at a
rea de produo:
RMAN> restore datafile 11;
Iniciando restore em 14/07/02
91

Perceba que no foi especificado nenhum Channel Process para efetuar o


comando, assim utiliza-se o padro ORA_DISK_1. Voltaremos a ele no item
25.8.5.

Oracle 9i Fundamental

385

utilizando o canal ORA_DISK_1


canal ORA_DISK_1: iniciando restaurao de conjunto de backups de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados para restaurao a partir do
conjunto de backups
restaurando arquivo de dados 00011 para E:\ORACLE\ORADATA\ACAD9\ACADAVAL.ORA
canal ORA_DISK_1: restaurada a parte de backup 1
handle de componente=E:\BACKUP\07DTILBT_1_1 tag=TAG20020714T173349 parms=NULL
canal ORA_DISK_1: restaurar inteiro
Finalizado restore em 14/07/02
RMAN>

Caso tivessem sido gerados Archived Redo Log Files desde o momento do
backup at a restaurao, teramos que executar o comando recover
tablespace avaliacoes para sincronizar a Tablespace com o resto do
Banco.
Agora deve-se abrir o Target Database para que possamos comprovar o
sucesso da recuperao:
RMAN> alter database open;
banco de dados aberto
RMAN>

Comprovando:
SQL> connect dbaacad/dbaacad@acad9
Conectado.
SQL> select * from avaliacoes;

E a resposta:
ID_AVAL
---------1
1
1

DATA_AVA
-------14/07/02
14/07/02
14/07/02

TEXTO
--------------------Boa
Ruim
Excelente

Alm de um Data File, podem-se restaurar um Control File, o banco


completo (opo Database), uma Tablespace ou SPILE. J a recuperao
aplica-se a Data File, Tablespace ou Database (neste caso o Target
Database somente pode ser aberto com a opo RESETLOGS, que faz com
que os Redo Log Files sejam zerados).

Ateno

Aps abrir um Banco com opo RESETLOGS, deve-se efetuar


um backup completo o mais rapidamente possvel, j que os
Archived Redo Logs anteriores perdem sua utilidade.

Para o RMAN, o fato de um Target Database ter sido aberto com


RESETLOGS significa que uma nova incarnation foi criada. O comando
seguinte lista todas as vidas de um banco-alvo:
RMAN> list incarnation;
Lista de Encarnaes de Banco de Dados
Chave de BD Chave Inc Nome do BD ID de BD

SCN de Redefinio de CUR

Oracle 9i Fundamental

386

Hora de Redefinio
------- ------- -------- ---------------- --- ---------- ---------1
15
ACAD9
492139415
NO 190578
30/06/02
1
2
ACAD9
492139415
YES 1686501
14/07/02

A Incarnation key poderia ser utilizada para efetuar recuperaes a partir


de backups gerados antes da abertura com RESETLOGS. Por exemplo:
RMAN> reset incarnation to 15;
RMAN> recover database until time TO_DATE (07/1/02 8:30:00', 'MM/DD/YY
HH24:MI:SS');

25.8.5 - Automao
Uma importante novidade introduzida na verso 9i consiste na
possibilidade de armazenar de forma permanente alguns parmetros que
automatizam operaes de cpia e recuperao. Por exemplo, pode-se
especificar um valor predefinido para os Channel Processes:
RMAN> configure channel 1 device type disk format 'e:\backup\%U';

Agora o comando:
Backup tablespace avaliacoes;

Far com que a cpia v para o diretrio previamente determinado.


Outra configurao bastante recomendvel consiste em automatizar o
Backup do Control File. Assim, sempre que houver uma cpia que tenha
obtido sucesso, o Control File tambm ser resguardado:
RMAN> configure controlfile autobackup on;

A resposta ao pedido de backup da Tablespace Avaliacoes seria:


RMAN> Backup tablespace avaliacoes;
Iniciando backup em 14/07/02
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups do arquivo de dados full
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
fno=00011 name=E:\ORACLE\ORADATA\ACAD9\ACADAVAL.ORA do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 14/07/02
canal ORA_DISK_1: componente 1 finalizado em 14/07/02
handle de componente=E:\BACKUP\09DTIQ3T_1_1 comentrio=NONE
canal ORA_DISK_1: conjunto de backups concludo, tempo decorrido: 00:00:03
Finalizado backup em 14/07/02
Iniciando Control File and SPFILE Autobackup em 14/07/02
handle de componente=E:\ORACLE\DATABASE\C-492139415-20020714-00 comentrio=NONE
Finalizado Control File and SPFILE Autobackup em 14/07/02
RMAN>

Para mostrar todos os parmetros, execute o comando:


RMAN> show all;
os parmetros de configurao RMAN so:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default

Oracle 9i Fundamental

387

CONFIGURE
CONFIGURE
CONFIGURE
CONFIGURE
CONFIGURE
CONFIGURE

DEVICE TYPE DISK PARALLELISM 1; # default


DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CHANNEL 1 DEVICE TYPE DISK FORMAT 'e:\backup\%U';
MAXSETSIZE TO UNLIMITED; # default
SNAPSHOT CONTROLFILE NAME TO 'E:\ORACLE\DATABASE\SNCFACAD9.ORA'; # default

RMAN>

Outra forma de automao bastante interessante consiste em criar scripts.


Por exemplo:
create script completo
{
backup database plus archivelog;
}

O pequeno programa anterior efetua a cpia de todos os arquivos do


Target Database, inclusive Archived Redo Log Files. Para execut-lo, faa:
run { execute script completo; }

Nada impede que possa ser executado a partir do Sistema Operacional.


Suponha que a chamada anterior conste em um arquivo denominado
AVAL.RMAN. Ento:
rman TARGET dbaacad/dbaacad@acad9 CATALOG rman/rman@teste @aval.rman

faria com que fosse executado o Script depois das devidas conexes. Uma
vez concluda a operao, o controle volta ao SO.
Para eliminar um Script, faa:
Delete script 'completo';

25.9 - Concluso
As atividades de cpia e recuperao so extremamente crticas, e somente
o tempo e os possveis dissabores causados pelas perdas daro ao DBA a
serenidade necessria para execut-las sem traumas.
Existem, no entanto, algumas regras que no podem ser desprezadas:
a. Se o Banco de Dados no for meramente de teste, nem os dados sejam
regularmente importados, sempre utilize o Modo ArchiveLog;
b. Seja um especialista em RMAN. Aps aprender o contedo do item 25.8
e fazer TODOS os exemplos e exerccios propostos, ataque a
documentao oficial da Oracle (existem trs manuais sobre o assunto:
Recovery Manager Reference, Quick Reference e Users Guide);
c. Possua mltiplas cpias de Control Files;
d. Multiplexe Log Files;
e. Nunca copie arquivos ativos;
f. Antes de operaes crticas, faa um backup completo.

Oracle 9i Fundamental

388

EXERCCIOS
Para este Laboratrio, supe-se a existncia de duas instncias (ACAD9 e
TESTE). EM ACAD9 deve existir um usurio denominado DBAACAD com
status de DBA e possuindo as tabelas do Controle Acadmico (CURSOS,
TURMAS, ALUNOS, INSTRUTORES e HISTORICO).

Ateno
Realize os exerccios propostos em seguida em um ambiente de testes,
nunca com dados crticos.
Nos exerccios 1 e 2, sero praticadas cpias e recuperaes lgicas.
1. Exporte TURMAS interativamente.
Siga o roteiro:
a. Em uma janela de comando, execute o programa EXP sem
nenhum argumento;
b. Digite usurio e host string separados por @;
c. Digite a senha;
d. Especifique 64000 para o tamanho do buffer;
e. Direcione a sada para TURMAS.DMP. Aceite as demais opes
pressionando enter.
2. Elimine os registros da Tabela TURMAS e depois recupere-a
logicamente.
Execute o utilitrio IMP de forma interativa.
3. Neste exerccio voc conhecer uma limitao do LogMiner: a
impossibilidade da reverso de um comando DDL.
Siga o roteiro:
a. Verifique o contedo do parmetro UTL_FILE_DIR. Veja tambm
se existe um Dicionrio de Dados para o LogMiner. Caso no
exista, ajuste o parmetro e crie o Dicionrio (veja mais detalhes
em 25.3);
b. Reforce o aviso ao Banco que informaes suplementares devem
ser gravadas:
alter database add supplemental log data;

c. Elimine a tabela HISTORICO;


d. Descubra o Redo Log Corrente e, conectado como SYS, cadastreo com:
execute dbms_logmnr.add_logfile (options => dbms_logmnr.new,
Logfilename => 'redo corrente');

e. Dispare a busca, porm informe que comandos DDL devem ser


acompanhados:

Oracle 9i Fundamental

389

execute dbms_logmnr.start_logmnr (DictFileName => 'dicionrio',


StartTime => momento inicial,
Endtime => momento final, Options =>
DBMS_LOGMNR.DDL_DICT_TRACKING);

f. Execute o comando:
select username, sql_undo, sql_redo from v$logmnr_contents
operation = 'DDL';

where

Essa consulta permitir descobrir quem executou um DDL e qual


foi ele (campo SQL_REDO). Perceba que SQL_UNDO est nula.
Faa um Cold Backup a partir do Script gerado com
25_GERA_COLD.SQL:
Se necessrio, ajuste os caminhos dos arquivos;
No se esquea de derrubar a instncia corrente e depois
levant-la novamente.
Limpe as tabelas HISTORICO e TURMAS.
A partir de 25_GERA_COLD.SQL, gere outro Script possuindo
comandos de restaurao.
Restaure as tabelas perdidas utilizando o Script criado no ltimo
exerccio.
Neste exerccio voc vai recuperar a Tablespace temporria.
Siga o roteiro:
a. Feche ACAD9;
b. Elimine o arquivo associado Tablespace TEMP (geralmente
TEMP01.DBF);
c. Abra ACAD9;
Apesar de no ter sido emitida nenhuma mensagem de erro,
aconteceram problemas, j que no existe mais um arquivo que
deveria existir.
d. Constate a ocorrncia de problemas abrindo o arquivo de alertas;
Lembre-se do Captulo 19, item 19.1.5, que o arquivo de alertas
registra avisos e erros. Ao final dele, deve haver algo semelhante
a:

4.

5.
6.
7.
8.

Thu Jul 18 18:45:09 2002


Errors in file e:\oracle\admin\acad9\bdump\acad9_dbw0_1596.trc:
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: 'E:\ORACLE\ORADATA\ACAD9\TEMP01.DBF'
ORA-27041: unable to open file
OSD-04002: no possvel abrir arquivo
O/S-Error: (OS 2) The system cannot find the file specified.

Outra forma de constatar o erro pode ser pedir ao Enterprise


Manager Console para listar os arquivos da Tablespace TEMP.
e. Crie outra Tablespace temporria, digamos TEMP2;
f. Altere a Default Temporary Tablespace para TEMP2:
alter database default temporary tablespace temp2;
Oracle 9i Fundamental

390

g. Elimine a Tablespace temporria original;


h. Feche a instncia corrente de ACAD9, abra-a novamente e
constate que no acontecerem erros no arquivo de alertas.
9. Verifique se o Modo ArchiveLog est ligado. Caso no esteja, ligue-o.
10.
Force uma duplicao dos Archived Redo Log Files.
Trata-se de uma medida bastante salutar, j que existir uma
cpia de cada Archived Redo Log File gerado em outra localidade
(de preferncia situada em um disco fsico diferente):
alter system set log_archive_duplex_dest = 'd:\archives\' scope = both;

11.
Realize um Hot backup de ACAD9
Aproveite o script 25_HOT.SQL.
12.
Provoque a perda da Tablespace USERS, a que contm as tabelas do
Controle Acadmico.
Conectado como DBAACAD, confirme que suas tabelas esto em
USERS:
select table_name, tablespace_name from user_tables;

Feche ACAD9 e elimine o arquivo associado Tablespace USERS.


13.
Recupere a Tablespace USERS.
Siga o roteiro:
a. Restaure o arquivo associado Tablespace, isto , traga-o do
diretrio em que foi gravado o Hot Backup para o de produo;
b. Abra ACAD9 em estado Mount;
c. Emita o comando recover database;
Caso tenham sido gerados Archived Redo Log Files aps o ltimo Hot
Backup, sero pedidos neste momento. Aceite que sejam aplicados
at que no reste nenhum.
d. Abra ACAD9 e constate que DBAACAD recuperou suas tabelas.
Nos exerccios 14 a 19 ser simulada uma perda provocada por impercia
de usurio.
14.
Limpe a Tabela HISTORICO. Anote o nmero do Checkpoint
corrente, ltima seqncia, prxima e corrente.
Utilize o comando archive log list.
15.
Alimente a tabela HISTORICO. Faa novas anotaes
16.
Realize um Hot Backup do Banco.
Atualize anotaes.
17.
Provoque um log switch.
Comando: alter system switch logfile
Oracle 9i Fundamental

391

18.
Limpe a tabela HISTORICO.
19.
Recupere a tabela HISTORICO.
Siga o roteiro:
a. Feche o Banco;
b. Restaure o arquivo associado Tablespace USERS (em que
estava a tabela perdida);
c. Abra o Banco em estado Mount;
d. Emita o comando: recover database until cancel;
e. Se houver apenas um aviso, interrompa, feche o Banco e
recomece.
f. Abra o Banco.
20.
Faa com que tanto o Control File, quanto o arquivo binrio de
parmetros (SPFILE) sejam copiados cada vez que ocorra um backup
pelo Recovery Manager (RMAN).
Basta utilizar a configurao:
configure controlfile autobackup on;

21.
Certifique-se que o destino dos backups realizados pelo RMAN esteja
direcionado para um diretrio conhecido.
Conecte-se pelo RMAN ao Target Database (ACAD9) e ao Recovery
Database (TESTE).
Consulte parmetros armazenados com SHOW ALL. Veja se
aparece: CONFIGURE CHANNEL 1 DEVICE TYPE DISK
FORMAT 'caminho';.
Realize o backup da Tablespace USERS com nvel incremental 1.
Anote o tamanho do Backup Piece gerado.
As cpias incrementais so utilizadas para que seja possvel
copiar apenas os blocos que mudaram entre um backup e outro.
Para gerar uma primeira cpia a ser tomada como base pelas
demais, faa:
backup incremental level = 1 tablespace users;

LEVEL pode variar enre 0 e 4. Ao utilizar o nvel 3, por exemplo,


sero copia-dos todos os blocos alterados desde o ltimo backup
de nvel 0, 1, 2 ou 3.
Para listar de uma forma resumida todos os backups ocorridos
com USERS, faa:

list backup of tablespace users summary;

22.
Inclua um aluno e faa um novo backup de USERS, tambm
incremental. Compare o tamanho do Backup Piece gerado neste
exerccio com o anterior.
23.
Provoque uma inconsistncia nos backups.
Oracle 9i Fundamental

392

Siga o roteiro:
a. Troque o nome do maior arquivo gerado no exerccio anterior;
b. Verifique a consistncia dos backups:
crosscheck backup;

c. Liste backups rfos por meio do comando:


report obsolete orphan;

24.

Observe que ser mostrado o nome antigo do Backup Piece o


qual foi alterado. Caso no seja possvel recuperar a verso
original, podem-se eliminar rfos por meio do comando: delete
obsolete;
Gere uma verso texto do arquivo binrio de parmetros.
Utilize o comando:
restore spfile to pfile 'destino';

Ao abrir o arquivo gerado no Bloco de Notas, certifique-se de que


o texto seja mostrado com quebras de linha.
Realize uma cpia fiel do Data File associado Tablespace USERS.
Utilize o comando:

25.

copy datafile 'arquivo origem' to 'destino';

O arquivo produzido pode ser utilizado numa recuperao fora do


RMAN, j que no possui formato proprietrio. Esta tcnica
proporciona mais segurana em comparao s realizadas via SO
(Cold e Hot), j que acontecem testes de integridade.
Alm de Data Files correntes, ainda possvel fazer cpias de
Data Files, Control Files (corrente ou cpia) ou Archived Redo Log
Files.
26.
Crie uma imagem do Control File corrente.
Utilize o comando:

copy current controlfile to 'destino';

27.

Nos prximos trs derradeiros exerccios, veremos como recuperar a


Tablespace SYSTEM utilizando o Recovery Manager.
Realize um backup completo.
Como o destino j est pr-configurado, basta emitir o comando:
backup database plus archivelog;

28.

Perca SYSTEM.
Derrube a instncia e elimine o arquivo associado Tablespace
SYSTEM. Ao tentar abrir novamente o Banco, a seguinte mensagem
ser mostrada:
Oracle 9i Fundamental

393

RMAN> startup
conectado ao banco de dados de destino (no iniciado)
instncia Oracle iniciada
banco de dados montado
RMAN-00571:====================================================
RMAN-00569: ========= ERROR MESSAGE STACK FOLLOWS =============
RMAN-00571: ===================================================
RMAN-03002: failure of startup command at 07/19/2002 17:49:00
ORA-01157: no possvel identificar/bloquear arquivo de dados 1 - consulte
arquivo de anlise DBWRORA-01110: 1 do arquivo de dados:
'E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF'
RMAN>

29.
Recupere SYSTEM.
Emita os comandos:
Restore tablespace system;
Recover tablespace system;
Alter database open;

REFERNCIA RPIDA
Tarefa

Como fazer

Realizar uma cpia de


segurana lgica

Utilitrio de linha de comando EXP. Para conhecer


seus parmetros, digite: Exp help=y

Realizar uma
recuperao lgica

Utilitrio de linha de comando IMP. Para conhecer


seus parmetros, digite: Imp help=y
Conectado como SYS, execute:

Criar o Dicionrio de
Dados para o LogMiner
em um arquivo externo

execute dbms_logmnr_d.build ('dictionary.ora',


'diretrio em UTL_FILE_DIR', options =>
dbms_logmnr_d.store_in_flat_file);

A criao do Dicionrio de Dados deve acontecer


apenas uma vez, assim como a sinalizao de que
informaes adicionais iro para os Redo Log Files:
alter database add supplemental log data;

Direcionar a criao dos


objetos do LogMiner
para uma Tablespace
especfica

Acrescentar um arquivo
(Redo ou Archived)
busca do LogMiner

Conectado como SYS, execute:


execute dbms_logmnr_d.set_tablespace('ts');

Em que ts representa uma Tablespace destino.


Antes de disparar uma busca pelo LogMiner, devemse registar os arquivos (Redos ou Archived) a serem
utilizados como fonte:
execute dbms_logmnr.add_logfile (options => dbms_logmnr.new,
Logfilename => 'arquivo');

Alm do procedimento NEW, costuma-se utilizar


ADDFILE. Para remover um arquivo, REMOVEFILE.

Oracle 9i Fundamental

394

Tarefa

Como fazer
Existindo um Dicionrio de Dados e tendo sido
cadastrados os arquivos-fonte, dispara-se a busca:
execute dbms_logmnr.start_logmnr
(DictFileName => 'dicionrio', StartTime => to_date('dd-mmm-aaaa
hh:mm:ss', 'DD-MON-YYYY HH24:MI:SS'),
Endtime => to_date(' dd-mmm-aaaa hh:mm:ss', 'DD-MON-YYYY
HH24:MI:SS'));

Disparar uma busca


com o LogMiner

Consultar resultado da
busca do LogMiner

Viso V$LOGMNR_CONTENTS.

Encerrar uma sesso


LogMiner

execute dbms_logmnr.end_logmnr;

Verificar se uma dada


Tablespace pode ser
transportada

A instruo seguinte verifica inclusive constraints:


execute dbms_tts.transport_set_check ('ts', TRUE);

O resultado ser armazenado em:


sys. transport_set_violations

Executar um comando
do SO a partir do
SQL*Plus ou RMAN

Comando HOST

Realizar
Backup.

Feche o Banco, copie os arquivos, reabra o banco.

um

Cold

Recuperao Cold.

Feche o Banco, copie os arquivos para os lugares de


origem, reabra o banco.

Ligar o Modo ArchiveLog.

Siga roteiro de 25.7.1.

Realizar um Hot Online


Backup.

Colocar Tablespaces em estado BACKUP, copiar


seus arquivos, retir-las do estado BACKUP. O
Banco deve estar em Modo ArchiveLog.

Recuperao Hot.

Fechar o Banco, abri-lo em Mount, Comando recover


database, abrir o Banco.

Ativar o RMAN.

Em uma janela de linha de comando faa:


rman TARGET usu/senha@host CATALOG usu/senha@host

Criar o Recovery Catalog


referente ao Target
Database no Recovery
Database.

Comando create catalog. Para registrar o Target,


register database. Para destruir o Recovery Catalog,
comando drop catalog.

Consultar Recovery
Catalog a partir do
SQ7LPlus Worksheet.

Views RC_*. Exemplos: RC_BACKUP_PIECE,


RC_DATABASE, RC_DATAFILE, RC_RESYNC,
RC_TABLESPACE etc.

Consultar
Catalog a
RMAN.

Recovery
partir do

Comandos list e report.


Exemplos:
list backup of tablespace users summary;
report obsolete orphan;

Oracle 9i Fundamental

395

Tarefa

Como fazer

Sincronizar o Recovery
Catalog com o Control
File do Target

Comando resysnc catalog. Exemplo: resync catalog;

Realizar um Backup pelo


RMAN

Comando backup. Exemplo: Backup database;

Restaurar pelo RMAN.

Comando restore. Exemplo: restore tablespace system;

Recuperar pelo RMAN

Comando recover. Exemplo: recover tablespace avaliacoes;

Validar
RMAN

backups

do

Armazenar
configuraes no RMAN

Comando crosscheck backup.


Comando configure.
coman-do show all.

Para

Oracle 9i Fundamental

exibir

configuraes,

396

ANOTAES

Oracle 9i Fundamental

397

Captulo 26 CRIAO DE UM BANCO DE


DADOS
OBJETIVOS

Criar um Banco de Dados no ambiente Windows 2000;


Identificar a criao do Banco;
Criar Host Strings;
Remover um Banco de Dados.

NOVIDADES

O Assistente encarregado da criao, o Database Configuration


Assistant (DBCA), facilitou enormemente a criao de Bancos de
Dados;
Introduziu-se o conceito de Gabarito, que permite criar um
padro que agiliza a criao de vrios Bancos de Dados
possuindo caractersticas semelhantes.

ARQUIVOS NECESSRIOS

Nenhum.

PR-REQUISITOS

Utilizar SQL*Plus Worksheet para realizar acesso a bases Oracle;


Identificar elementos da arquitetura Oracle;
Conhecer os conceitos de Tablespace, Usurio, Schema, Tabela.

TEORIA
26.1 - Fundamentos
muito comum a coexistncia de vrios Bancos de Dados em um Servidor.
A criao depende bastante do SO que est sendo utilizado (Unix, Windows
2000, etc.). Daremos o enfoque Windows 2000.
A criao de um segundo Banco requer alguns cuidados:
Oracle 9i Fundamental

398

Organizao lgica que siga o padro OFA;


Verificao de espao em disco e memria;
Determinao de novas variveis de ambiente: ORACLE_HOME e
ORACLE_SID. Elas podem ser pesquisadas pelo Registry em:
HKEY_LOCAL_MACHINE\
SOFTWARE\ORACLE;
Cpia de todos os Bancos correntes.

Tomadas as precaues citadas, parte-se para a criao propriamente dita:


a. Criar os diretrios nos diversos discos pelos quais o Banco ir se
espalhar;
b. Edio do Arquivo de Parmetros em que constem as caractersticas da
Instncia (nome, utilizao de memria, etc.) e outras do prprio Banco
(tamanho do Bloco padro, por exemplo);
c. Configurar Clientes para que possam se conectar ao novo Banco
(LISTENER.ORA e TNSNAMES.ORA). No Windows 2000 eles esto no
diretrio \oracle\network\admin.

26.2 - Database Configuration Assistant


O Windows 2000 possui uma ferramenta grfica capaz de criar Bancos de
Dados: o Database Configuration Assistant (Start, Programs, Oracle OraHome90, Configu-ration and Migration Tools).
Aps uma tela de boas-vindas ao
lado, surge a primeira
possibilidade de interao:
Escolhendo Criar um banco de
dados, depois pressionando
Prxi-mo, so mostradas telas
interativas nas quais o Banco vai
sendo cons-trudo.

Algumas dicas:
Na tela 2, Gabaritos de Bancos de Dados, so apresentados
diversos modelos contendo parmetros e definies de arquivos.
Se o Banco por criar for de uso genrico, escolha General
Purpose;
Na tela 3, Identificao de Bancos de Dados, so pedidos o
nome e o SID (digitando o primeiro, preenche-se o segundo);
Oracle 9i Fundamental

399

Na tela 4, Opes de Conexo de Banco de Dados, escolhe-se


entre o Modo Dedicado ou Compartilhado (Shared Server - veja
Captulo 19, item 19.3.2.1);
Na tela 5, Parmetros de Inicializao, configuram-se os
parmetros. Nada impede que, uma vez criado o Banco, a
instncia seja aberta com outro Arquivo de Parmetros;
Na penltima tela, Armazenamento de BD, especificam-se os
arquivos (Control, Redo, Data);
Finalmente na ltima, existe a possibilidade de criar efetivamente
o Banco ou simplesmente gerar um Gabarito, que poder ser
utilizado em futuras criaes.
Uma vez criado, o Banco pode ser enriquecido com novas Tablespaces e
seus respectivos segmentos.

Ateno

A varivel de ambiente ORACLE_SID sempre recebe o SID do ltimo


Banco criado. Para acessar outros bancos previamente criados,
deve-se faz-lo utilizando Host Strings, mesmo no Servidor.
Uma conseqncia direta da criao de um novo Database consiste
na criao de um novo Servio, cujo nome ser OracleServiceSID.

26.3 - Net Configuration Assistant


Caso exista mais de uma
instncia em um Servidor,
devem-se obriga-toriamente
criar Host Strings para que
seja possvel conectar-se
que no seja padro (aquela
apontada pela varivel de
am-biente ORACLE_SID).
Para criar um Host String,
car-regue o Net
Configuration Assistant
(tambm em Start, Programs,
Oracle - OraHome92,
Configuration and Migration
Tools), cuja primeira tela
ser:
Escolhendo a terceira opo, Configurao do Nome do Servio de Rede
Local, e pressionando em Prximo, abre-se um leque com cinco
possibilidades: Adicionar, Reconfigurar, Deletar, Renomear e Testar.
Escolhendo a primeira, Adicionar, abre-se a terceira tela na qual se pede
uma carac-terizao quanto verso: Oracle 8i (default) ou anterior.
Oracle 9i Fundamental

400

A quarta tela pedir o nome do Servio, que deve coincidir com a SID por
acessar. A quinta tela pedir o protocolo de comunicao (geralmente
escolhe-se TCP) e a prxima requer o nome do Servidor contendo o Banco
por acessar. Encerra-se o processo, dando a opo de teste.

26.4 - Eliminao de um Banco de Dados


Para destruir um Banco de Dados, tambm se utiliza o Database
Configuration Assistant (opo Deletar um banco de dados da primeira
tela). A destruio ser possvel sempre e quando o Banco estiver aberto,
pois o DBCA realiza uma conexo. Apesar de ser avisado que o Banco ser
destrudo, inclusive Servio e arquivos, nenhum aviso mais srio acontece
caso existam outras sesses abertas.
Caso o Banco excludo seja o padro, deve-se alterar a varivel de ambiente
ORACLE_SID aps a eliminao.

EXERCCIOS
1. Siga as instrues do DBCA e crie um Banco denominado ORC1.
Ao final, analise os diretrios criados, especialmente os arquivos
que constam em CREATE (oracle\admin\SID\create).
2. Cheque o valor das variveis de ambiente ORACLE_SID e
ORACLE_HOME
Ao conectar-se no Servidor, qual Banco pode ter a Host String
omitida?
3. Altere ORACLE_SID para ACAD9.
4. Crie um Host String para realizar conexes a ORC1, caso j no exista
uma.
5. Cadastre o Banco recm-criado no Enterprise Manager Console.

REFERNCIA RPIDA
Tarefa
Criar um
Dados

Como fazer
Banco

de

Carregue o DBCA, escolha a opo Criar um banco


de da-dos e siga as instrues do assistente.

Criar um Host String

Carregue o Net Configuration Assistant, escolha a


opo Configurao do Nome do Servio de Rede
Local e siga as instrues do assistente.

Apagar um Banco de
Dados

Pelo DBCA, escolha a opo Deletar um banco de


dados e siga as instrues do assistente. O servio
deve estar ativa-do e o Banco aberto.

Oracle 9i Fundamental

401

APNDICE A: SQL*PLUS
Antes do advento da SQLPlus Worksheet, introduzida na verso 8i,
os trabalhos envolvendo a liguagem SQL aconteciam primordialmente via
SQL*Plus. Basicamente, a Worksheet conferiu um aspecto um pouco
menos hostil antecessora, j que todos os comandos especficos
(DESCRIBE, START, etc.) de uma podem ser utilizados na outra e vice
versa.
Na verso 9i, com o desaparecimento da ferramenta Server
Manager, a SQL*Plus ainda utilizada para algumas tarefas bastante
especficas tais como a execuo de Scripts que ativem comandos do
Sistema Operacional (comando HOST). Lembre-se, no gigante captulo
24, como aconteceu o Hot Backup.
Existem duas modalidades de utilizao para a SQL*Plus: uma
grfica e outra em modo linha. No Windows 2000, a primeira ativa-se de
forma semelhante Worksheet: Start, Programs, Oracle OraHome90,
Application Development:

Para agilizar a ativao do programa pode-se criar um atalho


(shortcut) na rea de trabalho onde:
Target (alvo)
Start
em)

In

\oracle\bin\sqlplusw.exe
string

usurio/senha@host

(iniciar Algum diretrio contendo Scripts

Uma das grandes dificuldades apresentadas pelo SQL*Plus consiste


em suas parcas opes de edio. A digitao restringe-se a uma rea
Oracle 9i Fundamental

402

bastante limitada (na verdade, apenas onde est o cursor). Caso


cometa-se um erro num comando durante a digitao, no se pode
navegar com teclas de movimentao de cursor para frente ou para trs.
Existem algumas alternativas que amenizam este problema:
Atravs do comando START pode-se disparar arquivos
contendo um conjunto de comandos editado em um editor de
textos tais como o Bloco de Notas;
O comando EDIT carrega o Editor de Textos associado
(geralmente o Bloco de Notas) e permite editar o ltimo
comando SQL emitido. Normalmente este comando produz
um arquivo denominado AFIEDT.BUF;
Pode-se recuperar comandos passados selecionando-os ao
arrastar o mouse sobre eles com o boto esquerdo do mouse
pressionado. Ao terminar a seleo, clica-se o boto direito
do mouse e o contedo selecionado ser transportado para a
rea corrente de edio;
Os comandos que manipulam a rea de transferncia do
Windows so largamente utilizados (Copy, Paste, Cut).
Alm de EDIT, existem outros comandos que manipulam o buffer:
Comando

Descrio

Save arquivo

Grava
contedo
especificado.

Append texto

Incorpora o texto em questo ao final do buffer.

Get arquivo

Sobrepe o buffer com o arquivo especificado.

Run

Executa o contedo
abreviado como /

do

buffer

do

no

buffer.

arquivo

Pode

ser

A modalidade no grfica carece de quaisquer benefcios de edio,


entretanto, permite a utilizao sem realizar conexo alguma. Por
exemplo, recorde o contedo do arquivo de lote 25_FAZHOT.BAT:
C:\> sqlplus /nolog

@25_hot.sql > e:\saida.txt

Observe que ainda dispara-se um Script, 25_HOT.SQL.

Oracle 9i Fundamental

403

APNDICE B: MODELO DE CONTROLE


ACADMICO
A figura abaixo mostra uma representao grfica das tabelas, que
constam do Estudo de Caso trabalhado ao longo do livro, e seus inter-relacionamentos. Note como os campos chave so destacados e a
cardinalidade dos relacionamentos. Por exemplo: a tabela Instrutores
possui o campo cod_instrutor como chave primria e relaciona-se com a
tabela turmas sob cardinalidade 1:N, isto , um instrutor pode ministrar
vrias turmas, porm, cada turma possui apenas um instrutor.

Oracle 9i Fundamental

404

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

Oracle 9i Fundamental

405

APNDICE C: BIBLIOGRAFIA COMENTADA


Ler apenas um livro ou assistir a um curso, por melhor que sejam, no
bastam para for-mar um especialista nos assuntos tratados at aqui.
Necessita-se uma constante formao posterior para aprofundar os temas
apresentados, ou mesmo abrir novas fronteiras.
No material disponvel na Internet existe um arquivo .XLS, Livros_Oracle9i,
que contm, alm dos livros aqui citados, outros mais sobre Oracle9i. No se
trata de uma lista definitiva, e nem poderia, pois o mercado editorial possui
um comportamento extremamente dinmico.
A seguir, mostramos uma relao de obras que, ou ajudaram de forma
marcante o autor na sua empreitada, ou complementam os assuntos
tratados neste livro, para que o leitor possa aprofundar os assuntos aqui
abordados.
1Ttulo:
Autores:
Editora:
Comentrio
s:

ORACLE 9I FOR WINDOWS 2000 - TIPS & TECHNIQUES


Scott Jesse, Matthew Hart, Michael Sale
Osborne/Oracle Press - 2002 Pgs. 637
Por ser dedicado exclusivamente plataforma Windows, logra
abordar assuntos que normalmente so esquecidos. Destaque
para as diferenas nicas na arquitetura do produto utilizado sob
Windows 2000 (cap. 2), detalhes internos da instalao (cap. 4) e
configuraes (cap. 5).
O sexto captulo traz um rico material sobre Recovery Manager.
Vale a pena tambm conferir a Parte IV, na qual comenta como
garantir alta disponibilidade dos dados via Real Application
Clusters (RAC) e Transparent Application Failover (TAF). No deixe
de ler o Captulo 13, onde h valiosas informaes sobre como
implementar Bancos de Dados Standby.

2Ttulo:
Autor:
Editora:
Comentrio
s:

ORACLE 9i - DBA HANDBOOK


Kevin Loney, Marlene Theriault
Oracle Press - 2001
Pgs.
980
Trata-se de um guia bastante completo de apoio atividade do DBA.
Deve estar sempre mo para ser consultado em caso de dvidas.
Esgota os assuntos de uma forma bastante completa, com destaque
abordagem de Configuraes Lgica e Fsica (caps. 3 e 4), Ajustes
de Desempenho (cap. 8), Recovery Manager (cap. 12) e Problemas de
conectividade (Parte III).
J existe a verso traduzida para portugus.

3Ttulo:

ORACLE 8i - BACKUP & RECOVERY HANDBOOK


Oracle 9i Fundamental

406

Autor:

Rama Velpuri, Anand Adkoli

Editora:

Oracle Press - 2000

Comentrio
s:

At meados de julho de 2002 ainda no tinha sido publicada a


verso para 9i, e quando sair, no hesite em adquiri-la.
A recuperao de um Banco danificado representa a atividade de
maior presso para um DBA. E o sucesso dela depende
fundamentalmente da existncia de uma Poltica de Backup
consistente. Este indispensvel livro esgota os recursos oferecidos
pelo Oracle8i para realizar backups e recuperaes.
Destaquem-se os captulos 7 (Recovery Manager), 8 (Replicao) e,
principalmente, o dcimo, em que so discutidos 22 estudos de
caso baseados em fatos reais.

Pgs.

695

4Ttulo:

ORACLE 8i DATABASE ADMINISTRATION

Autor:

Noel Yuhanna

Editora:

Manning Pub Co. - 1999

Comentrio
s:

Sua organizao baseada em casos prticos bastante peculiar e


recomen-dvel para quem j possui alguma vivncia de
administrao de Bancos de Dados. Os onze captulos
subdividem-se em itens do tipo Como posso realizar determinada
tarefa?, o que torna o livro extremamente objetivo.
At meados de julho de 2002 no tinha sido publicada a verso
abran-gendo 9i. J existe verso traduzida, mas ela peca demais
pela utilizao de termos com traduo esdrxula.

Pgs.

528

5Ttulo:

INSTANT ORACLE9I PL/SQL SCRIPTS

Autores:

Kevin Loney, Megh Thakkar, Rachel Carmichael

Editora:

Oracle Press 2001

Comentrio
s:

Oferece inmeros scripts que auxiliam a administrao de Bancos


de Dados. H de tudo um pouco: desde a inspeo de estruturas
de memria, passando pela interdependncia entre tabelas via
chaves estrangeiras e at gerncia de espao em disco.

Pgs.

598

6Ttulo:

ORACLE PERFORMANCE TUNING TIPS & TECHNIQUES

Autores:

Richard Niemiec, Brad Brown, Joe Trezzo

Editora:

Oracle Press 1999

Comentrio
s:

Trata-se de um clssico. O mais completo guia de ajuste de


performance (tuning) j publicado. Destaque para o captulo
dedicado a ndices (2), a consultas (8), PL/SQL (10) e s vises V$
(14).
Espera-se o lanamento da edio abrangendo o 9i para breve.

Pgs.

894

Oracle 9i Fundamental

407

7Ttulo:
Autores:
Editora:
Comentrio
s:

PROJETO DE BANCO DE DADOS - UMA VISO PRTICA


Maurcio Pereira de Abreu e Felipe Nery R. Machado
rica - 1999
Pgs.
324
Apesar de no ser um livro sobre Oracle, constitui excelente
material introdutrio s etapas anteriores construo de bancos
de dados fsicos, em que se destacam a modelagem conceitual e o
M.E.R.
Traz um extenso captulo sobre a linguagem SQL.

8Ttulo:
Autores:
Editora:
Comentrio
s:

ORACLE9I DBA 101


Marlene Theriault, Rachel Carmichael, James Viscusi
Oracle Press - 2002
Pgs.
550
Dedicado ao DBA e ao seu dia-a-dia. Inicia definindo o papel do
DBA e introduz a arquitetura Oracle; a segunda parte apresenta
um interessante captulo (9 - What We Do Daily) que mostra uma
sistematizao no tra-balho do DBA. A terceira parte trata sobre
segurana e a quarta sobre ajustes de desempenho (tuning).

9Ttulo:
Autor:
Editora:
Comentrio
s:

ORACLE9I UNIX ADMINISTRATION HANDBOOK


Donald K. Burleson
Oracle Press - 2002
Pgs.
517
Manual do DBA que trabalha em plataformas Unix (Solaris, HPUNIX, IBM-AIX UNIX e Linux). H vrios scripts valiosos, tanto
Oracle quanto Unix.
Aborda o produto Statspack para capturar estatsticas Unix.

10Ttulo:
Autores:
Editora:
Comentrio
s:

ORACLE9I: A BEGINNER'S GUIDE


Michael Abbey, Michael J. Corey, Ian Abramson
Oracle Press - 2001
Pgs:
515
Sua linguagem simples e direta credencia-o como porta de
entrada ao mundo Oracle. Tenta ser generalista, porm
aprofunda alguns tpicos. Destaque para os captulos 1 (Oracle:
The Company and the Software - traz um belo histrico sobre a
Oracle), 3 (sobre a arquitetura interna), 4 (Database Objects), Parte
III (apoio ao desenvolvedor) e, na Parte IV, destaca-se o captulo 13
(I is for Internet). Vale a pena conferir o captulo 17 (Data
Warehousing) .
Deve ser traduzido em breve.

11Ttulo:

SQL SERVER 2000 FUNDAMENTAL


Oracle 9i Fundamental

408

Autor:
Editora:
Comentrio
s:

Eduardo Terra Morelli


Editora rica - 2001
Pgs.
504
Tambm no trata sobre Oracle, mas de SQL Server, seu maior
concor-rente. Escrito pelo mesmo autor de Oracle 9i
Fundamental, segue o mesmo estilo, com abundncia de dicas,
scripts e exerccios.

12Ttulo:

ORACLE9I XML HANDBOOK

Autor:

Mark Scardinan

Editora:

Osborne - 2001

Comentrio
s:

XML caminha a passos largos para transformar-se na linguagem


padro de intercmbio de dados entre plataformas heterogneas.
Este livro explica, no apenas as estruturas desta importante
linguagem, como tambm aplicaes utilizando Oracle.
Destaque-se a abordagem ao Oracle9i Application Server.

Pgs.

576

13Ttulo:

ORACLE9I SQLJ PROGRAMMING

Autores:

Nirva Morisseau-Leroy, Martin Solomon, Gerald Momplaisir

Editora:

Osborne - 2001

Comentrio
s:

SQLJ uma linguagem que incorpora SQL a Java. Muito utilizada


para desenvolver aplicaes Web. Este livro explica como cri-las
com auxlio do produto Oracle Portal.

Pgs.

608

14Ttulo:

ORACLE9I JDBC PROGRAMMING

Autores:

Nirva Morisseau-Leroy, Martin Solomon, Gerald Momplaisir

Editora:

Oracle Press - 2001

Comentrio
s:

JDBC (Java Database Connectivity), representa mais uma


alternativa de de-senvolvimento de aplicaes que interajam com
Bancos de Dados Oracle. Destaque para a Parte II, na qual se
compara JDBC com PL/SQL e ensina-se a lidar com os preceitos
da Programao Orientada por Objetos. O captulo 10 mostra
como criar Enterprise Java Beans (EJB) e JavaServer Pages (JSP).

Pgs.

608

15Ttulo:

OCP - ORACLE9I CERTIFICATION

Autores:

Chip Dawes et al.

Editora:

Sybex - 2002

Pgs.

Oracle 9i Fundamental

409

Comentrios:

Oferece material de estudo para a certificao em Oracle 9i.


Abordam-se quatro exames:
OCA/OCP: Introduction to Oracle9i SQL (1Z0-007)
OCA/OCP: Oracle9i DBA Fundamentals I (1Z0-031)
OCP: Oracle9i DBA Fundamentals II (1Z0-032)
OCP: Oracle9i Performance Tuning (1Z0-033)
Includos quatro CDs com inmeras questes para treino.

Seja qual for o livro estudado, no se esquea de que a documentao que


vem com o Oracle tambm constitui uma fonte de inestimvel valor. Toda
organizada em forma de hipertexto, permite a busca rpida de assuntos
nem sempre abordados nos livros, tais como: sintaxes completas de
comandos e descrio de parmetros.

Oracle 9i Fundamental

410

APNDICE D: EXEMPLO DE RELATRIO


DE LEVANTAMENTO
Este documento visa estabelecer, em linhas gerais, as medidas que devem
ser toma-das para conhecer e otimizar uma ou mais bases de dados Oracle.
O questionrio seguinte traa um perfil da instalao, algumas medidas
bsicas so sugeridas e, finalmente, mostra-se o script AD.sql (Anlise
Detalhada) que invoca vrios outros.
Questionrio
1)

Qual a configurao de hardware? (CPUs,


memria, discos)

2)

Os discos possuem
redundncia?

3)

Existe algum Servidor destinado a testes?

4)

Existe contrato
Oracle?

5)

Quantas verses distintas do Oracle Server


existem? Quais so elas?

6)

Quantos bancos existem?

7)

Quanto espao em disco atualmente est


destindo aos dados?

8)

Quantas instncias so utilizadas?

9)

Quantos usurios espera-se que utilizem a


base e quantos faro isso de forma
concorrente?

de

algum

nvel

manuteno

com

de

10) Como esto organizadas as Tablespaces?


Seguiu-se o padro OFA?
11) Existe alguma poltica de backup? Qual? H
unidades de fita envolvidas?
12) Existe uma poltica de upgrade de hardware?
13) Qual a configurao de software? (SOs,
ferramentas)
14) Quantas aplicaes usaro a base?
15) Existem roles?
16) Que tipos de aplicaes predominam: OLTP
ou batch?
Oracle 9i Fundamental

411

17) Os dados hoje presentes provm de bases


externas ou de transaes?
18) Existe alguma poltica de manuteno de
Segmentos de Rollback92?
19) Como esto organizadas as Tablespaces?
Quais so gerenciadas localmente e quais so
por Dicionrio de Dados?
20) Existe o hbito de atualizar as estatsticas?
21) ndices so reconstrudos periodicamente?
22) A fragmentao de Segmentos de Dados
verificada com alguma freqncia?
23) Com que freqncia verificam-se o arquivo de
Alertas e o gerado por traces?

Medidas Bsicas
Antes de pensar em qualquer tipo de otimizao, algumas medidas devem
ser tomadas:
Realizar um backup cold.
Analisar o resultado do script AD.sql (Anlise Detalhada).
A otimizao deve comear pelo hardware (CPU, discos), seguir com
a memria, depois com armazenamento e concluir com SQL.
Verificar a relao entre Data Block Buffer Cache e o tamanho do
banco. No deve superar 2%.
Verificar freqncia de log switches.
Verificar presena de gargalos de I/O.
Verificar regras de separao de arquivos, segundo a OFA.
Analisar possibilidade de mecanismos avanados de separao de
dados: RAID e RAW Devices.
AD.sql (Anlise Detalhada)
spool saida.txt
set feedback off
set pagesize 40
set linesize 200
set termout off
prompt ANALISE DIARIA
prompt
column Agora format a20 heading 'Agora:'
select to_char(sysdate,'dd/mm/yyyy hh24:mi ') Agora from dual;

92

Esta questo somente aplica-se


detalhes no Captulo 21.

caso

SMU

no

Oracle 9i Fundamental

esteja

vigente.

Mais

412

prompt
prompt **********************
A Instncia corrente est no ar:
column Startup format a20 heading "ltimo Startup:"
select to_char(logon_time, 'dd/mm/yy hh24:mi:ss') Startup
from sys.v_$session
where sid=1;
prompt
prompt Em dias e horas:
prompt
select SYSDATE-logon_time "Dias", (SYSDATE-logon_time)*24 "Horas"
from
sys.v_$session
where sid=1 ;
@ArquivosParametros
prompt
prompt **********************
Analisa espao disponvel
@Espaco_disponivel
prompt
prompt **********************
Existe algum segmento que no possa realizar a
prxima extenso ?
@Ver_Extent
prompt
prompt **********************
Mostra E/S por arquivo
@CriaHra
prompt
prompt **********************
Mostra Hit Ratio por usurio e Usurios por programa
@CriaHru
prompt
prompt ******** Mostra Extents por Segmento em Tablespaces gerenciadas via Dicionrio
@LeMaiores
prompt
prompt **********************
Acompanhamento dos Segmentos de Rollback
@mostrarbs.sql
prompt
prompt **********************
Tuning de Memria: Percentual de Memria Livre na
Shared Pool
@MemoriaLivre.sql
prompt
prompt **********************
Tuning de Memria: SQL Area
@LibraryCacheReloads.sql
prompt
prompt **********************
Tuning de Memria: Database Buffer Cache
@DataBaseCache.sql
prompt
prompt **********************
Tuning de Memria: Redo Log Buffer
@RedoLogBuffer.sql
prompt
prompt **********************
Tuning de Memria: Ordenaes em disco e memria
@Sorts.sql
prompt
prompt **********************
Distribuio de tabelas
select owner Dono, count(*) Tabelas from dba_tables
group by owner
order by 2 desc;
spool off
set termout on
set feedback on

Todos os arquivos mencionados, inclusive AD.sql, encontram-se no


diretrio HOTS.
Oracle 9i Fundamental

413

Exemplo de sada
Em alguns pontos da sada apresentados em seguida, preferiu-se omitir
detalhes.
ANALISE DIARIA
Agora:
-------------------26/07/2002 16:39
**********************

A Instncia corrente est no ar:

ltimo Startup:
-------------------26/07/02 09:32:21
Em dias e horas:
Dias
Horas
---------- ---------,296724537 7,12138889
**********************

Verso corrente

--------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production


PL/SQL Release 9.2.0.1.0 - Production
CORE
9.2.0.1.0
Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
**********************

Nome do Banco, Data de Criao e Modo Archive

Banco
Data
Modo Archive
--------- -------- -----------ACAD9
30/06/02 ARCHIVELOG
**********************

Tablespaces e Data Files

Tablespace
-----------------------------AVALIACOES
CWMLITE
DRSYS
EXAMPLE
INDX
ODM
SYSTEM
TOOLS
UNDOTBS1
USERS
XDB
**********************

Local/Dic
--------------LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL

Arquivo
-------------------------------E:\ORACLE\ORADATA\ACAD9\ACADAVAL.ORA
E:\ORACLE\ORADATA\ACAD9\CWMLITE01.DBF
E:\ORACLE\ORADATA\ACAD9\DRSYS01.DBF
E:\ORACLE\ORADATA\ACAD9\EXAMPLE01.DBF
E:\ORACLE\ORADATA\ACAD9\INDX01.DBF
E:\ORACLE\ORADATA\ACAD9\ODM01.DBF
E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF
E:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF
E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF
E:\ORACLE\ORADATA\ACAD9\USERS01.DBF
E:\ORACLE\ORADATA\ACAD9\XDB01.DBF

Control Files

Arquivo
-------------------------------------------------E:\ORACLE\ORADATA\ACAD9\CONTROL01.CTL
E:\ORACLE\ORADATA\ACAD9\CONTROL02.CTL
E:\ORACLE\ORADATA\ACAD9\CONTROL03.CTL
**********************

Redo Log Files

Oracle 9i Fundamental

414

Grupo
---------1
2
3

Arquivo
-------------------------------------------------E:\ORACLE\ORADATA\ACAD9\REDO01.LOG
E:\ORACLE\ORADATA\ACAD9\REDO02.LOG
E:\ORACLE\ORADATA\ACAD9\REDO03.LOG

GROUP# SEQUENCE#
Bytes Livres ARC Status
FIRST_CHANGE# TEMPO
---------- ---------- ---------------- --- ------------ ------------- --------------1
20
104,857,600 YES INACTIVE
2539199 26/07/02
08:31:13
2
21
104,857,600 YES INACTIVE
2563506 26/07/02
08:58:26
3
22
104,857,600 NO CURRENT
2588402 26/07/02
09:32:53
**********************

Localizao de Arquivos Trace e Archive

Parmetro
-----------------------------background_dump_dest
log_archive_dest
user_dump_dest
**********************
est ligado

Local
-------------------------------e:\oracle\admin\Acad9\bdump
%ORACLE_HOME%\database\archive
e:\oracle\admin\Acad9\udump

SS: caso o parmetro abaixo seja diferente de zero, o SS

Parmetro
Valor
------------------------------ ---------shared_servers
1
**********************

Parmetros relacionados com a Database Buffer Cache

Bytes destinados a blocos de tamanho padro est em DB_CACHE_SIZE. Caso este valor
ultrapasse 2% do espao utilizado, aumentar o DBC. Os demais valores
(db_xx_cache_size) destinam-se a outros tamanhos de bloco
Parmetro
-------------------db_block_size
db_cache_size
db_16k_cache_size
db_2k_cache_size
db_32k_cache_size
db_4k_cache_size
db_8k_cache_size

Valor
-------------------8192
12582912
0
0
0
0
0

**********************
Parmetro
-------------------db_create_file_dest
log_buffer
optimizer_mode
sga_max_size
shared_pool_size
sort_area_size
spfile

Outros Parmetros interessantes

Valor
-----------------------------------------524288
CHOOSE
72424008
25165824
524288
%ORACLE_HOME%\DATABASE\SPFILE%ORACLE_SID%.ORA

**********************

SGA

Parmetro
Valor
-------------------- -------------------Database Buffers
12,582,912

Oracle 9i Fundamental

415

Fixed Size
Redo Buffers
Variable Size
**********************

453,192
667,648
58,720,256
Propriedades do Banco

Propriedade
-----------------------------DICT.BASE
DEFAULT_TEMP_TABLESPACE
DBTIMEZONE
NLS_LANGUAGE
NLS_TERRITORY
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_CHARACTERSET
NLS_CALENDAR
NLS_DATE_FORMAT
NLS_DATE_LANGUAGE
NLS_SORT
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIME_TZ_FORMAT
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP
NLS_LENGTH_SEMANTICS
NLS_NCHAR_CONV_EXCP
NLS_NCHAR_CHARACTERSET
NLS_RDBMS_VERSION
GLOBAL_DB_NAME
EXPORT_VIEWS_VERSION
**********************

Valor
-------------------------------2
TEMP2
-07:00
AMERICAN
AMERICA
$
AMERICA
.,
WE8MSWIN1252
GREGORIAN
DD-MON-RR
AMERICAN
BINARY
HH.MI.SSXFF AM
DD-MON-RR HH.MI.SSXFF AM
HH.MI.SSXFF AM TZR
DD-MON-RR HH.MI.SSXFF AM TZR
$
BINARY
BYTE
FALSE
AL16UTF16
9.2.0.1.0
ACAD9.US.ORACLE.COM
8

Analisa espao disponvel

Espao Total Livre (MB)


----------------------194.21
Espao Total Alocado (MB)
------------------------934.38
TABLESPACE
MB Livres Total MB
% Livre
-------------------- --------- --------- --------XDB
.19
38.13
.50
EXAMPLE
1.81
166.25
1.09
SYSTEM
8.38
400.00
2.10
TOOLS
3.94
10.00
39.40
UNDOTBS1
89.81
200.00
44.91
DRSYS
10.31
20.00
51.55
CWMLITE
10.63
20.00
53.15
ODM
10.69
20.00
53.45
USERS
23.63
25.00
94.52
AVALIACOES
9.88
10.00
98.80
INDX
24.94
25.00
99.76
**********************
extenso ?

Existe algum segmento que no possa realizar a prxima

**********************

Mostra E/S por arquivo

Total E/S
----------------

Oracle 9i Fundamental

416

161,049
Arquivo
BLOCOS_LIDOS
BLOCOS_GRAVADOS
Total E/S
------------------------------------------------------------------------------------E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF
141614
234
141,848
E:\ORACLE\ORADATA\ACAD9\XDB01.DBF
6526
2
6,528
E:\ORACLE\ORADATA\ACAD9\EXAMPLE01.DBF
5505
12
5,517
E:\ORACLE\ORADATA\ACAD9\DRSYS01.DBF
1859
2
1,861
E:\ORACLE\ORADATA\ACAD9\CWMLITE01.DBF
1671
2
1,673
E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF
137
1053
1,190
E:\ORACLE\ORADATA\ACAD9\ODM01.DBF
1071
2
1,073
E:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF
1068
2
1,070
E:\ORACLE\ORADATA\ACAD9\USERS01.DBF
250
2
252
E:\ORACLE\ORADATA\ACAD9\ACADAVAL.ORA
23
2
25
E:\ORACLE\ORADATA\ACAD9\INDX01.DBF
10
2
12
**********************

Mostra Hit Ratio por usurio e Usurios por programa

Usuarios conectados
------------------11
Username
Estao
Usurio SO
Hit Ratio LOGON
--------------- --------------- --------------- --------- ----SYSTEM
TMORELLI
TMORELLI\Admini
74.96 16:28:49
strator
Programa
Usurios
-------------------- -------ORACLE.EXE
10
******** Mostra Extents por Segmento em Tablespaces gerenciadas via Dicionrio
**********************

Acompanhamento dos Segmentos de Rollback

RBS
WRITES
WRAPS
SHRINKS
EXTENDS Extents
---------- ---------- ---------- ---------- ---------- ------SYSTEM
7248
0
0
0
6
_SYSSMU1$
674038
1
0
1
25
_SYSSMU2$
664838
1
0
1
25
_SYSSMU3$
674356
0
0
0
26
_SYSSMU4$
671504
0
0
0
19
_SYSSMU5$
671760
1
0
1
25
_SYSSMU6$
668560
1
0
1
25
_SYSSMU7$
678906
1
0
1
25
_SYSSMU8$
664866
1
0
1
25
_SYSSMU9$
724916
1
0
1
27
_SYSSMU10$
668654
1
0
1
25
************ Quem est usando ?
*****

Relao de locks. O tempo est em segundos

**********************
Pool

Tuning de Memria: Percentual de Memria Livre na Shared

****************** rea Total


AREA
Bytes Totais
-------------------- ---------------shared_pool_size
25,165,824
large_pool_size
4,194,304
java_pool_size
4,194,304

Oracle 9i Fundamental

417

****************** rea Livre


AREA
Bytes Livres
-------------------- ---------------shared pool
21,999,452
large pool
4,194,304
java pool
4,194,304
**********************

Tuning de Memria: SQL Area

Efetuar tuning na SQL AREA caso o percentual


do gethitratio estiver abaixo do 90%.
%GetHitRatio
-----------98,4403392

Caso o PINHITRATIO fique muito prximo ou superior a 1 (um) indica que


est havendo muito parse de sql que j est em memria
EXECUCOES
RELOADS PINHITRATIO
---------- ---------- ----------91607
35 ,038206687
**********************

Tuning de Memria: Database Buffer Cache

Caso o percentual de Leituras em memria em relao a leitura fsica dos


blocos de dados for menor que 90% existe algum problema no data base
buffer cache.
CACHE HIT RATIO
--------------83,634711
**********************

Tuning de Memria: Redo Log Buffer

Esta rotina verifica o redo log buffer.


Caso o valor seja superior a 1(um) deve-se aumentar o redo log buffer
Percentual
---------0.00000
**********************

Tuning de Memria: Ordenaes em disco e memria

Aumentar parmetro SORT_AREA_SIZE caso o percentual seja maior que


10%
Em disco Em memria Percentual
---------- ---------- ---------0
7,733
0.00000
**********************

Distribuio de tabelas

DONO
TABELAS
-------------------- ---------SYS
342
SYSTEM
132
OLAPSYS
58

Oracle 9i Fundamental

418

DBAACAD
MONICK
XDB
ORDSYS
SCOTT
OUTLN
PM

6
5
5
5
4
3
2

O relatrio apresentado, quando emitido regularmente, permite alimentar


dados histricos que revelem a evoluo do banco. Outras tarefas devem
ser desempenhadas freqentemente:
Verificao do sucesso das cpias de segurana, inclusive para fita;
Eliminao de Archived Redo Log Files que j tenham sido copiados;
Atualizao das estatsticas;
Recriao de ndices;
Consulta ao arquivo de alertas;
Verificao dos arquivos de trace.

Oracle 9i Fundamental

419

ANOTAES

Oracle 9i Fundamental

420

APNDICE E: STANDBY DATABASES


E.1 - Fundamentos
Em locais onde seja necessria a disponibilidade permanente dos dados
recomenda-se a implantao de um Standby Database (Banco de Dados de
Prontido), preferencialmente em outro Servidor fsico. Trata-se de um
recurso oferecido pelo Oracle Server (a partir da verso 7.3), que consiste
em manter dois Servidores trabalhando ininterruptamente; um atuando
como cpia do outro. Caso o principal fique inutilizvel, rapidamente podese disponibilizar o Standby. Com isto, a durao do downtime tende a ser
mnima.
Alm do maior poder de recuperao, a presena de um Servidor Standby
proporciona outra inegvel vantagem: pode-se utiliz-lo como fonte para
emisso de relatrios administrativos. Com isto, alivia-se a carga de
trabalho sobre o principal.
Basicamente o processo consiste em aplicar as transaes armazenadas
nos Archived Redo Log Files do Servidor principal no Standby. Existem trs
modos de operao:
Recovery

Read-Only
Activated

Servidor Standby disponvel apenas para que sejam aplicadas


recuperaes provenientes do principal. Pode estar nos
modos Manual, em que aplicam-se manualmente as
recuperaes, ou Automtico, no qual se transferem os
Archived Redo Log Files automaticamente.
Interrompe-se o modo de recuperao, permitindo consultas.
possvel alternar para o modo Recovery.
Deixa de ser Standby propriamente dito e passa a trabalhar
como um Servidor normal, sem qualquer vnculo com o
principal. No possvel mudar este estado para os
anteriores.

A criao do ambiente com os dois Servidores interligados pode ser levada


a cabo com a funcionalidade Oracle Data Guard, que ainda permite
automatizar diversos aspectos da manuteno dos Servidores Standby
(podem existir at dez). Ela pode ser utilizada via comandos SQL,
parmetros de instncia ou ainda pela ferramenta Data Guard Manager,
disponvel em modo linha de comando ou interface grfica, embutida no
produto Oracle Enterprise Manager.

Oracle 9i Fundamental

421

Neste apndice no abordaremos a Oracle Data Guard. Para conhec-la,


por favor recorra documentao oficial (Oracle 9i Data Guard Concepts
and Administration).
Para que seja possvel implantar uma soluo Standby, alguns requisitos
devem ser atendidos:
Bancos devem ter o mesmo nome;
Ainda que no seja obrigatrio, recomenda-se que a estrutura de
diretrios de ambos Servidores seja idntica;
Antes de iniciar o processo de implantao, j deve existir uma
instncia no Servidor Standby;
Deve-se instalar a mesma verso do Oracle Server em ambos
Servidores;
O Sistema Operacional deve ser o mesmo em ambos Servidores,
inclusive quanto a patches (Services Packs);
O Banco de Dados Principal deve estar em Modo Archive;
A quantidade e o tamanho de Redo Log Files devem ser idnticos em
ambos BDs.

E.2 - Parmetros no Banco Principal


Os Archived Redo Log Files desempenham um papel crtico para os
Standby Databases, j que so responsveis por armazenar as transaes
gravadas nos Redo Log Files. Sendo assim, costuma-se multiplexar os
Archived Logs para minimizar a possibilidade de perdas.
Em
vez
dos
parmetros
LOG_ARCHIVE_DEST
e
LOG_ARCHIVE_DUPLEX_DEST,
costuma-se
utilizar
LOG_ARCHIVE_DEST_n e LOG_ARCHIVE_DEST_STATE_n, em que n pode
variar entre 1 e 10. A seguir, realiza-se tal troca para a instncia ACAD9,
mas em vez de alter-los um a um, acompanha-se o seguinte roteiro
alternativo, conectados como SYS:
Gerar Arquivo de Parmetros Texto a partir do Arquivo de
Parmetros Binrio:
create pfile = 'initacad9.ora' from spfile = 'spfileacad9.ora';

Editar o arquivo texto recm-criado e realizar a troca propriamente


dita93;
Fechar a instncia e abri-la utilizando o Arquivo de Parmetros
Texto:

Shutdown
startup pfile = 'E:\oracle\ora92\database\initacad9.ora'

93

Caso seja utilizado o Bloco de Notas como editor para realizar a troca,
habilite a quebra de linha automtica (Format, Word Wrap).

Oracle 9i Fundamental

422

Atualizar o Arquivo de Parmetros Binrio:


create spfile = 'spfileacad9.ora' from pfile ='initacad9.ora';

Fechar a instncia e abri-la utilizando o Arquivo de Parmetros


Binrio recm-atualizado:
shutdown
startup

O trecho de INITACAD9 em que constariam as definies dos parmetros


LOG_ARCHIVE_DEST_n teria o seguinte aspecto:
*.log_archive_dest_1='LOCATION=E:\oracle\ora92\database\archive MANDATORY'
*.log_archive_dest_2='LOCATION=C:\Dest_Log_2'
*.log_archive_dest_3='LOCATION=D:\Dest_Log_3'
*.log_archive_dest_4='SERVICE=STANDBY'

Observaes
No podem existir brancos ao redor do operador de atribuio (=);
A palavra reservada MANDATORY indica que, enquanto o Archived
Redo Log File no for gerado na citada localizao, o Banco ficar
suspenso. O comportamento padro OPTIONAL, que apenas gera
um aviso caso o Log File no possa ser gravado. Recomenda-se
enfaticamente que exista ao menos um destino mandatrio;
Em vez de gravar um Archived Redo Log File em algum diretrio,
pode-se envi-lo a outro Servidor. Isto, alis, representa a essncia
dos Bancos de Dados de prontido. No exemplo anterior, STANDBY
significa um host string vlido que permite acesso a uma outra
instncia.
O trecho de INITACAD9 em que constariam as definies dos parmetros
LOG_ARCHIVE_DEST_STATE_n teria o seguinte aspecto:
*.log_archive_dest_state_1=ENABLE
*.log_archive_dest_state_2=ENABLE
*.log_archive_dest_state_3=ENABLE
*.log_archive_dest_state_4=DEFER

Observaes
Para cada LOG_ARCHIVE_DEST_n deve existir um
LOG_ARCHIVE_DEST_STATE_n equivalente;
A palavra reservada DEFER indica que os Archived Logs ainda no
precisaro ser gravados no destino associado. Isto desobriga a
instncia Standby de estar disponvel durante a abertura do Banco
de Dados principal, o que no chega a ser um problema, j que o
parmetro dinmico.

Oracle 9i Fundamental

423

E.3 - Parmetros no Banco Standby


Uma vez criada a instncia que desempenhar o papel Standby, seu
arquivo de parmetros tambm deve sofrer algumas alteraes:
STANDBY_ARCHIVE_DEST

Igual ao LOG_ARCHIVE_DEST; representa o local onde


sero depositados os Log Files a serem aplicados.

DB_FILE_NAME_CONVERT

Utilizado caso existam diferenas entre as localizaes


fsicas dos Data Files em ambas instncias.

LOG_FILE_NAME_CONVER
T

Utilizado caso existam diferenas entre as localizaes


fsicas dos Redo Log Files.

Veja como ficaria o trecho do Arquivo de Parmetros do Banco Standby:


*.log_archive_start = true
*.log_archive_dest='D:\oracle\admin\Archive'
*.standby_archive_dest='D:\oracle\admin\Archive'
*.db_file_name_convert =
('E:\ORACLE\ORADATA\ACAD9\XDB01.DBF',
'D:\ORACLE\ORADATA\ACAD9\XDB01.DBF',
'E:\ORACLE\ORADATA\ACAD9\USERS01.DBF',
'D:\ORACLE\ORADATA\ACAD9\USERS01.DBF',
'E:\ORACLE\ORADATA\ACAD9\UNDOTBS01.DBF',
'D:\ORACLE\ORADATA\ ACAD9\UNDOTBS01.DBF',
'E:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF',
'D:\ORACLE\ORADATA\ACAD9\TOOLS01.DBF',
'E:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF',
'D:\ORACLE\ORADATA\ACAD9\SYSTEM01.DBF',
'E:\ORACLE\ORADATA\ACAD9\ODM01.DBF',
'D:\ORACLE\ORADATA\ACAD9\ODM01.DBF',
'E:\ORACLE\ORADATA\ACAD9\INDX01.DBF',
'D:\ORACLE\ORADATA\ACAD9\INDX01.DBF',
'E:\ORACLE\ORADATA\ACAD9\EXAMPLE01.DBF',
'D:\ORACLE\ORADATA\ACAD9\EXAMPLE01.DBF',
'E:\ORACLE\ORADATA\ACAD9\DRSYS01.DBF',
'D:\ORACLE\ORADATA\ACAD9\DRSYS01.DBF',
'E:\ORACLE\ORADATA\ACAD9\CWMLITE01.DBF',
'D:\ORACLE\ORADATA\ACAD9\CWMLITE01.DBF')
db_file_name_convert =
('E:\ORACLE\ORADATA\ACAD9\REDO03.LOG',
'D:\ORACLE\ORADATA\ACAD9\REDO03.LOG',
'E:\ORACLE\ORADATA\ACAD9\REDO02.LOG',
'D:\ORACLE\ORADATA\ACAD9\REDO02.LOG',
'E:\ORACLE\ORADATA\ACAD9\REDO01.LOG',
'D:\ORACLE\ORADATA\ACAD9\REDO01.LOG')

Observao
Perceba que o Banco Standby tambm deve possuir o Modo
ArchiveLog ligado, j que ser necessria a gerao de Archived Log
Files numa eventual migrao do Standby em principal.

E.4 - Implantando Modo Manual


Para implantar o Modo Standby Recovery Manual, deve-se observar o
seguinte roteiro:
Oracle 9i Fundamental

424

1) Copiar Arquivo de Controle do Banco principal, mas com


carctersticas de prontido (no precisa estar conectado como SYS):
alter database create standby controlfile as 'e:\backup\control.bak';

2) Realizar um Cold Backup do Banco principal. Uma vez concluda a


cpia, pode-se abrir novamente o Banco;
3) Copiar para o Servidor Standby os Data Files do Cold Backup
produzido no passo anterior e o Arquivo de Controle gerado no passo
um (NO levar os Redo Log Files). Deve-se levar tambm o Arquivo
de Senhas;
4) Gerar tantas cpias do Control File produzido no passo um quantas
houver no parmetro CONTROL_FILES da instncia Standby.
Naturalmente, os nomes tambm devem ser os mesmos;
5) Caso a instncia Standby esteja aberta, deve ser fechada. Restaurar
os Data Files trazidos no passo trs, bem como os Arquivos de
Controle do quarto passo. Abrir o Banco em modo nomount:
startup nomount;

6) Montar o Banco Standby:


alter database mount standby database;

7) Deixar o banco em estado de recuperao:


recover standby database;

O comando recover l os arquivos que constem no diretrio indicado


pelo parmetro STANDBY_ARCHIVE_DEST.
Para dar continuidade ao processo, devem-se copiar manualmente os
Archived Redo Log Files gerados pelo Servidor principal para o diretrio
indicado em STANDBY_ARCHIVE_DEST. Recomenda-se automatizar de
alguma forma esta transferncia, qui criando um arquivo de lote que
realize a cpia.

E.5 - Implantando Modo Automtico


Antes de implantar o Modo Standby Recovery Automtico, deve-se certificar
a conexo entre o Servidor principal e o Standby, ou seja, deve existir um
host string no principal que represente o Standby. Consulte o Captulo 26,
item 26.3 para criar host strings.
Para implantar o Modo Standby Recovery Automtico, execute os passos 1
a 6 do item E.4 e execute o comando:
recover managed standby database timeout tempo;

Oracle 9i Fundamental

425

Em que tempo representa o intervalo em minutos por esperar at que


"aparea" outro Archived Redo Log File proveniente do Servidor principal.
Resta habilitar a gerao de Archived Redo Log Files no Banco principal
emitindo um comando semelhante a este:
Alter system set log_archive_dest_state_4=ENABLE scope=both;

Uma forma de verificar se a transferncia est acontecendo consiste em


investigar a viso V$LOG_HISTORY. Ela mostra o nmero do ltimo
archive aplicado e deve ser igual em ambos Servidores.
Outro teste:
Anotar ltimo Archive Redo Log File gerado;
Criar tabela no Servidor principal; inserir linhas; commit;
alter system switch

logfile;

Verificar se Archive foi gerado;


Verificar se Archive foi transportado;
Verificar se Archive foi aplicado (V$LOG_HISTORY);
Alguns cuidados devem ser tomados durante a gerncia do processo:
No gere novos Archived Redo Log Files enquanto o Servidor
Standby estiver fechado. Primeiro ele no ser transportado e depois
no ser lido, j que far referncia a um caminho inexistente.
Caso seja gerado um Archive enquanto o Standby estiver fechado, siga o
roteiro:
Em uma outra sesso, conectado como SYS:
recover managed standby database cancel;
shutdown immediate

Recrie o Control File no principal (primeiro passo E.4);


Transporte-o para o Servidor Standby;
Repita o quarto passo de E.4 (cpia e troca de nome do Arquivo de
Controle);
No Servidor Standby crie um diretrio homnimo ao destino dos
Archived Redo Log Files no Servidor de produo. Copie para l os
novos Archived Redo Log Files;
Finalmente, no Standby: recover managed standby database timeout
tempo;
O mais importante perceber que o Standby no pode estar fechado
nunca!

E.6 - Implantando Modo Leitura


Estando o Servidor Standby em Modo Manual, basta emitir o comando:
alter database open read only;

Para voltar ao Modo Standby Recovery Manual, conecte-se como SYS e


emita os comandos:
Oracle 9i Fundamental

426

shutdown immediate
startup nomount
alter database mount standby database;

Copiar Archived Redo Log Files do Servidor principal, e:


recover standby database;

Observe que uma vez derrubada a instncia, o roteiro idntico ao


mostrado E.4, a partir do passo 5. O fato de estar habilitado somente para
leitura evidencia-se no contedo do campo ENABLED da viso
V$DATAFILE.
Estando o Servidor Standby em Modo Automtico, conecte-se como SYS e
emita os comandos:
recover managed standby database cancel;
alter database open read only;

Para voltar ao Modo Standby Recovery Automtico, conecte-se como SYS e


emita os comandos:
shutdown immediate
startup nomount
alter database mount standby database;
recover managed standby database timeout tempo;

E.7 - Desativando Servidor Standby


Quando ocorrer uma perda no Servidor principal cuja, recuperao ter
durao proibitiva, ativa-se o Servidor Standby, que deve ter sido montado
em forma exclusiva (default). Uma vez ativado um Banco que j foi Standby
no mais possvel volt-lo ao Modo Standby, seja Manual ou Automtico.
Para ativar um Banco Standby, acompanhe o seguinte roteiro:
Caso seja possvel, armazene o Redo Log File corrente:
alter system switch logfile;

Mova-o para o Servidor Standby e aplique-o antes de ativar o Banco.


Cancele o modo de recuperao:
recover managed standby database cancel

Emita o comando:
alter database activate standby database;

Derrube a instncia:
shutdown immediate

Se possvel, faa um Cold Backup;


Finalmente:
startup mount
alter database open;

E.8 - Concluses
Oracle 9i Fundamental

427

A tcnica que implementa Bancos de Dados Standby constitui uma tima


deciso a ser tomada em ambientes em que a disponibilidade dos dados for
um fator crtico, entretanto a gerncia do processo resulta algo trabalhoso,
como visto neste apndice. Felizmente, existem outras tcnicas que
tambm propiciam alta disponibilidade dos dados, porm a custos mais
elevados:
Log Transport
Services

Faz com que a criao de Archived Redo Log Files no


Banco de prontido seja automtica e implementada
pelo prprio processo LGWR. Apesar de conferir mais
segurana, paga-se um preo alto de performance.

Oracle Data Guard

Como j comentado, permite automatizar desde a


criao de Bancos Standby at a transformao de
um deles em Banco principal. Deve ser adquirido
parte, no produto Oracle Enterprise Manager.

Replicao

Gera redundncia de dados entre Bancos,


objetivando reduzir distncias fsicas entre clientes e
os dados desejados. Tambm implementada via
Oracle Enterprise Manager, ferramenta Replication
Management Tool.

Real Application
Clusters

Dois ou mais servidores vistos logicamente como um


e compartilhando recursos (memria, disco, cpu,
etc.). Caso um n falhe, os trabalhos no sero
interrompidos. Existem sete manuais sobre o assunto
na Documentao oficial Oracle.

Oracle 9i Fundamental

428

APNDICE F: APOIO NA INTERNET


A Internet hoje, sem dvida alguma, constitui a maior fonte de
conhecimento da humanidade. No existe artigo, livro ou enciclopdia que
possa encerrar a plenitude da Internet, portanto no consult-la constitui
grave desleixo.
O que impressiona na Internet o seu dinamismo. Provavelmente, quando
o leitor estiver lendo este apndice, alguns endereos apresentados em
seguida nem existam mais e outros tenham surgido. Precisaramos ter um
livro tambm dinmico que acompanhasse o ritmo desenfreado da Grande
Rede. Quem sabe os livros, dentro de pouco tempo, no tero tambm este
dinamismo?
Este apndice rene diversos sites que tm correlao com os assuntos
tratados neste livro. No se objetiva apresentar uma lista definitiva de
endereos, fato que seria impossvel devido ao dinamismo j citado.
A pesquisa que resultou nestas listas analisou mais de 100 sites em busca
de informaes complementares ao livro. Recomendo que sejam visitados
aos poucos e alguns, como os que oferecem scripts, recebam visitas
regulares.
Constam vrios sites de fabricantes de ferramentas de apoio ao trabalho do
DBA (BMC, QUEST, EMBARCADERO, etc.). De uma forma geral, todas
permitem realizar download de verses demo, o que deve ser feito para
conhecer melhor as ferramentas.
A ferramenta utilizada foi o AltaVista (www.altavista.com) e a cadeia de
caracteres inicialmente utilizada foi:
database and text:(not book) and (oracle9i) and (article or whitepaper) and (DBA)

Muitos sites foram descobertos a partir de outros; pela experincia do autor


ou extrados de diversas edies da bimestral Oracle Magazine.
www.

Comentrios

Allroundautomations.nl

Oferece o aplicativo PL/SQL Developer.

2.

bmc.com

Dona da famlia de ferramentas Patrol que,


entre outras funes, apia tarefas de
administrao e permite realizar importaes e
exportaes entre bases Oracle e outras.
Destaque para DBXray.

3.

bradmark.com

Comercializa famlia de produtos Norad:


tarefas
de
manuteno
no
banco,
acompanhamento, avisos de problemas.

1.

Oracle 9i Fundamental

429

www.

Comentrios

4.

compuware.com

Famlia de produtos DevPartner que apia o


desen-volvimento e administrao em bases
Oracle. Des-taque para o DBPartner for
Oracle.

5.

datamirror.com

Ferramentas de integrao entre SGBDRs.


Destaque para a dupla DB/XML Transform e
DB/XML Vision.

6.

dbazine.com/ch_oracle.
html

Artigos, links, desafios.

7.

embarcadero.com

DBArtisan: ambiente grfico de apoio ao DBA.

8.

google.com

Imprescindvel ferramenta de busca. Muito til


ao procurar sugestes para erros, j que
devolve sites em que h comentrios sobre a
soluo buscada. Coloque-o na seo de
favoritos.

9.

idevelopment.info

Dicas,
scripts,
certificao.

10.

ioug.com

Pgina oficial do International Oracle Users


Group-Americas.

11.

lazydba.com

Oportunidades de emprego; artigos; scripts.

12.

leccotech.com

SQL
Expert:
identifica
problemas
de
performance e sugere solues. DB Expert:
auxilia o DBA em suas tarefas.

13.

maop.org/sig-dba

Pgina oficial da associao de DBAs MAOP


(Mid
Atlantic
Association
of
Oracle
Professionals): eventos, artigos, scripts, anlise
de livros.

14.

datadirecttechnologies.com

Oferece o DataDirect que substitui com


ganhos o Net8 ou SQL*Net para conexo entre
clientes e servidores.

15.

oracle.com

Porta de entrada para o mundo Oracle.

16.

oracle.com/oramag

Imprescindvel publicao bimestral oficial da


Oracle com assinatura grtis. Traz diversos
artigos que abrangem inmeros tpicos do
mundo Oracle: desde dicas de programao,
tcnicas de utilizao de ferramentas de apoio
na Web at artigos especializados na
administrao de bases de dados.

17.

oraclefans.com

Scripts, dicas, chat, links, anlise de livros,


oportunidades de trabalho.

18.

www.oracle.matrix.
com.br

Pgina nacional com scripts, links, artigos e


dicas.

Oracle 9i Fundamental

links,

sugestes

para

430

www.

Comentrios

19.

orafaq.com

Relao de FAQs sobre inmeros assuntos


relacionados com bases Oracle.

20.

oraworld.com

Possui diversas dicas sobre certificao:


dvidas freqentes, links para cursos on-line;
simulados, etc.

21.

pocketdba.com

Oferece o PocketDBA, ferramenta de apoio ao


DBA a ser executada em hand helds.

22.

precise.com

Ferramentas de otimizao de SQL.

23.

quest.com

Fabricante de diversas ferramentas de apoio


das quais se destacam o SQL Navigator,
utilizado neste livro, e Spotlight. Recomendase enfaticamente o teste desses produtos.

24.

senware.com

Comercializa a ferramenta AutoDBA, que


automatiza diversas tarefas administrativas.

tusc.com

Artigos, anlise de livros, servios de


administrao de dados remota, permite o
download de diversas apresentaes nos
formatos PPT e DOC.

revealnet.com

Foi adquirida pela Quest no final de 2001,


assim acontecer um desvio para a Quest.
Oferece bases de conhecimento para diversos
tpicos,
entre
os
quais
PL/SQL
e
administrao.

27.

searchdatabase.com

Teleconferncias (webcasts), ferramenta de


busca por meio do mecanismo implementado
pelo google (a busca de DBMS_FLASHBACK
resultou em oito entradas), artigos, links,
anlise de livros, dicas.

28.

simulus.com

SIMperformance que avalia a performance


geral.

29.

Softcert.com

Oferece simulados demo para programas de


certificao Oracle (OCA, OCP e OCM).

30.

softwarejobs.com

Newsletter para profissionais em


Sybase; oportunidades de trabalho.

31.

teamdba.com

Links,
dicas,
problemas
comentados,
produtos. Aborda Oracle, Sybase e SQL Server.
preciso cadastro prvio. Associao grtis.

25.

26.

Oracle 9i Fundamental

Oracle,

431

www.

Comentrios

32.

http://otn.oracle.com94

Porta de entrada para o OTN (Oracle Technical


Network) em que so oferecidos exemplos de
cdigo,
artigos
e
scripts,
alm
da
documentao
oficial.
Requer
cadastro
gratuito prvio.

33.

uaex.edu/srea

site da Universidade de Arkansas com dicas,


truques e scripts.

34.

virtualdba.com

Possibilita a consulta e compra de diversos


produtos Oracle, entre outros fabricantes.

35.

wtainc.com/whitepap.htm Artigos

Talvez o site mais importante de todos, aquele que proporciona mais


conhecimento sobre Oracle9i e cujas visitas devem ser regulares, seja o da
documentao oficial:
http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/index.htm

H mais de cem manuais, porm alguns merecem destaque:


Administrators Guide

Tarefas do DBA, criao de Bancos, gerncia de


instn-cias, Arquivos, LogMiner, Tablespaces,
SMU, Tabelas & ndices, Segurana.

Applications
Guide

Grupo de cinco manuais dando


desenvolvimento de aplicaes.

Backup
Concepts

and

Recovery

Sedimenta
conceitos
Recuperao.

sobre

nfase
Backup

ao
e

Concepts

Traz definies sobre inmeros conceitos; tratase de um imenso glossrio enriquecido.

Error Messages

Relao de todas as mensagens de erro e


sugestes de como resolv-las.

Master Glossary

Conjunto de links para demais manuais.

New Features

Novos recursos introduzidos nas verses 9.01 e


9.2.

PL/SQL
Reference

94

Developer

Users

and

Comandos e funes PL/SQL explicados com


sintaxe e exemplos.

Recovery Manager

H trs manuais: Quick Reference, Reference e


Users Guide.

SQL Reference

Comandos e funes SQL explicados com sintaxe


e exemplos.

Supplied PL/SQL Packages


and Type Reference

Relao de Packages embutidos com descries e


exemplos de utilizao.

Este site no acessado com o prefixo http://www. Tambm pode ser


achado a partir de www.oracle.com em Communities.

Oracle 9i Fundamental

432

Utilities

Detalha os principais utilitrios, incluindo IMP e


EXP.

Oracle 9i Fundamental

433

APNDICE G: INSTALAO NO WINDOWS


2000
G.1 - Fundamentos
O presente apndice fornece subsdios instalao Oracle sob Windows
2000. Ela pode acontecer a partir de CDs fornecidos pelo fabricante ou dos
trs arquivos em formato .ZIP disponveis em:
http://otn.oracle.com/software/products/oracle9i/content.html.

Qualquer que seja o mtodo escolhido, pressupe-se que o produto j


tenha sido legalmente adquirido.
Caso se escolha copiar os arquivos disponveis na Internet, devem-se
ressaltar trs pontos: os trs arquivos ocupam juntos 1.338 MB (584, 512 e
242 MB respectivamente); deve-se possuir um registro na Oracle
Technology Network (OTN), alis, gratuito e imprescindvel. Finalmente,
lembre-se que o contedo do site da Oracle possui grande dinamismo,
portanto ningum garante que os arquivos permanecero disponveis para
sempre.
Antes de efetuar a instalao, recomenda-se ler cuidadosamente a
documentao referente ao assunto no manual Installation Guide for
Windows. A verso utilizada foi a 9.2, tambm conhecida como Oracle
Server 9i Release II.

G.2 - Requerimentos de Hardware


Servidor

Cliente

PC baseado em processador Pentium 166 ou


superior.
RAM: mnimo 128 MB; sugerido: 512 MB.
Espao em disco: dependendo da instala-o
escolhida, pode chegar a 4,8 GB (Enterprise
ou Personal Editions em discos FAT). Em
discos NTFS (recomendvel), no passa de 3
GB.

PC baseado em processador
Pentium 166 ou superior.
RAM: mnimo 64 MB, sugerido
128 MB. Para
espao em disco aproximado:
800 MB.

G.3 - Requerimentos de Software


Servidor

Cliente

Windows 2000.
Windows 2000
Recomendvel ltimo Service Pack (exige- superior).
Windows 9x/XP.
se pelo menos o primeiro)
Oracle 9i Fundamental

(Workstation

ou

434

Para ter acesso documentao na Internet, pede-se o Internet Explorer


5.0 ou superior (6.0 para XP).

G.4 - Processo
Siga este roteiro:
Conecte-se ao Windows 2000 como algum membro do grupo de
administradores;
Encerre todas as aplicaes e tambm os servios Oracle, caso
existam;
Insira o primeiro CD de instalao ou execute o arquivo Setup,
presente no diretrio em que esto descompactados os arquivos
provenientes do primeiro ZIP. Uma vez inserido o CD, caso a
instalao no entre imediatamente, execute o programa Setup,
residente na raiz do CD;
Na tela de boas-vindas possvel desinstalar algum produto
existente, ou comear uma nova instalao, clicando em
Prximo;
Informe a origem dos arquivos por instalar e os dados para o
Oracle Home (nome, diretrio de instalao dos produtos e
idioma). Recomenda-se aceitar valores sugeridos. Ao clicar em
Prximo, inicia-se a criao da lista de produtos por instalar.
Ainda possvel escolher o idioma a ser adotado;
Escolhida a opo Oracle9i Database 9.2, pede-se a edio:
Enterprise, Standard ou Personal. Caso a instalao ocorra a
partir dos CDs, estas opes dependero do CD utilizado;
A prxima caixa de dilogo permite caracterizar o banco exemplo.
Pode-se, inclusive, escolher no cri-lo. As telas que seguem
caracterizaro o banco exemplo (nome, sid, diretrio destino,
etc.);
A ltima interao exibe um resumo das escolhas feitas.
A partir deste ponto, os arquivos comearo a ser copiados e os programas,
registrados.

G.5 - Verificao
Existem vrias alternativas para confirmar a instalao:
Ative o programa Universal Installer (Start, Programs, Oracle
Installation Products) e verifique os programas instalados
pressionando em Produtos Instalados:

Oracle 9i Fundamental

435

Painel de Controle, Administrative Tools, Services: confira se o


servio OracleServiceSID (em que SID representa o Banco recmcriado)
est
como
Started.
Verifique
tambm
OracleOraHome92Agent (ele representa o Oracle Home).
Conexes a partir de clientes ou para outras instncias tambm
exigiro o OracleOraHome92TNSListener;
Verifique os programas no menu Start, Programs, Oracle
OraHome92;
Ative o SQL*Plus Worksheet (pasta Application Development) e
conecte-se como usurio SYSTEM, senha fornecida na criao do
banco exemplo, ou a que tenha sido fornecida durante a criao
do Banco.
Supondo que tenha sido criado o Banco de Dados ACAD9, a estrutura de
diretrios gerada ter o seguinte aspecto:

Oracle 9i Fundamental

436

O diretrio \ORACLE recebe a denominao genrica de oracle base; j


\ORACLE\ORA92 ser oracle home (pode existir mais de uma home). Os
arquivos de ACAD9 estaro sob \ORACLE\ORADATA (Data Files),
\ORACLE\ADMIN (alertas, traces) e \ORACLE\ORA92\DATABASE
(parmetros e senhas). Uma vez criado o Banco, nada impede que se
implementem os ditames do padro OFA para melhorar o acesso a disco
(mais detalhes no Captulo 20, item 20.2).

G.6 - Instalao no Cliente


Ao instalar em Clientes Oracle, deve-se escolher o tipo de instalao Client.
Opcionalmente, podem-se instalar as ferramentas de apoio
administrao, tal como Enterprise Manager Console.
Uma vez concluda a instalao, deve-se criar uma Host String, tal como
explicado no Captulo 26, item 26.3.

Oracle 9i Fundamental

437

Vous aimerez peut-être aussi