Académique Documents
Professionnel Documents
Culture Documents
SQL, PL/SQL E
ADMINISTRAO
Oracle 9i Fundamental
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
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
Tamanho
96 KB
734 KB
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)
Kilobyte (KB)
Megabyte (MB)
Gigabyte (GB)
12
Terabyte (TB)
15
Petabyte (PB)
18
Exabyte (EB)
21
Zettabyte (ZB)
24
Yottabyte (YB)
Oracle 9i Fundamental
Oracle 9i Fundamental
Oracle 9i Fundamental
10
Referncia
Rpida:
Oracle 9i Fundamental
11
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
Funes
Funes
Funes
Funes
Funes
de Caracteres ..............................
de Datas ..................................
Numricas ................................
de Converso de Dados ......................
de Grupo .................................
54
55
57
57
60
13
14
121
122
123
123
126
FOR ...........................................
WHILE .........................................
LOOP ..........................................
FORALL........................................
145
146
147
148
15
INSERT ........................................
UPDATE .......................................
Delete .........................................
Mltiplos .......................................
196
196
197
198
16
232
233
233
235
236
237
Parmetros .....................................
Etapas .........................................
Fechando: Shutdown .............................
Abrindo: Startup.................................
242
245
246
247
17
307
308
308
308
309
309
309
18
Terminologia ....................................
Preparao .....................................
Backup ........................................
Recuperao ....................................
Automao .....................................
378
380
381
384
387
401
402
404
406
411
19
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
ARQUIVOS NECESSRIOS
Nenhum.
PR-REQUISITOS
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.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
Projeto Fsico
Atributos
Alunos
Instrutores
Cursos
Oracle 9i Fundamental
24
Campos
Alunos
Histrico
Turmas
Cursos
Instrutores
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
Descrio
Tipo
select
DML
insert
update
delete
DML
commit
rollback
DML
create
alter
drop
DDL
grant
revoke
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
Tabela
Campo
Chave Primria
Chave
Estrangeira
"Sistema de armazenamento de
dados baseado em computador, cujo
objetivo global registrar e manter
informao considerada significativa
organizao" [Date].
Registro
Relacionamento
Linguagem de manipulao de
dados.
Viso
SQL
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
ARQUIVOS NECESSRIOS
Monta_Tabela_Instrutores.sql;
Monta_Tabelas.sql.
PR-REQUISITOS
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
Ateno
Oracle 9i Fundamental
29
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.
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
Observaes
5
6
7
encontra-se
Oracle 9i Fundamental
no
Script
32
Nulo?
Tipo
-------- --------------------------NOT NULL
NUMBER(3)
NOT NULL
VARCHAR2(30)
VARCHAR2(10)
DATE
Oracle 9i Fundamental
33
Observaes
Observaes
34
Observaes
Oracle 9i Fundamental
35
Ateno
Tenha muito cuidado ao emitir um comando que exclua uma coluna!
Lembre-se que os dados nela contidos TAMBM sero eliminados.
36
Descrio
Schema
Tabela
cascade
constraints
Cuidado Ao destruir uma tabela, todos os dados que nela constarem tambm
Oracle 9i Fundamental
37
sero eliminados.
Como esse comando poderia ser alterado para que a eliminao tivesse
sucesso? Somente um comando bastaria?
Dica
38
commit;
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);
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
Number(3)
Oracle 9i Fundamental
40
REFERNCIA RPIDA
Tarefa
Como fazer
Conectar-se ao Oracle
Server
Criar tabela
select constraint_name
from user_constraints
where table_name = 'CURSOS';
Utilize o comando
exemplos em 2.3.
alter
table.
Veja
sintaxe
Utilize o comando
exemplos em 2.4.
drop
table.
Veja
sintaxe
Oracle 9i Fundamental
41
ARQUIVOS NECESSRIOS
Monta_Cursos_Velhos.sql;
Cria_Alimenta_Historico.sql;
Saida_Nao_Formatada.sql.
PR-REQUISITOS
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
Descrio
Distinct
Alias
Expresses
Funes
Tabelas
where
condio
group by
colunas
having
condio
Oracle 9i Fundamental
pelas
colunas
43
Opes
Descrio
Order by
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
Observao
Os campos nome_curso e carga_horaria podem ser mostrados de forma concatenada:
... nome_curso || ' com carga horria: ' || carga_horaria
Os exemplos
sucesso via
executado.
Oracle 9i Fundamental
com
foi
44
Oracle 9i Fundamental
45
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
Like
In
46
Descrio
Or
Operador
unio.
Not
Negao.
Is null
associativo.
Eqivale
uma
Note que a expresso restritiva poderia tambm ter sido escrita como:
where carga_horaria >= 30 and carga_horaria <= 40
Descrio
Like "%cadeia"
Like "_cadeia%"
Like "cadeia%"
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
Cod_instrutor
Nome_instrutor
Ambrsio
Lomncio
Zebedeu
Oracle 9i Fundamental
48
Cod_Turma Cod_Instrutor
Sala
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
T.sala
Ambrsio
Lomncio
Lomncio
Lomncio
Zebedeu
Zebedeu
Zebedeu
Zebedeu
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
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
Oracle 9i Fundamental
51
NOME_INSTRUTOR
SALA
------------------------- ----Maria Carolina Srio
2
Carlos Regulos
Matias Agena
21 linhas selecionadas.
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;
52
Descri
o
Mnim
o
Mxim
o
Barato
3.99
Mdio
4.00
6.99
Caro
7.00
10.00
PR-REQUISITO
-----------------------------------Introduo Lgica de Programao
Introduo Lgica de Programao
Fundamentos da Modelagem de Dados
Oracle: SQL*Plus Worksheet e SQL
Redes I
Oracle 9i Fundamental
53
Descrio
1. Caracteres
2. Datas
3. Numricas
4. Converso
de Dados
5. Grupo
Descrio
lower (cadeia)
upper (cadeia)
initcap (cadeia)
Concat
(cadeia1, cadeia2)
substr (cadeia,
posio, tamanho)
length (cadeia)
Lpad (campo, n, c)
Replace (cadeia,
velho, novo)
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
Funo
Descrio
add_months (data, n)
months_between
data1,data2)
next_day (data,
'dia_semana')
last_day (data)
Sysdate
Dbtimezone
Para que a mudana surta efeito, deve-se reiniciar o Banco. Mais detalhes
no Captulo 19.
Oracle 9i Fundamental
55
Funo
Descrio
Sessiontimezone
Current_Date
Extract
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.
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
Descrio
round (coluna,d)
trunc (coluna,d)
mod (a,b)
sqrt (n)
ceil(num)
floor (num)
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
Descrio
to_char(nmero ou data,
'formato')
to_number(char)
57
Funo
Descrio
to_date(char,['formato'])
Case
Descrio
CC
Sculo.
YYYY, YYY, YY
MM
MONTH
Nome do ms (9 caracteres).
MON
RM
Ms em algarismo romano.
WW ou W
DDD ou DD ou D
DAY ou DY
AM ou PM
Indicador meridiano.
HH ou HH12 ou HH24
MI
Minuto (0-59).
SS ou SSSSS
Segundo (0-59) ou
86399).
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
Exemplo
Resultado
Observaes
999999
1234
099999
001234
idem
$999999
$1234
999999.
99
1234.00
999,999
1,234
MI
999999
MI
1234-
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.
Carga Horria
----------------32
40
Sem carga horria
Sem carga horria
Sem carga horria
24
24
32
24
Sem carga horria
59
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
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.
Oracle 9i Fundamental
60
Descrio
avg (coluna)
Count (coluna)
max (coluna)
min (coluna)
sum (coluna)
Soma dos
coluna.
valores
de
uma
61
10
Operador
Descrio
Union
Oracle 9i Fundamental
62
Operador
Descrio
Intersect
Minus
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
Observe que as tabelas que esto sendo "unidas" devem ter a mesma
estrutura.
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
12
Prefixo
Descrio
USER_
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_
V$
Tab, Cat
Col
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)
CONSTRAINT_NAME
-----------------------------ALUNOS_NOME_NU
ALUNOS_PK
ALUNOS_UF_CH
C
C
P
C
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
Filtrar campos
Filtrar linhas
Agrupar dados
Oracle 9i Fundamental
68
ANOTAES
Oracle 9i Fundamental
69
ARQUIVOS NECESSRIOS
Nenhum
PR-REQUISITOS
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
delete
truncate
table
commit
Oracle 9i Fundamental
70
71
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).
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
Rollback
Fim
sesso
da
72
Comando
DDL
ou DCL
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.
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.
E a sada:
1 linha criada.
Validao completa.
Oracle 9i Fundamental
73
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
Estabelecendo um savepoint:
savepoint inclusao_ok;
Confirmando:
select nome_instrutor from instrutores;
NOME_INSTRUTOR
-----------------------------Maria Carolina Sirio
...
Mrio Alnilam
Nair Mintaka
Oracle 9i Fundamental
74
13 linhas selecionadas.
Resposta:
Rollback completo.
Confirmando:
select nome_instrutor from instrutores;
NOME_INSTRUTOR
-----------------------------Maria Carolina Srio
...
Mrio Alnilam
12 linhas selecionadas.
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
Oracle 9i Fundamental
75
alunos_uf_ch;
Oracle 9i Fundamental
76
REFERNCIA RPIDA
Tarefa
Como fazer
Atualizar campos de
uma tabela
Eliminar linhas de
uma tabela
Finalizar uma
transao, ratificando
as mudanas
Finalizar uma
transao, cancelando
as mudanas
Oracle 9i Fundamental
77
ANOTAES
Oracle 9i Fundamental
78
Captulo 5 RELATRIOS
OBJETIVOS
ARQUIVOS NECESSRIOS
Nenhum
PR-REQUISITOS
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
Descrio
colsep "texto"
feedback
{n | off | on}
linesize n
Oracle 9i Fundamental
80
Comando
Descrio
pagesize n
pause
{on | off | texto}
[ {coluna | alias}
[opes ...] ]
Descrio
cle[ar]
for[mat] formato
hea[ding] "texto"
jus[tify]
alinhamento
81
Opo
Descrio
noprint | print
Null "texto"
Truncated
Wrapped
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.
Oracle 9i Fundamental
82
10 linhas selecionadas.
Oracle 9i Fundamental
83
Descrio
define varivel=valor
define varivel
undefine varivel
Elimina varivel.
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
Oracle 9i Fundamental
84
Sada:
Uf
Mostrando contedo:
prompt &preco_minimo
Sada:
RJ
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
Sada:
COUNT(NOME_ALUNO)
----------------22
SQL> set verify on
Oracle 9i Fundamental
85
0
100
off
' || table_name from cat;
set pagesize 20
set feedback on
set echo on
start x.list
Este script apresentado seria muito til para preencher uma tabela vazia
com a mesma estrutura de INSTRUTORES.
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
Realizar quebras e
clculos em relatrios
Atribuir um contedo
a uma varivel
declarada por
VARIABLE
Listar bind variables
Utilizar variveis em
comandos SQL
Exemplo:
Select * from cursos where preco > :limite;
Oracle 9i Fundamental
88
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
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));
90
Descrio
Unique
ndice
Tabela
Coluna
asc | desc
Oracle 9i Fundamental
91
TURMAS_COD_CURSO_IDX COD_CURSO
22
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
em que:
Opes
Descrio
Replace
Force
Noforce
Subquery
with check
option
with read
only
Oracle 9i Fundamental
93
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,...
16
Oracle 9i Fundamental
94
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);
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
Increment by n
start with n
maxvalue n
minvalue n
95
Opo
Descrio
cycle | nocycle
Cache n | nocache
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.
Constatando:
select cod_curso, nome_curso from cursos;
Sada:
COD_CURSO NOME_CURSO
--------- -----------------------------------------1 Introduo Lgica de Programao
...
11 Oracle: Administrao
Oracle 9i Fundamental
96
Sada:
CURRVAL
--------11
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
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.
em vez de:
select * from dbaacad.cursos
Sada:
SYNONYM_NAME
TABLE_OWNER
-------------------------- -----------------------------CURSOS_DBA
DBAACAD
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
REFERNCIA RPIDA
Tarefa
Como fazer
Criar ndices
Eliminar ndices
Criar views
Eliminar views
Criar sequences
Eliminar
sequences
Criar synonyms
Eliminar
synonyms
Oracle 9i Fundamental
99
ANOTAES
Oracle 9i Fundamental
100
Captulo 7 SUBQUERIES
OBJETIVOS
ARQUIVOS NECESSRIOS
Monta_Tabelas_Salas.sql.
PR-REQUISITOS
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
Tipo
Descrio
Uma Linha
Mltiplas Linhas
Mltiplas Colunas
Correlatas
Descrio
in
not in
any
all
exists
not exists
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
Oracle 9i Fundamental
103
Sada:
NOME_CURSO
CARGA_HORARIA
--------------------------------------------- ------------Delphi: Recursos Bsicos
24
Delphi: Acesso a bancos de Dados
24
Introduo Lgica de Programao
32
Sada:
NOME_CURSO
CARGA_HORARIA
--------------------------------------------- ------------Fundamentos da Modelagem de Dados
40
Oracle 9i Fundamental
104
Sada:
NOME_CURSO
PRECO
--------------------------------------------- --------Redes I
0
Introduo a Sistemas Operacionais
0
Anlise Orientada por Objetos
0
Redes II
0
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
105
<> any
= any
not in
In
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
18
Oracle 9i Fundamental
106
TIPO_SALA
ALUNOS
------------------------------ ---------Luxo
10
Bsica
10
Padro
20
Bsica
10
Padro
10
Luxo
10
Padro
10
Bsica
20
TIPO_SALA
ALUNOS
------------------------------ ---------Padro
20
Bsica
20
Oracle 9i Fundamental
107
TIPO
------------------Bsica
Bsica
Luxo
Padro
Luxo
Bsica
Bsica
Padro
Padro
Luxo
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);
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
ARQUIVOS NECESSRIOS
08_Ex_Proc.sql;
08_Ex_Func.sql.
PR-REQUISITOS
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
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:
111
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
SQL*Plus
SQL*Plus
Worksheet
SQL Navigator
Oracle Forms
Integrante
do
pacote
Developer,
desenvolvimento de aplicaes completas.
permite
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
(opcional)
Function
Package
Trigger
114
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
Oracle 9i Fundamental
115
E a sada:
OBJECT_NAME
---------------------------------------------------------ALIMENTAHISTORICO
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
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
Exibindo:
print em_dolares
EM_DOLARES
---------370,37037
Outra forma:
select ValorEmDolar(2000, 2.70) from dual;
VALOREMDOLAR(2000, 2.70)
----------------------740,740741
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));
Oracle 9i Fundamental
118
REFERNCIA RPIDA
Tarefa
Como fazer
Eliminar uma
procedure
Eliminar uma
function
Listar procedures ou
functions criadas
Listar o cdigo-fonte
das procedures ou
functions criadas
Oracle 9i Fundamental
119
ARQUIVOS NECESSRIOS
08_Ex_Proc.sql;
08_Ex_Func.sql.
PR-REQUISITOS
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
21
Oracle 9i Fundamental
121
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:
Oracle 9i Fundamental
123
EXERCCIOS
1. Ative o SQL Navigator e conecte-se ao Servidor.
Novas conexes podem ser obtidas pelo comando
Session.
Session, New
Oracle 9i Fundamental
124
REFERNCIA RPIDA
Tarefa
Como fazer
Conectar-se ao Servidor
Ativar
editores
ambiente
do
Localizar um objeto
Ativar o Help
Oracle 9i Fundamental
125
Captulo 10 VARIVEIS
OBJETIVOS
ARQUIVOS NECESSRIOS
10_Vetores.sql;
10_Escopo.sql.
PR-REQUISITOS
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
Tipo
Endereo
126
transparente ao programador.
Contedo
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).
Descrio
Char (n)
Varchar2 (n)
Long
Raw e
Long raw
Tipos antigos que devem ser migrados para blob assim que
possvel.
Oracle 9i Fundamental
127
Tipo
Descrio
Number (p,e)
Binary_
Integer
Date
Timestamp
Interval Year
(p) to month
Interval Day
(dp) to second
(sp)
Boolean
Oracle 9i Fundamental
128
cursos.preco%type := 200;
:= total_arrecadado + 300;
:= (idade >=65);
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.
cursos%rowtype;
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.
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;
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
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
Declarar uma
com-posta
varivel
Oracle 9i Fundamental
133
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
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
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;
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;
Oracle 9i Fundamental
136
9.
10.
11.
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.
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.
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
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.
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);
REFERNCIA RPIDA
Tarefa
Como fazer
Atualizar um ou mais
campos em uma ou mais
linhas
Executar comandos
inter-namente
a
procedure ou funo
DDL
uma
Oracle 9i Fundamental
141
Captulo 12 pl/sql:pl
OBJETIVOS
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
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
Sendo a sada:
Medio
Observaes
Oracle 9i Fundamental
143
:=
Oracle 9i Fundamental
144
15.
16.
17.
18.
19.
20.
'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.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.
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
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.
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
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.
Comprovando:
select count(*) from historico;
COUNT(*)
--------12
Observaes
147
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.
Comprovando:
select count(*) from historico;
COUNT(*)
--------30
Observaes
24
Oracle 9i Fundamental
148
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
O que faz
Atalho
Continue
Execuo normal.
Run to Cursor
Executar at o cursor.
Trace Into
Step Over
Trace Out
Abort Execution
Interromper execuo.
Add Watch
Toggle
Breakpoint
Estabelecer
(Breakpoint).
Pause Auto
Stepping
um
F4
ponto
Shift + Ctrl +
F9
de
Oracle 9i Fundamental
parada
F5
Ctrl + Alt + P
150
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
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
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
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;
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
sql%found
sql%notfound
sql%isopen
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;
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.
fetch
close
Fecha o cursor.
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;
Observaes
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
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.
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.
159
Observaes
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
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
Atualizar linhas de
uma tabela via
cursor
Oracle 9i Fundamental
162
Captulo 14 EXCEES
OBJETIVOS
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
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
No predefinidas
25
Erro
Nome
Observaes
ORA-00001
DUP_VAL_ON_INDEX
Oracle 9i Fundamental
164
ORA-01403
NO_DATA_FOUND
ORA-01012
NOT_LOGGED_ON
ORA-01422
TOO_MANY_ROWS
ORA-01476
ZERO_DIVIDE
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
Observaes
BEGIN
DBMS_OUTPUT.PUT_LINE(Retorna_Info_Curso_Tratada(48));
END;
e a sada:
Nenhum curso possui Carga Horria especificada
166
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
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;
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.
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.
Oracle 9i Fundamental
169
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Observaes
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
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.
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
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
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)
Corpo
(Package Body)
26
Oracle 9i Fundamental
174
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.
Observaes
Oracle 9i Fundamental
175
RETURN datatype;
END package_name ;
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.
Observaes
176
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
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.
178
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
*****************************************************
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
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
DBMS_LOB
Permite a manipulao de grandes estruturas de dados (LOB Large Object). Mais detalhes em 15.5.2
DBMS_ALERT
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
Job Queue
Agenda
180
Remove
Exclui um job.
Change
Broken
Run
Executa um job.
Oracle 9i Fundamental
181
Observaes:
'dd/mm/yy
hh24:mi')
"PRXIMA
VEZ",
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
Getlength
Writeappend
Read
Open
Close
IsOpen
Substr
Instr
Erase
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
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
Oracle 9i Fundamental
184
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.
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
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.
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.
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.
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
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.
188
Oracle 9i Fundamental
189
REFERNCIA RPIDA
Tarefa
Como fazer
Criar uma
Especificao de
Package
Criar um Corpo de
Package
Criar um job
Manipular LOBs
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
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
Oracle 9i Fundamental
192
Tipo
Ao
Escopo
Tempo
Pela definio vista anteriormente, podem existir para uma dada tabela
doze tipos diferentes de Triggers DML:
Ao
Escopo
Tempo
1. INSERT
BEFORE
2. INSERT
AFTER
3. INSERT
STATEMENT
BEFORE
4. INSERT
STATEMENT
AFTER
5. UPDATE
BEFORE
6. UPDATE
AFTER
7. UPDATE
STATEMENT
BEFORE
8. UPDATE
STATEMENT
AFTER
9. DELETE
BEFORE
10. DELETE
AFTER
11. DELETE
STATEMENT
BEFORE
12. DELETE
STATEMENT
AFTER
Oracle 9i Fundamental
193
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.
Observaes
Oracle 9i Fundamental
194
Observao
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.
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;
16.3.2 - UPDATE
Oracle 9i Fundamental
196
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;
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.
Oracle 9i Fundamental
197
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.
Resposta:
insert into historico values (12,12,10)
*
ERROR at line 1:
Oracle 9i Fundamental
198
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'
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
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));
30
ora_database_name
ora_dict_obj_owner
ora_dict_obj_type
tipo do objeto
ora_sysevent
ora_is_alter_column(
column_name IN VARCHAR2)
ora_is_drop_column(
column_name IN VARCHAR2)
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
Remove
Removeall
Set_defaul
ts
Signal
Dispara um alerta.
Waitany
Waitone
Ateno
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
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
REFERNCIA RPIDA
Tarefa
Como fazer
Criar um Trigger
Eliminar um Trigger
Desabilitar um
Trigger
Habilitar um Trigger
Listar Triggers
Criar um esquema de
notificaes
Oracle 9i Fundamental
203
ANOTAES
Oracle 9i Fundamental
204
Captulo 17 OBJETOS
OBJETIVOS
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
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
Oracle 9i Fundamental
206
Programao Orientada a
Objetos
Programao Estruturada
Mensagens
Classes
Herana
Polimorfismo
207
208
209
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
Atributo (Attribute)
Mtodo (Method)
210
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
Observaes
Oracle 9i Fundamental
211
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
OBJECT_TYPE
--------------TYPE
TYPE BODY
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.
Observaes
in varchar2)
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;
Observao
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
Oracle 9i Fundamental
215
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
);
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
Oracle 9i Fundamental
alimentam
arquivo
esto
no
exemplo:
216
Observaes
NOME
-----------------Alvaro Alpheratz
Bernardo Beid
Alvaro Alpheratz
update projetos
set ref_responsavel = null
where ref_responsavel is dangling;
Oracle 9i Fundamental
217
E a tabela:
create table funcionarios of funcionario_t
(primary key (matricula))
nested table dependentes store as dependentes_st;
Observaes
utilizando
alias
Oracle 9i Fundamental
218
as
Observaes
alias
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
visto
no
REFERNCIA RPIDA
Tarefa
Como fazer
Criar um
Classe
Corpo
de
Utilizar o mecanismo de
Herana
Instanciar um objeto de
alguma
classe
previamente criada
Criar uma
Objetos
Tabela
de
Utilize o comando:
create table nome of classe (primary key (campo));
Listar Classes
Oracle 9i Fundamental
221
ANOTAES
Oracle 9i Fundamental
222
Captulo 18 INTRODUO
ADMINISTRAO
OBJETIVOS
ARQUIVOS NECESSRIOS
Nenhum.
PR-REQUISITOS
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
Memria
Processos
35
Instncia
34
35
Oracle 9i Fundamental
226
UNDOTBS
TEMP
USERS
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
37
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
NOVIDADES
39
39
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
ARQUIVOS NECESSRIOS
Init.ora;
19_HitRatioPorUsuario.sql;
19_HitRatioPorArquivo.sql.
PR-REQUISITOS
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
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
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
Sada:
40
Oracle 9i Fundamental
apagou-se
um
arquivo
233
MEMBER
---------------------------------------E:\ORACLE\ORADATA\ACAD9\REDO03.LOG
E:\ORACLE\ORADATA\ACAD9\REDO02.LOG
E:\ORACLE\ORADATA\ACAD9\REDO01.LOG
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
Oracle 9i Fundamental
234
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
19.1.4 - Arquivos
SPFILE.ORA)
de
Parmetros
(INIT.ORA
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
E a sada:
NAME
TYPE
VALUE
------------------------------------ ----------- -----------------------------spfile
string
%ORACLE_HOME%\DATABASE\SPFILE%
ORACLE_SID%.ORA
236
TYPE
----------string
string
string
VALUE
--------------------E:\oracle\admin\ACAD9\bdump
E:\oracle\admin\ACAD9\cdump
E:\oracle\admin\ACAD9\udump
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.
237
Oracle 9i Fundamental
238
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.
Oracle 9i Fundamental
239
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
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
Acad9
LGWR
(Log Writer)
Oracle 9i Fundamental
240
CKPT
(Checkpoint)
Forando um checkpoint:
alter system checkpoint;
ARCH
(Archiver)
estiver
configurada
CJQ0
241
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
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
Observaes
4.096
DB_CACHE_SIZE
8.388.608
DB_xxK_CACHE_SI
ZE
valor em
bytes ou
MB
SHARED_POOL_
SIZE
20.971.520
Parmetro
DB_BLOCK_SIZE
LARGE_POOL_SIZE 1.048.576
JAVA_POOL_SIZE
8.388.608
Oracle 9i Fundamental
243
Valor
Tpico
Observaes
SORT_AREA_SIZE
524.288
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
DB_CREATE_FILE_D
EST
algum
diretrio
vlido
DB_CREATE_ONLI
NE_LOG_DESTn
algum
diretrio
vlido
CONTROL_FILES
nomes de
arquivos
vlidos
SGA_MAX_SIZE
JOB_QUEUE_
PROCESSES
10
SPFILE
nome de
arquivo
IFILE
nome de
arquivo
Parmetro
244
19.4.2 - Etapas
Antes que uma instncia esteja disponvel e um Banco de Dados aberto,
devem passar por alguns estgios intermedirios:
Oracle 9i Fundamental
245
Observaes
Analogia
Normal
Abort
Desfaz transaes
conexes.
correntes
pra
pra
44
Oracle 9i Fundamental
246
Pfile
Open
Mount
Nomount
Database
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
248
Alocao
de
Memria
Parse
Execuo
Fetch
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
Reserva
Bloqueio
Cpia para
Reserva
Log para
valores
antigos
Atualiza
Modificam-se as linhas em B.
Log para
valores novos
Notificao
Oracle 9i Fundamental
250
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.
V$CONTROLFILE
V$DATABASE
V$DATAFILE
V$DBFILE
V$INSTANCE
V$LOGFILE
V$LOG
V$PARAMETER
V$SGA
V$SGASTAT
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);
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
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.
14.
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.
Viso
V$CONTROLFILE
CONTROL_FILES.
Listar
Files
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
Abrir instncia
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.
Oracle 9i Fundamental
257
NOVIDADES
ARQUIVOS NECESSRIOS
20_Ex_Cria_Tablespaces.sql;
20_Ex_Altera_Tablespaces.sql;
20_Espaco_disponivel.sql.
PR-REQUISITOS
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:
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
Contedo
Oracle
Index
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
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]
Oracle 9i Fundamental
261
Clusula
UNDO
nome
DATAFILE
AUTOEXTEND
BLOCKSIZE
LOGGING
DEFAULT
STORAGE
Descrio
Oracle 9i Fundamental
262
Clusula
ONLINE
PERMANENT
EXTENT
MANAGEMENT
Descrio
Observaes
45
Oracle 9i Fundamental
263
Oracle 9i Fundamental
264
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
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
-------- --------9
--------
-------
17
BLOCKS RELATIVE_FNO
------------
10420224
2544
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).
Observaes
Oracle 9i Fundamental
266
Observaes
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
Descrio
nome
Nome da Tablespace.
LOGGING
ADD DATAFILE
RENAME DATAFILE
COALESCE
267
Clusula
Descrio
DEFAULT STORAGE
ONLINE
OFFLINE
BEGIN BACKUP
READ ONLY
PERMANENT
Natureza
dos
(TEMPORARY)
dados:
permanentes
ou
temporrios.
Observaes
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
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
Observaes
20.5 - Eliminao
O comando drop tablespace, detalhado em seguida, permite eliminar
Tablespaces.
DROP TABLESPACE nome
[INCLUDING CONTENTS [AND DATAFILES] [ CASCADE CONSTRAINTS]]
Descrio
nome
Nome da Tablespace.
INCLUDING
CONTENTS
AND DATAFILES
269
Clusula
Descrio
CASCADE
CONSTRAINTS
Exemplo
DROP TABLESPACE TABELAS INCLUDING CONTENTS AND DATAFILES;
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
de
REFERNCIA RPIDA
Tarefa
Como fazer
Verificar a possibilidade
de criar uma Tablespace
com arquivos OMF
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
Alterar tamanho de um
arquivo
Comando ALTER
RESIZE tamanho.
DATABASE
Oracle 9i Fundamental
DATAFILE
nome
273
Captulo 21 SEGMENTOS DE
ROLLBACK/UNDO
OBJETIVOS
NOVIDADES
ARQUIVOS NECESSRIOS
21_Mostra_RBS.sql;
21_Monta_Tabelas.sql;
21_Recupera_Alunos;
21_Alimenta_Historico.sql.
PR-REQUISITOS
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
48
Oracle 9i Fundamental
Extents
275
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.
276
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
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
Oracle 9i Fundamental
277
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
TIPO
---------VARCHAR2
VARCHAR2
VARCHAR2
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
VARCHAR2
VARCHAR2
NUMBER
279
Parmetro
TYPE
----------string
integer
boolean
string
VALUE
----------AUTO
10800
FALSE
UNDOTBS1
Descrio
undo_management
undo_retention
undo_tablespace
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 concesso
Segurana.
de
permisses
voltar
ser
abordada
Oracle 9i Fundamental
no
captulo
24
281
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
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;
Oracle 9i Fundamental
282
Observaes
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
Oracle 9i Fundamental
283
STORAGE
(INITIAL
NEXT
MINEXTENTS
MAXEXTENTS
OPTMAL
inteiro [K | M]
inteiro [K | M]
inteiro
inteiro
[inteiro [K | M] | NULL)
PUBLIC
TABLESPACE
STORAGE
MINEXTENTS
MAXEXTENT
S
OPTIMAL
Exemplo
create rollback segment rb17 tablespace rbs;
Observaes
Oracle 9i Fundamental
284
SHRINKS
------0
0
Bytes gravados
SHRINK
WRAP
285
EXTEND Expanses
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
Oracle 9i Fundamental
288
REFERNCIA RPIDA
Tarefa
Como fazer
Verificar a presena da
SMU
(gerncia
automtica da rea de
Rollback)
Criar um Segmento de
Rollback
Alterar um Segmento de
Rollback
Eliminar um Segmento
de Rollback
Listar Segmentos de
Undo/Rollback ou
informaes afins
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
NOVIDADES
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
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
Negcio
Transacional
292
Detalhes
GLOBAL
TEMPORARY
Nome
Campos,
constraints
TABLESPACE
PCTFREE
51
Oracle 9i Fundamental
293
Clusula
Detalhes
PCTUSED
INITRANS
MAXTRANS
STORAGE
ORGANIZATION
ON COMMIT
LOGGING
PARALLEL
Oracle 9i Fundamental
294
Clusula
Detalhes
PARTITION
Observaes
Os exemplos apresentados
22_Ex_Cria_Tabelas.sql.
em
seguida
constam
Oracle 9i Fundamental
no
arquivo
exemplo
295
Observao
53
Os exemplos apresentados
22_Ex_Altera_Tabelas.sql.
em
seguida
constam
Oracle 9i Fundamental
no
arquivo
exemplo
296
Observaes
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
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
Sada:
ROWID
-----------------AAAH3fAAIAAAABiAAR
AAAH3fAAIAAAABiAAU
AAAH3fAAIAAAABiAAV
AAAH3fAAIAAAABiAAW
NOME_ALUNO
-----------------------------Grson Orion
Geraldo Capricornius
Genaro Bootes
Gago Ursa
Significado
1 ao 6
Segmento
7 ao 9
Arquivo
10 ao 15
Bloco
16 ao 18
Linha
bloco
dentro
do
Sada:
FILE_NAME
-----------------------------------------------------------E:\ORACLE\ORADATA\ACAD9\USERS01.DBF
Oracle 9i Fundamental
298
Resumo
ROWID_BLOCK_NUMBER
ROWID_ROW_NUMBER
Nmero da linha.
ROWID_TO_ABSOLUTE_F
NO
ROWID_TO_RESTRICTED
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
Oracle 9i Fundamental
299
Observaes
56
Oracle 9i Fundamental
300
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;
301
Observaes
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:
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
Sada:
SEGMENT_NAME
-----------------------------
ALUNOS
ALUNOS
ALUNOS
ALUNOS
SEGMENT_TYPE
TABLESPACE_NAME
------------------ -----------------TABLE
TABLE
TABLE
TABLE
PARTITION
PARTITION
PARTITION
PARTITION
CAPIXABAS
MINEIROS
CARIOCAS
PAULISTAS
59
Oracle 9i Fundamental
303
NOME_ALUNO
-----------------------------Tadeu Perseu
Luis Eridanus Rios
Jos Neves Gemini
UF
-MG
MG
MG
Comprovando a insero:
select nome_aluno, uf from alunos partition(p11);
NOME_ALUNO
UF
------------------------------ -Vitria Vulpecula
BA
60
Oracle 9i Fundamental
304
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
GATHER_INDEX_STATS
GATHER_SCHEMA_STATS
GATHER_DATABASE_STATS
GATHER_SYSTEM_STATS
Ativando:
execute lista_linhas
Sada:
Linhas: 32
Blocos: 5
61
GET_COLUMN_STATS
GET_INDEX_STATS
GET_SYSTEM_STATS
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.
307
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
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;
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
E voltar a cri-la:
alter table historico add constraint historico_aluno_fk
foreign key (matricula) references alunos (matricula);
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
Oracle 9i Fundamental
310
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%';
311
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.
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
PCTUSED
exista,
execute
script
Oracle 9i Fundamental
312
NUM_ROWS
BLOCKS NUM_ROWS/BLOCKS
--------- --------- --------------620
4
155
Oracle 9i Fundamental
313
REFERNCIA RPIDA
Tarefa
Como fazer
Criar um Segmento de
Tabela
Alterar um Segmento de
Tabela
Eliminar um Segmento de
Tabela
Vises: DBA_TAB_PARTITIONS,
USER_TAB_PARTITIONS,
ALL_TAB_PARTITIONS
Gerar estatsticas
Listar estatsticas
Eliminar estatsticas
Efetuar alteraes
estruturais em uma tabela
sem impactar os acessos
Oracle 9i Fundamental
314
NOVIDADES
ARQUIVOS NECESSRIOS
23_Ex_Cria_Indices.sql;
23_Ex_Gera_DDL.sql;
23_Monta_Indice_Particoes.sql;
23_Recria_Indices.sql.
PR-REQUISITOS
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.
Non-Unique
Compostos
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]
Detalhes
Nome
Oracle 9i Fundamental
316
Clusula
Detalhes
UNIQUE
BITMAP
Tabela
Campos
ASC | DESC
TABLESPACE
Parmetros de
Utilizao de
Espao
STORAGE
LOGGING |
NOLOGGING
NOSORT
PARALLEL |
NOPARALLEL
PARTITION
63
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
Observaes
318
Observao
23.2.1 - rvore-B
Veja um exemplo simplificado na seguinte figura:
319
Procedimento
B14
Procedimento
Comea por B1
64
Oracle 9i Fundamental
320
Passo
Procedimento
V para B4
Blocos acessados em
busca em rvore
Blocos acessados em
busca seqencial
Carla
Daniel
lvaro
Francisco
Antonio
Gago
Felipe
Epaminondas
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
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
Oracle 9i Fundamental
322
UF = SP
Resultado
OR
Observaes
Oracle 9i Fundamental
323
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;
END_MONITORING
------------------15:15:06
324
Uma vez decidido que um dado ndice deva morrer, inicialmente deve-se
inter-romper o acompanhamento:
alter index NOMEMAIUSCULO_INSTRUTORES_IDX nomonitoring usage;
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
66
Oracle 9i Fundamental
325
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
Eliminar um Segmento de
ndice
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
Vises: DBA_IND_PARTITIONS
USER_IND_PARTITIONS
ALL_IND_PARTITIONS
Oracle 9i Fundamental
327
ANOTAES
Oracle 9i Fundamental
328
Captulo 24 SEGURANA
OBJETIVOS
NOVIDADES
ARQUIVOS NECESSRIOS
24_Cria_Profile.sql;
24_Gera_Verifica_Senha.sql;
24_Ex_Auditorias.sql;
Monta_Tabelas.sql.
PR-REQUISITOS
329
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
Schema
Oracle 9i Fundamental
330
Conceito
Explicao
Privilgio
Papel (Role)
Perfil
(Profile)
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
IDENTIFIED
DEFAULT
TABLESPACE
TEMPORARY
TABLESPACE
Oracle 9i Fundamental
331
Clusula
Detalhes
QUOTA
PROFILE
PASSWORD
EXPIRE
ACCOUNT
Exemplo:
create user monick
identified by leonardo
default tablespace users
quota 1 m on users;
Observaes
SYS
CHANGE_O
N_
INSTALL
SYSTEM
MANAGER
SCOTT
TIGER
Usurio
Oracle 9i Fundamental
332
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
em que:
Privilgio
Usurio
ROLE
67
68
Oracle 9i Fundamental
334
PUBLIC
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.
user_sys_privs;
USERNAME PRIVILEGE
ADM
--------- -------------------------------------- --MONICK
CREATE SESSION
NO
Este comando somente pode ser disparado por quem emitiu o grant, ou
tiver privilgios de sistema adequados.
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 :
em que:
privilgio
colunas
objeto
usurio
ROLE
PUBLIC
Oracle 9i Fundamental
336
WITH
OPTION
GRANT
Exemplos
grant select, insert on cursos to monick;
TABLE_NAME
-----------------------------DBMS_FLASHBACK
FONTE
FONTE
CURSOS
CURSOS
GRANTOR
---------SYS
SYS
SYS
DBAACAD
DBAACAD
PRIVILEGE
---------------EXECUTE
WRITE
READ
INSERT
SELECT
USER_COL_PRIVS
USER_COL_PRIVS_MADE
USER_COL_PRIVS_RECD
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
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.
GRANTED_ROLE
-----------------------------CONNECT
GERENCIA
ADM
--NO
NO
DEF
--YES
YES
OS_
--NO
NO
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.
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
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
cpu_per_call
Tempo de cpu
milissegundos.
por
Oracle 9i Fundamental
comando.
Medido
em
339
connect_time
idle_time
Tempo ocioso
anterior.
em
minutos.
Vale
observao
private_sga
composite_limit
failed_login_attempts
password_*
Por exemplo70:
create profile PHospede Limit
sessions_per_user 1
cpu_per_session unlimited
connect_time 3
idle_time 1;
Profile created.
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
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;
TYPE
----------string
boolean
VALUE
----------------------OPS$
FALSE
Oracle 9i Fundamental
341
pode-se
realizar
connect /
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
Oracle 9i Fundamental
342
select
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
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
343
EXERCCIOS
1. Assegure-se que TEMP seja a Tablespace temporria padro para
futuros usurios.
Emita o comando:
Oracle 9i Fundamental
344
11.
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
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.
viso
16.
Retire o direito de leitura em sua tabela INSTRUTORES. Comprove
que aqueles que receberam por LIMITADO tambm perderam o
privilgio.
17.
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
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.
25.
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)
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>
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
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.
41.
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.
45.
Investigue a viso AUDIT_ACTIONS para visualizar os comandos
auditveis.
46.
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;
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
Oracle 9i Fundamental
351
Tarefa
Como fazer
Conceder
privilgios de
sistema
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.
Consultar
privilgios de
objeto
Revogar privilgios
Criar role
Consultar roles
Criar um profile
Alterar um profile
Eliminar um
profile
usurios
Listar informaes
de profiles
Listar limites de
profiles
Vises:
USER_PASSWORD_LIMITS.
Associar um profile
a um usurio
Autenticao via
SO
USER_RESOURCE_LIMITS,
Oracle 9i Fundamental
352
Tarefa
Como fazer
Auditoria
Consultar
comandos
auditveis
Viso AUDIT_ACTIONS.
Consultar
resultado da
auditoria
Oracle 9i Fundamental
353
NOVIDADES
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
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
O QU:
FREQNCIA:
72
Oracle 9i Fundamental
356
QUEM:
DESTINO
ESTRATGIA
SIMULAES
Oracle 9i Fundamental
357
Lgica
Exportao/
Importao
Transporte
de
Tablespaces
Fsica
Cold
Mixta
Hot
Recovery
Manager
Oracle 9i Fundamental
358
Descrio
USERID
FILE
FULL
73
Oracle 9i Fundamental
359
Parmetro
Descrio
OWNER
TABLES
TABLESPACES
BUFFER
COMPRESS
ROWS
LOG
TRANSPORT_
TABLESPACE e
TTS_FULL_CHE
CK
Observaes
Oracle 9i Fundamental
360
exportadas
exportadas
exportadas
exportadas
exportadas
exportadas
exportadas
exportadas
Observao
Oracle 9i Fundamental
361
Observaes
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.
Oracle 9i Fundamental
362
Descrio
USERID
FILE
FULL
FROMUSER
TOUSER
Schema destino.
TABLES
TABLESPACES e
TTS_OWNERS
SHOW
IGNORE
COMMIT
BUFFER
ROWS
LOG
Oracle 9i Fundamental
363
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.
Observaes
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.
Observao
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;
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
Ateno
76
Oracle 9i Fundamental
366
E a sada:
SQL_UNDO
77
Oracle 9i Fundamental
367
-------------------------------------------------------------------------update "DBAACAD"."CURSOS" set "PRECO" = '800' where "PRECO" = '0' and ROWID =
'AAAHZxAAJAAAAB2AAA';
10 linhas selecionadas.
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
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.
Oracle 9i Fundamental
369
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 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
80
81
Oracle 9i Fundamental
370
Uma vez gerados os metados com sucesso, USERS em ACAD9 j pode ser
novamente gravada:
alter tablespace users read write;
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.
371
372
Fechar o Banco.
Abrir o Banco parcialmente:
startup mount
Abrir o Banco:
alter database open;
82
Oracle 9i Fundamental
373
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
Oracle 9i Fundamental
374
Observaes
83
Oracle 9i Fundamental
375
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.
84
85
Oracle 9i Fundamental
376
Causa
Fazer
Instncia
derrubada
Disco inacessvel
devido
corrupo de
arquivos:
Data files
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.
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
Significado
Target Database
Recovery Database
Oracle 9i Fundamental
378
Termo
Significado
Recovery Catalog
Channel Process
Backup Piece
Backup Set
Cpia
Restore
Recovery
Disk Buffer
Tape Buffer
no
Observaes
379
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>
Oracle 9i Fundamental
380
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.
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
Observaes
88
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;
89
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
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;
90
Oracle 9i Fundamental
384
453192
58720256
12582912
667648
bytes
bytes
bytes
bytes
Oracle 9i Fundamental
385
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
Ateno
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
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;
Oracle 9i Fundamental
387
CONFIGURE
CONFIGURE
CONFIGURE
CONFIGURE
CONFIGURE
CONFIGURE
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;
Oracle 9i Fundamental
389
f. Execute o comando:
select username, sql_undo, sql_redo from v$logmnr_contents
operation = 'DDL';
where
4.
5.
6.
7.
8.
390
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;
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;
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;
24.
25.
27.
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
recuperao lgica
Criar o Dicionrio de
Dados para o LogMiner
em um arquivo externo
Acrescentar um arquivo
(Redo ou Archived)
busca do LogMiner
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'));
Consultar resultado da
busca do LogMiner
Viso V$LOGMNR_CONTENTS.
execute dbms_logmnr.end_logmnr;
Executar um comando
do SO a partir do
SQL*Plus ou RMAN
Comando HOST
Realizar
Backup.
um
Cold
Recuperao Cold.
Recuperao Hot.
Ativar o RMAN.
Consultar Recovery
Catalog a partir do
SQ7LPlus Worksheet.
Consultar
Catalog a
RMAN.
Recovery
partir do
Oracle 9i Fundamental
395
Tarefa
Como fazer
Sincronizar o Recovery
Catalog com o Control
File do Target
Validar
RMAN
backups
do
Armazenar
configuraes no RMAN
Para
Oracle 9i Fundamental
exibir
configuraes,
396
ANOTAES
Oracle 9i Fundamental
397
NOVIDADES
ARQUIVOS NECESSRIOS
Nenhum.
PR-REQUISITOS
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
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
Ateno
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.
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
Apagar um Banco de
Dados
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:
In
\oracle\bin\sqlplusw.exe
string
usurio/senha@host
402
Descrio
Save arquivo
Grava
contedo
especificado.
Append texto
Get arquivo
Run
Executa o contedo
abreviado como /
do
buffer
do
no
buffer.
arquivo
Pode
ser
Oracle 9i Fundamental
403
Oracle 9i Fundamental
404
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Oracle 9i Fundamental
405
2Ttulo:
Autor:
Editora:
Comentrio
s:
3Ttulo:
406
Autor:
Editora:
Comentrio
s:
Pgs.
695
4Ttulo:
Autor:
Noel Yuhanna
Editora:
Comentrio
s:
Pgs.
528
5Ttulo:
Autores:
Editora:
Comentrio
s:
Pgs.
598
6Ttulo:
Autores:
Editora:
Comentrio
s:
Pgs.
894
Oracle 9i Fundamental
407
7Ttulo:
Autores:
Editora:
Comentrio
s:
8Ttulo:
Autores:
Editora:
Comentrio
s:
9Ttulo:
Autor:
Editora:
Comentrio
s:
10Ttulo:
Autores:
Editora:
Comentrio
s:
11Ttulo:
408
Autor:
Editora:
Comentrio
s:
12Ttulo:
Autor:
Mark Scardinan
Editora:
Osborne - 2001
Comentrio
s:
Pgs.
576
13Ttulo:
Autores:
Editora:
Osborne - 2001
Comentrio
s:
Pgs.
608
14Ttulo:
Autores:
Editora:
Comentrio
s:
Pgs.
608
15Ttulo:
Autores:
Editora:
Sybex - 2002
Pgs.
Oracle 9i Fundamental
409
Comentrios:
Oracle 9i Fundamental
410
2)
Os discos possuem
redundncia?
3)
4)
Existe contrato
Oracle?
5)
6)
7)
8)
9)
de
algum
nvel
manuteno
com
de
411
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
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
413
Exemplo de sada
Em alguns pontos da sada apresentados em seguida, preferiu-se omitir
detalhes.
ANALISE DIARIA
Agora:
-------------------26/07/2002 16:39
**********************
ltimo Startup:
-------------------26/07/02 09:32:21
Em dias e horas:
Dias
Horas
---------- ---------,296724537 7,12138889
**********************
Verso corrente
Banco
Data
Modo Archive
--------- -------- -----------ACAD9
30/06/02 ARCHIVELOG
**********************
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
**********************
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
**********************
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
Parmetro
Valor
------------------------------ ---------shared_servers
1
**********************
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
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
**********************
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
**********************
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
**********************
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 ?
*****
**********************
Pool
Oracle 9i Fundamental
417
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
Oracle 9i Fundamental
419
ANOTAES
Oracle 9i Fundamental
420
Read-Only
Activated
Oracle 9i Fundamental
421
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
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
DB_FILE_NAME_CONVERT
LOG_FILE_NAME_CONVER
T
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.
424
Oracle 9i Fundamental
425
logfile;
426
shutdown immediate
startup nomount
alter database mount standby database;
Emita o comando:
alter database activate standby database;
Derrube a instncia:
shutdown immediate
E.8 - Concluses
Oracle 9i Fundamental
427
Replicao
Real Application
Clusters
Oracle 9i Fundamental
428
Comentrios
Allroundautomations.nl
2.
bmc.com
3.
bradmark.com
1.
Oracle 9i Fundamental
429
www.
Comentrios
4.
compuware.com
5.
datamirror.com
6.
dbazine.com/ch_oracle.
html
7.
embarcadero.com
8.
google.com
9.
idevelopment.info
Dicas,
scripts,
certificao.
10.
ioug.com
11.
lazydba.com
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
14.
datadirecttechnologies.com
15.
oracle.com
16.
oracle.com/oramag
17.
oraclefans.com
18.
www.oracle.matrix.
com.br
Oracle 9i Fundamental
links,
sugestes
para
430
www.
Comentrios
19.
orafaq.com
20.
oraworld.com
21.
pocketdba.com
22.
precise.com
23.
quest.com
24.
senware.com
tusc.com
revealnet.com
27.
searchdatabase.com
28.
simulus.com
29.
Softcert.com
30.
softwarejobs.com
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
33.
uaex.edu/srea
34.
virtualdba.com
35.
wtainc.com/whitepap.htm Artigos
Applications
Guide
Backup
Concepts
and
Recovery
Sedimenta
conceitos
Recuperao.
sobre
nfase
Backup
ao
e
Concepts
Error Messages
Master Glossary
New Features
PL/SQL
Reference
94
Developer
Users
and
Recovery Manager
SQL Reference
Oracle 9i Fundamental
432
Utilities
Oracle 9i Fundamental
433
Cliente
PC baseado em processador
Pentium 166 ou superior.
RAM: mnimo 64 MB, sugerido
128 MB. Para
espao em disco aproximado:
800 MB.
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
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
Oracle 9i Fundamental
436
Oracle 9i Fundamental
437