Você está na página 1de 94

Treinamento

Oracle
www.di gi databrasi l .com.br
CONCEITO
Banco de Dados
Processo Cliente x Processo Servidor
Controle de Transaes
Banco de dados relacional
Definio Entidades/trib!tos
Definio das relaes
ARQUITETURA ORACLE
"nst#ncia $racle
Com%onentes em mem&ria
S'ared Pool
Database B!ffer Cac'e
(edo )og B!ffer
Processos
DB*( +Database*riter,
)-*( +)og*riter,
C.PT +C'ec/%oint,
Sistema de ar0!ivo de !ma base de dados
Controlfile
(edo)og1ile
Data1ile
r0!ivo de )og
Estr!t!ras )&gicas
Tables%aces
Segmentos
Extenses +E2TE3TS,
Blocos de Dados +DTBSE B)$C.S,
Privil4gios de acesso
Select
5ani%!lao de dados +D5),
Commit
ESTRUTURA DE LINGUAGEM
)ing!agem S6)
D5)
DD)
Criar 7s!8rios +Sc'ema,
Criar (ole +Pa%el,
Estabelecer Permisses
Criar e dministrar TableS%ace
Criar Tabelas
Criar Primar9 .e9s
Criar 1oreing .e9s
Criar C'ec/s
Criar :ndices
Criar Se0!ences
$%es vanadas da )ing!agem S6)
"nner ;oins
$!ter ;oins
)eft $!ter ;oins
(ig't $!ter ;oins
1!ll $!ter ;oins
$!tros exem%los de "nner ;oin
)ing!agem P) < S6)
Com%onentes da )ing!agem
"dentificadores
Palavras (eservadas
)iterais
Coment8rios
Declaraes
Ti%os De =ari8veis
=ari8veis Sim%les
trib!tos Es%eciais
Constantes
Converso de Ti%o De =ari8vel
Exem%los de Declaraes
=ari8veis Es%eciais
trib!tos Para C!rsor
Comandos
Criar =iew
Criar Stored Proced!res
Criar Stored Proced!res com C!rsor
Criar 1!nctions
Criar Tabelas Tem%or8rias
Criar Trigger
Criar Pac/ages
Criar Sin>nimos
Ex%ort e "m%ort de Sc'ema
Criar Bac/!%
Apostila de Oracle

Apostila Oracle
CONCEITO
Banco de Dados
O primeiro Sistema Gerenciador de Banco de Dados (SGBD) comercial surgiu no final de 1960 com base nos
primitivos sistemas de arquivos disponveis na poca, os quais no controlavam o acesso concorrente por vrios
usurios ou processos. Os SGBDs evoluram desses sistemas de arquivos de armazenamento em disco, criando
novas estruturas de dados com o objetivo de armazenar informaes. Com o tempo, os SGBDs passaram a
utilizar diferentes formas de representao, ou modelos de dados, para descrever a estrutura das informaes
contidas em seus bancos de dados. Atualmente, os seguintes modelos de dados so normalmente utilizados
pelos SGBDs: modelo hierrquico, modelo em redes, modelo relacional e o modelo orientado a objetos.
Em termos simples, um banco de dados uma coleo de dados, onde os dados so armazenados em tabelas.
Alguns gostam de pensar em um banco de dados como um mecanismo organizado que tem a capacidade de
armazenar informaes, pela qual um usurio pode recuperar as informaes armazenadas de uma amaneira
eficaz e eficiente.
Um banco de dados relacional um banco de dados dividido em unidades lgicas chamadas tabelas, em que as
tabelas so relacionadas entre si dentro do banco de dados. Um banco de dados relacional permite dividir os
dados em unidades lgicas menores, mais gerenciveis, oferecendo melhor e mais fcil manuteno e
desempenho timo do banco de dados de acordo com o nvel de organizao.
Processo Cliente X Processo Servidor
Um processo responsvel pela manuteno da informao (servidores) e outros responsveis pela obteno
dos dados (os clientes). Os processos cliente enviam pedidos para o processo servidor, e este por sua vez
processa e envia os resultados dos pedidos. O Oracle 10g um banco de dados relacional, destinado a ser
compatvel com aplicaes que apresentam arquitetura Cliente/Servidor, no qual o banco de dados fica residente
em um computador central chamado Servidor e cujas informaes so compartilhados por diversos usurios que
executam as aplicaes em seus computadores locais ou clientes.
BANCOS DE DADOS BASEADOS NA ARQUITETURA CLIENTE/SERIDOR!
Em linhas gerais, esta tecnologia tem como caracterstica principal a diviso de tarefas entre
o cliente, a estao de trabalho que ordena atravs das aplicaes o acesso aos bancos de dados, e o
servidor, que executa tarefas, tais como: atualizaes, excluses, procura de dados e todas as outras tarefas
prprias do gerenciamento de banco de dados, porm, sob as ordens da estao de trabalho (Cliente).
A vantagem evidente: dividindo o processamento em dois sistemas, temos de sada a
diminuio do trfego de dados na rede. Com isto, o desempenho aumenta, pois evitaremos
processar os dados, fazendo-os transitar pela rede, entre a estao de trabalho e o servidor, pelo
menos duas vezes. Ao invs disso, armazenamos os dados variveis do processo em alguns
parmetros e os enviamos ao servidor. Estes ao chegarem so recepcionados pelo Oracle que os
envia para Stored Procedures, que ento inicia o processamento desejado at seu final de dentro do servidor,
limitando-se a avisar a estao de trabalho o trmino do processo, com sucesso ou no.
Porm, nem tudo so flores, existem tambm as desvantagens e a principal delas o fato das
estaes de trabalho (Clientes) se localizarem em pontos geogrficos distantes do servidor.
Embora este problema possa hoje ser minimizado pela adoo das arquiteturas de
processamento distribudo, por outro lado no sem um considervel investimento em equipamentos, aplicativos
auxiliares e a contratao de especialistas. Este investimento acompanhado de despesas de manuteno
constantes embora no signifique propriamente um retorno aos custos de um computador de grande porte,
porm um gasto significativo e que dependendo do tamanho e da complexidade da rede podemos at alcanar
os custos de um grande porte.
DigiData Informtica 4 ! 94
Apostila de Oracle

ANTA"ENS DA TECNOLO"IA CLIENTE/SERIDOR!
SEPARA#$O DAS TARE%AS DE SOLICITA#$O E PROCESSO&
A primeira efetuada pela estao de trabalho e a ltima feita no servidor, ou seja: as tarefas
de tratar e manipular os dados. Como j dissemos o trfego na Rede diminui sensivelmente, pois s entregue
os dados necessrios solicitados pela pesquisa do cliente, e estes depois de tratados so atualizados ao final da
transao no servidor. Ao contrrio dos Sistemas de Bancos de Dados sem a tecnologia Cliente/Servidor, que
disponibiliza todo o banco de dados, indiferente necessidade quando da solicitao pelo Cliente. A tecnologia
Cliente/Servidor antes de tudo uma
incrementadora de performance sem igual.
INDEPEND'NCIA DA ESTA#$O DE TRABAL(O&
Os usurios no ficam restritos a um tipo de sistema ou plataforma.
PRESERA#$O DA INTE"RIDADE DOS DADOS
Mesmo quando so efetuados Back-ups em tempo real ou at a encriptao dos dados.
Nestes casos o DBMS, utiliza o espelhamento dos dados enquanto eles so acessados, gravando
sempre a ltima fotografia dos dados antes da cpia de segurana.
PROCESSA)ENTO DE TRANSA#*ES&
A grande vantagem deste mtodo e guardar durante certo tempo as modificaes
efetuadas no Banco de Dados. Podendo, recuper-las em caso de queda de energia ou mesmo
quando o usurio do Banco desiste da modificao.
-DESANTA"ENS!
1- A maior delas o aumento do custo administrativo e a contratao de pessoal
especializado para dar suporte e manter o Banco de Dados sempre ativo. Nasce o profissional
Administrador de Bancos de Dados (DBA).
2- O aumento do custo de hardware, tambm significativo, pois parte integrante desta
tecnologia Cliente/Servidor, exige a distribuio do processamento, quando a rede for grande.
3- Quando da utilizao do Processamento Distribudo a complexidade aumenta, o nmero de
equipamentos diversos tambm aumentam, e nem sempre podemos encontrar profissionais no
mercado com um conhecimento to diversificado
Controle de transa+,es
Uma transao uma unidade lgica de trabalho que compreende uma ou mais declaraes SQL executadas
por um nico usurio. Segundo o padro ANS/SO SQL com o qual o Oracle compatvel, uma transao se
inicia com a primeira declarao SQL executvel do usurio e termina quando ela submetida explicitamente ou
rollback pelo usurio.
Pense em um Banco de Dados de uma agncia bancria. Quando um cliente desse banco transfere dinheiro de
uma conta poupana para uma conta-corrente, a transao pode consistir em trs operaes separadas: a
diminuio da conta poupana, o aumento da conta-corrente e o registro da transao no dirio de transaes.
O Oracle deve garantir que as trs declaraes SQL sejam executadas para atualizar o saldo das contas.
Quando alguma coisa impede que uma declarao da transao seja executada (uma falha de hardware, por
exemplo), as outras devem ser desfeitas. sso chamado de Rollback. Quando um erro ocorre em uma das
atualizaes, nenhuma atualizao realizada.
DigiData Informtica 5 ! 94
Apostila de Oracle

Banco de Dados Relacional
O conceito relacional veio da necessidade de se acessar dados em uma estrutura que no apresentasse uma
organizao em que os dados estivessem postos de forma hierrquica. Tal estrutura tinha o inconveniente de
no ter flexibilidade nem desempenho exigido para atender a demanda dos negcios atuais. A lgica do modelo
de Banco de Dados Relacional baseada na teoria de conjuntos, diferenciando das formas tradicionais onde os
dados ficam distribudos de forma annima e em formato natural.
Estruturas de dados como tabelas, so armazenadas mantendo um relacionamento lgico indicado por colunas
especficas em cada tabela em particular. Estes relacionamentos estabelecem condies para um rpido acesso,
sobretudo, um mecanismo seguro para garantir a total integridade dos dados disponveis.
Podemos dividir as etapas para construo de um Sistema Gerenciado de Banco de Dados Modelo Relacional
em:
Definio das Entidades e Atributos
Definio dos Relacionamentos
De-ini+.o das Entidades e Atri/0tos
Define-se por entidade o elemento que pode ser constitudo por atributos. Para a construo das entidades
feito levantamento, por meio de anlise e entrevista junto aos interessados no negcio. Como exemplo prtico,
consideremos a construo de um sistema, onde h o objetivo de se registrar as vendas dos clientes. Neste
programa, Clientes e Vendas, nome e endereo seriam por exemplo atributos da entidade cliente.
De-ini+.o das Rela+,es
Quando finalizado a construo das entidades, a anlise direcionada para a identificao das colunas
(atributos) que so possveis de relacionamento.
Baseado no exemplo de Entidades e Atributos do item anterior, podemos afirmar que um Cliente pode conter
Pedidos, e de forma inversa, Pedidos so sempre pertencentes a Clientes. As relaes podem ocorrer de um
para um, de um para vrios e de vrios para vrios. A forma de apresentao deste modelo denominada ER,
ou seja Entidade Relacional.
Ar10itet0ra Oracle
Inst2ncia Oracle
DE%INI#$O
D-se o nome de nstncia Oracle ao conjunto, formado por estruturas de memria e processos a esta
associados, que o Oracle reserva para seu prprio funcionamento. A funo dessas estruturas a de manter em
memria os dados mais recentes copiados dos sistemas de arquivos prprios do Oracle para um acesso mais
rpido. Esses dados sero usados pelos vrios processos Oracle para manterem atualizados e consistentes os
sistemas de arquivos do Oracle, e para realizar diversas tarefas de manuteno e comunicao entre si e entre
as prprias estruturas. Para se acessar uma base de dados Oracle necessrio que uma instncia esteja
estabelecida em memria. Uma dada base de dados estar sempre relacionada a uma nica e particular
instncia (a no ser que se esteja utilizando a opo Parallel Server, quando mais de uma instncia pode
acessar a mesma base de dados). Portanto, base de dados e instncia no so a mesma coisa. A base de
dados propriamente dita se compe de um conjunto de arquivos fsicos; instncia o conjunto de processos que
controla estes arquivos fsicos atravs de processos prprios e de uma estrutura de memria relacionada (a
ligao entre a base de dados e a instncia parametrizada atravs do arquivo NT.ORA, que, entre muitas
outras funes, dimensiona as estruturas de memria a serem reservadas, e que possibilita, entre outras coisas,
montar duas instncias com comportamentos muito diferentes e apesar disso acessarem a mesma base de
dados).
DigiData Informtica 6 ! 94
Apostila de Oracle

A INST3NCIA CO)O O 4NICO )EIO DE ABRIR OS ARQUIOS QUE CO)P*E A BASE DE DADOS
Da mesma forma que duas ou mais instncias podem coexistir abertas para a mesma base de dados, podemos
ter vrias instncias, cada uma com seu banco de dados, e portanto um mesmo servidor disponibilizando vrios
bancos de dados simultaneamente. Neste cenrio o DBA teria que instalar as duas verses independentes uma
da outras, gerar cada base de dados na verso apropriada e utilizar uma instncia na verso correta para
acessar cada base.
Co5ponentes e5 )e56ria
Ao se iniciar, utilizar e fechar uma base de dados, ento, sempre haver uma instncia a partir do qual isso ser
feito. Portanto, o sistema operacional deve estar preparado para isso. O processo de inicializao de um banco
feito a partir da leitura do arquivo de inicializao. H dois tipos de arquivos: o PFLE que um arquivo texto
conhecido pelo NT.ORA e o SPFLE que um arquivo de parmetro do servidor conhecido como spfile.ora. A
instncia de banco de dados inicialmente procura o SPFLE e se no encontrar busca o PFLE. O arquivo
SPFLE uma verso binria do PFLE. A maior vantagem de utilizar o SPFLE a otimizao da base, pois h
diversos parmetros que so alterados e se tornam persistentes e sero reutilizados na prxima reinicializao
da base. possvel verificar se existe o SPFLE com o seguinte comando:
show parameter SPFLE;
O nome completo do arquivo NT.ORA depender do nome da base de dados, da seguinte maneira:
NT<nome_instncia>.ORA
Em funo dos parmetros neste arquivo, as estruturas de memria para esta instncia so dimensionadas e
reservadas, e iniciados seus processos.
Ao conjunto de todas as estruturas de memria assim estabelecidas se d o nome de SGA (System Global
Area). Essa rea compartilhada por todos os usurios da base de dados ao qual esta instncia est ligada.
Cada usurio, por sua vez, recebe uma estrutura denominada PGA (Program Global Area) atravs de um
processo Server que se liga sesso deste usurio. A PGA no compartilhada ( especfica de uma sesso).
Com relao SGA, temos as seguintes subestruturas:
Shared Pool
Database Buffer Cache
Redo Log Buffer
DigiData Informtica 7 ! 94
Estrutura de
memria
(SGA)
Processos de
Background
Instncia
Arquivo que compem a base de dados
Apostila de Oracle

S7ared Pool
Esta rea armazena vrios objetos que podem ser compartilhados entre usurios. Divide-se por sua vez em
Library Cache e Data Dictionary Cache.
Na primeira so guardados os planos de execuo de comandos SQL e cdigo PL/SQL de procedimentos ou
packages que um usurio possa estar utilizando ou venha a reutilizar. Na segunda so mantidos os blocos do
dicionrio de dados mais recentemente acessados.
O tamanho da SGA dimensionado pelo parmetro SHARED_POOL_SZE (em bytes), definido no NT.ORA.
Data/ase B0--er Cac7e
Mantm dados obtidos da base de dados para rpido acesso.
Quando os arquivos fsicos so acessados, os blocos com a informao obtida so trazidos para a memria e
colocados nesta rea. Ao serem lidos, os blocos novos vindos do disco procuram espao livre. Caso todo o
buffer cache esteja cheio, um algoritmo LRU
1
abrir espao atravs da liberao de blocos que permanecem no
buffer h mais tempo.
Esta rea dimensionada atravs do parmetro DB_BLOCK_BUFFERS (em nmero de blocos) no NT.ORA.
Redo Lo8 B0--er
O Oracle se utiliza de uma estratgia de Log para, em uma situao de falha, refazer todas as aes pendentes
em uma base de dados. A parte em memria deste Log chama-se Redo Log Buffer, que atua como rea
temporria onde so escritas as aes, e que de tempos em tempos descarregada em disco, nos logfiles
(utilizados de uma maneira circular). Este processo de salvaguarda muito rpido, e para o usurio da base de
dados, totalmente transparente.
O parmetro utilizado para dimensionar o Redo Log Buffer o LOG_BUFFER_SZE (em bytes).
ESTRUTURAS DE )E)9RIA RESERADAS PELA INST3NCIA
1
DigiData Informtica 8 ! 94
S!E"E# P$$%
(%ibrar& cac'e ( data
dictionar& cac'e)
#A)ABASE bu**er cac'e

"E#$ %$G Bu**er
Processos de
Background
Instncia
Arquivo que compem a base de dados
Apostila de Oracle

Processos
Os principais processos que compem uma instncia (chamados background processes) geralmente realizam
dois grupos de funes: gerenciar as estruturas de memria e monitorar a utilizao da instncia e da base de
dados (existem outros tipos, alguns especficos da forma como a instncia configurada, outros que se utilizam
com as opes especiais do Oracle). H ainda os processos que so originados pelas conexes dos usurios
(os Server Processes). Em geral se relaciona os seguintes, como parte integrante de uma instncia:
DBWR (Database Writer)
LGWR (Log Writer)
CKPT (Chekpoint process)
DB:R ;Data/ase :riter<
Quando um comando se referencia a blocos de dados que no esto em memria, o Server process os retira dos
arquivos em disco e os coloca no Database Buffer Cache. Se algum bloco modificado, ento marcado como
"sujo (dirty). Os blocos dirty devem ser escritos de volta nos arquivos em disco, para salvaguardar as alteraes.
O DBWR o encarregado disso.
Mas essa gravao no feita de imediato. Para otimizar ao mximo o /O (input/output) em disco, o DBWR se
utiliza da tcnica Delayed Writing (Escrita Retardada), ou Batch Writing (Escrita em Lote) que significa que as
alteraes nos blocos de dados s so efetuadas em disco se um dos seguintes eventos ocorrer:
+ Um Server process no encontra blocos livres no Database Buffer Cache
, Um Checkpoint
- O nmero de dirty blocks em memria atingiu um limite determinado
Quando o DBWR escreve de volta para disco os blocos modificados, coloca um bloqueio (lock) em alguns blocos
do Database Buffer Cache, e s os libera quando acabar a gravao. Deste modo, alguma conteno pode
ocorrer se vrios usurios estiverem acessando os mesmos blocos de dados.
L":R ;Lo8 :riter<
Qualquer atividade na base de dados registrada no Redo Log. Primeiramente elas so feitas no Redo Log
Buffer e regularmente vo sendo escritas em disco (nos logfiles) pelo LGWR. Os registro feito seqencialmente
para evitar conteno. O objetivo salvaguardar a informao o mais freqentemente e rapidamente possvel
nos logfiles, permitindo ao DBWR atrasar as operaes de escrita nos arquivos da base de dados propriamente
dita. Para o usurio, as operaes requisitadas so confirmadas assim que o LGWR informa que a informao
est salvaguardada (e no o DBWR), dando assim um tempo de resposta menor.
O LGWR "acorda para gravar do Redo Log Buffer nos logfiles quando ocorre um dos seguintes eventos:
1. O Redo Log Buffer atinge um tero de sua capacidade
2. Uma transao qualquer confirmada (comando COMMT)
3. Num tempo determinado pelo parmetro
LOG_CHECKPONT_TMEOUT
DigiData Informtica 9 ! 94
Apostila de Oracle

C=PT ;C7e>point process<
Um checkpoint o momento em que o contedo do Database Buffer Cache escrito pelo DBWR nos respectivos
arquivos em disco. Neste momento, os arquivos fsicos que compem toda a base de dados so sincronizados
atravs da gravao, no header (cabealho) de cada um, de um nmero, chamado SCN (System Change
Number). Desta maneira o Oracle "sabe que a base de dados est consistente.
O evento de checkpoint de responsabilidade do processo CKPT.
Um checkpoint ocorre em resposta a uma das seguintes situaes:
1. Quando ocorre um log switch (um grupo de logfiles
"enche)
2. De acordo com os parmetros
LOG_CHECKPONT_NTERVAL ou LOG_CHECKPONT_TMEOUT
3. Quando explicitamente comandado pelo DBA
4. Quando a instncia fechada (de modo normal)
O LOG_CHECKPONT_NTERVAL sinaliza um checkpoint sempre que um determinado nmero de blocos do
sistema operacional j tiver sido escritos nos arquivos de log. O outro indica de quantos em quantos segundos
deve ocorrem um checkpoint (utilize zero se quiser desativ-lo). Ambos so parmetros do NT.ORA.
Para forar manualmente um checkpoint, o DBA, com a instncia aberta, pode comandar:
alter system checkpoint;
Siste5a de ar10ivo de 05a /ase de dados
Vimos que uma instncia Oracle, composta de uma SGA e processos em background, uma estrutura em
memria que possibilitava a conexo e o acesso a uma base de dados. Mas o que , fisicamente, uma base de
dados?
Basicamente, uma base de dados Oracle possui os seguintes arquivos em disco:
1. Controlfiles
2. Redo Log Files
3. Datafiles
Existem outros tipos de arquivos externos base de dados, com funes distintas (arquivo de inicializao -
NT.ORA, arquivos de backups de Log - Archived Logs e arquivo de password - Password File, dentre os mais
importantes, assim como arquivos de rasteio Trace Files, um arquivo chamado ALERT.LOG, e outros), mas
estes no fazem parte da base em si.
Control-ile
O controlfile um dos arquivos mais importantes de qualquer base de dados Oracle, um dos que mais inspira
cuidados. A informao bsica de uma determinada base de dados (principalmente, a localizao dos dois
outros grupos de arquivos, os Redo Log Files e os Datafiles) guardada no Controlfile. Quando essa informao
muda (p.ex., quando se muda a localizao de um Log File ou quando se acrescenta mais um Datafile base de
dados), as informaes no Controlfile devem refletir esta mudana. Outras informaes (p.ex., o estado de um
datafile on-line ou off-line o SCN System Change Number, etc.) tambm so ali guardadas. Outros
exemplos: O nome da base de dados, a data da sua criao, valores de parmetros como MAXLOGFLES,
MAXLOGMEMBERS, MAXLOGHSTORY, MAXDATAFLES e MAXNSTANCES, etc.
Como o leitor pode constatar necessria uma extrema cautela com o Controlfile. Tanto que a prpria Oracle
nos recomenda ter duas ou mais cpias deste arquivo em unidades de armazenamento diferentes (o Controlfile
pode ser multiplexado, de modo que a falha em uma cpia compensada automaticamente pelo uso de outras).
O parmetro CONTROL_FLES no NT.ORA determina a localizao fsica dos Controlfiles.
O Controlfile pode, portanto, ser visto como um metaarquivo, um local onde o Oracle registra dado sobre si
prprio.
DigiData Informtica 10 ! 94
Apostila de Oracle

Redo Lo8 -iles
Os Redo Logfiles so os arquivos utilizados para atividades de log numa base de dados Oracle. So criados e
dimensionados no momento de criao da base de dados e existem em grupos, sendo que h no mnimo dois
grupos. Cada grupo constitudo por membros, e todos registram exatamente a mesma informao. O objetivo
de ter grupos com mais do que um membro destina-se a aumentar a proteo do sistema contra falhas.
O LGWR escreve o contedo da memria nos arquivos de log de forma circular: comea por escrever no
primeiro grupo (simultaneamente em todos os seus membros); depois deste grupo estar cheio passa para o
segundo grupo, e assim por diante at o ltimo grupo, e, ao atingir o seu limite deste, recomea ento com o
primeiro grupo novamente. A criao de vrios membros para cada grupo de logfiles destina-se a multiplexar a
gravao do Redo Log Buffer feita pelo LGWR. A operao de passagem de um grupo para outro chamada
Log Switch e tambm pode ser forada pelo DBA com o seguinte comando:
alter system switch logfile;
Caso a base de dados esteja em Modo Archive, os arquivos de log, depois de preenchidos, so copiados
para os Archive Logfiles.
Data-iles
Os datafiles so os arquivos onde se registram os dados (sejam dados de aplicao, do dicionrio de dados ou
qualquer outro tipo de dados de controle). Quando um datafile criado ele est vazio, mas seu tamanho em
termos de espao em disco reservado e formatado. As caractersticas destes arquivos permitem as seguintes
operaes:
1. Coloc-los online ou offline
2. Parametriz-los para crescerem de forma dinmica
3. Redimension-los, liberando espao no utilizado
Para o momento, o conceito mais importante a reter o de que os datafiles so o local onde o Oracle registra
todo o tipo de dados, independente do seu nvel de abstrao. A sua criao ser focada na parte reservada
criao de objetos lgicos chamados.
Arc7ived Lo8s
Se a base de dados estiver em modo Archive, os arquivos de log depois de um log switch (e no
necessariamente depois de estarem completamente escritos) so arquivados. O nome destes archived logs.
So estes arquivos que permitem mais tarde a recuperao da base de dados.
Os archived logs so guardados pelo processo ARCH no diretrio definido pelo parmetro
LOG_ARCHVE_DEST e o seu formato pode igualmente ser definido pelo DBA. Sero vistos em detalhe na parte
de "Backup e Recuperao".
Estr0t0ras L68icas
As estruturas lgicas permitem ao Oracle Server fazer um mapeamento entre os objetos lgicos e a gerncia do
seu espao fsico. Cada objeto Oracle (tabelas, ndices, etc.) criado tendo como unidade de armazenamento as
estruturas lgicas. Estas estruturas, por sua vez, esto armazenadas nos datafiles de forma completamente
transparente ao usurio.
Ta/lespaces
A tablespace uma rea lgica, composta fisicamente por um ou mais arquivos, os datafiles.
Existe em cada base de dados pelo menos um tablespace, chamado SYSTEM, onde est registrada toda a
informao sobre a base de dados, e ainda cdigo PL/SQL. Esta tablespace implicitamente criada no momento
da criao da base de dados, cabendo ao DBA a criao dos tablespaces adicionais.
DigiData Informtica 11 ! 94
Apostila de Oracle

Estas estruturas lgicas permitem efetuar uma melhor organizao dos dados, agrupar usurios, separar dados
de aplicaes distintas e gerenciar diferentes necessidades de alocao de espao. Quando criado um objeto,
como uma tabela ou um ndice, este associado a uma tablespace que por sua vez registra os dados dos seus
objetos em um ou mais datafiles. Uma tabela de clientes, p. ex., est atribuda a uma tablespace, e armazenada
fisicamente em um ou mais Datafiles.
Se85entos
Os segmentos so a unidade lgica que constitui os tablespaces. Cada tablespace pode ser composta por um
numero ilimitado de segmentos, estando o espao fsico limitado apenas pelo tamanho dos datafiles que o
compem, e estes, limitados pelo espao disponvel nos discos do sistema.
Existem seis tipos de segmentos numa base de dados Oracle:
Segmentos de Dados
Segmentos de ndices
Segmentos Temporrios
Segmentos de Rollback
Segmentos LOB (s em Oracle8 em diante)
Segmento LOB-index (s em Oracle8 em diante)
Os segmentos de dados so criados para armazenar a informao dos objetos do tipo tabela, cluster, tabela
particionada (s em Oracle8) ou tabela organizada como um ndice (index organized table, tambm s em
Oracle8). Para que o leitor no fique muito confundido, desde j podem associar os segmentos de dados s to
comuns tabelas. A forma como a tabela est organizada deve ser, por hora, ignorada pelo leitor, uma vez que
cada tipo de organizao ser visto em pormenor em sees futuras.
De modo a tomar mais rpido o acesso aos dados das tabelas, podem-se criar um outro tipo de objetos,
chamados ndices. Os ndices necessitam de espao para registrar a sua prpria informao, tal como o valor do
endereo fsico da linha (rowid) e os valores das colunas indexadas. Esta informao registrada num outro tipo
de segmentos, os segmentos de ndices.
Os segmentos temporrios so criados automaticamente pelo Oracle, quando necessrio efetuar operaes
temporrias, como ordenaes, verificao da sintaxe de comandos SQL (parsing) e agrupamentos de dados.
Os comandos SELECT que incluam as clusulas ORDER BY, DSTNCT, GROUP BY, UNON, NTERSECT e
MNUS, e ainda o comando CREATE NDEX, so candidatos a originarem a criao pelo Oracle de segmentos
temporrios.
Os segmentos de rollback tm como funo principal a de registrar as aes de todas as transaes ativas, para
o caso de ser necessrio desfaze-las. Tambm so chamadas de undo segments e so dos segmentos que
maiores cuidados inspiram por parte do DBA.
Por fim temos os segmentos LOB e LOB-index, que so exclusivos da verso 8 do Oracle em diante, e
destinados a armazenar, respectivamente, informao de objetos grandes (Large Objects) e dos seus ndices.
A maior motivao para a criao de tablespaces diferentes reside no fato de se necessitar separar cada um
destes tipos de segmentos.
Esses tipos de segmentos aqui referidos sero analisados em maior detalhe nas sees posteriores deste livro.
E?tens,es ;EXTENTS< e Blocos de Dados ;DATABASE BLOC=S<
Qualquer tipo de segmento composto por uma srie de blocos de dados. O bloco de dados a menor unidade
de armazenamento de informao numa base de dados Oracle (daqui em diante faremos referncia ao bloco de
dados simplesmente como 'bloco'). Os blocos que compem um segmento no esto necessariamente contguos
no disco, ainda que faam parte do mesmo datafile. Aos conjuntos de blocos que se encontram contguos no
disco d-se o nome de extent. O extent a unidade mnima de alocao de espao numa base de dados Oracle.
Quando um segmento criado, reservado um determinado nmero de extents, que pode ser apenas um ou
mais. Uma vez reservados os extents para um segmento, a informao a ser registrada vai utilizando esse
espao. No momento em que o segmento necessitar de mais espao para crescer, torna-se a reservar um novo
extent. Este espao procurado dentro dos datafiles que compem o tablespace onde o segmento est.
A definio do tamanho do bloco feita atravs do parmetro DB_BLOCK_SZE no arquivo de inicializao. Este
valor fixo uma vez que serve para formatar os datafiles que compem a base de dados. Os valores possveis
DigiData Informtica 12 ! 94
Apostila de Oracle

para o tamanho do bloco vo desde os 2kbytes at aos 32kbytes, mas nem todos os sistemas operacionais
suportam todos os tamanhos possveis do bloco. A definio deste parmetro uma das decises mais
importantes do DBA no momento da criao da base de dados. A parte referente gerncia dos segmentos e a
parte de otimizao iro trazer mais luz sobre a implicaes desta importante deciso.
Co5o t0do -0nciona
Depois de descritas as principais peas do database engine Oracle, veremos aqui como elas se encaixam. Quais
os processos, estruturas de memria, arquivos e qual a seqncia de passos envolvidos na interao dos
usurios com a base de dados. O cerne desta interao a linguagem SQL e nesta seo sero cobertos cada
um dos trs tipos de operaes que qualquer base de dados tem de oferecer: seleo, manipulao e
salvaguarda dos dados. Cada subseo seguinte ir cobrir cada uma destas operaes, mostrando os
comandos da linguagem SQL dentro do universo Oracle:
. SELECT
. UPDATE
. COMMT
Na parte da manipulao dos dados (DML) foi escolhida a atualizao de dados (comando UPDATE) para
exemplificar o funcionamento interno do Oracle.
ndependente do tipo de operao, cada comando enviado para o servidor da base de dados deve ser
previamente validado. Quem envia o comando o user process e quem o recebe e valida o server process
2
.
Depois de receber o comando do user process, cabe ao server process fazer a validao do comando (parsing).
O parsing do comando inclui:
. Verificao da sintaxe do comando
. Verificao estrutural
eri-ica+.o dos privil@8ios de acesso
A verificao da sintaxe do comando SQL implica uma anlise das clusulas utilizadas de modo a garantir que o
comando respeita todas as configuraes possveis. No caso de o comando incluir subqueries, ento o processo
de verificao da sintaxe comear por a.
A verificao estrutural a fase em que, depois de verificada a sintaxe do comando, o server process verifica se
os objetos a que o comando faz referncia existem. No caso de o objeto ser uma tabela, verificado se esta
existe dentro do schema do usurio e se as colunas referenciadas no comando fazem parte dessa tabela.
A verificao dos privilgios de acesso feita simultaneamente com a verificao estrutural. Caso
existam objetos referenciados no comando SQL que pertenam a outro schema/usurio, o server process verifica
se o usurio que emitiu o comando possui os necessrios privilgios de acesso.
Sele+.o de Dados ;SELECT<
Participam:
Processos Envolvidos: Server Process, DBWR
Estruturas de Memria: Database Buffer Cache, Library Cache (Shared Pool)
Arquivos: Datafiles
Como tudo funciona:
Depois das necessrias verificaes (fase de parsing), o server process procede leitura dos dados que
o comando referencia, procurando primeiro no Database Buffer Cache em memria. Os dados que no encontrar
em memria procura-os no disco (nos datafiles) e coloca-os em memria, no database buffer cache. Ao colocar
os blocos trazidos do disco em memria, se o server process no encontrar suficientes blocos livres para
2
DigiData Informtica 13 ! 94
Apostila de Oracle

armazenar os seus dados, sinaliza o processo DBWR para que este liberte espao em memria. O DBWR
percorre ento a lista dos blocos marcados como "j modificados (blocos dirty), escrevendo-os nos respectivos
datafiles.
Se os dados necessitarem de algum tipo de ordenao ou agrupamento, este pode ser efetuado em
memria ou no disco, em segmentos temporrios.
Estas operaes de leitura so gerenciadas por um plano de execuo construdo na fase de parsing.
Para cada comando SELECT construdo um plano de execuo que colocado em memria dentro da shared
pool, mais precisamente dentro da library cache. De modo a acelerar as pesquisas, evitando verificaes e
construes de planos de execuo repetidos, a library cache o primeiro acesso de memria do server
process. Quando um comando SELECT for repetido, a sua informao de verificao e o seu plano de execuo
j se encontram resolvidos em memria, tornando o resto do processo mais rpido, uma vez que a fase de
parsing, a mais "custosa em termos de recursos, j no necessita ser feita.
)anip0la+.o de Dados ;D)L<
Os comandos de manipulao de dados pertencem a um subconjunto de comandos dentro da linguagem
SQL, os comandos DML (Data Manipulation Language): UPDATE (atualizao), DELETE (excluso) e NSERT
(insero). Nesta subseo iremos ver como funciona internamente a "mquina Oracle quando emitido um
comando de UPDATE.
Participantes:
Processos Envolvidos: Server Process, DBWR
Estruturas de Memria: Database Buffer Cache, Data Dictionary Cache (Shared Pool) e Redo Log Buffer.
Arquivos: Datafiles
Como tudo funciona:
Como qualquer comando SQL, um UPDATE tambm tem de passar pela fase de parsing. Na fase de
execuo onde comeam as diferenas.
O server process necessita efetuar os passos que garantam que a operao de atualizao dos dados
mantenha a consistncia de leitura dos dados.
A consistncia de leitura destina-se a garantir que os dados retirados da base numa consulta, em
qualquer instante, esto consistentes. A consistncia de leitura, numa base de dados Oracle, garantida atravs
de segmentos especficos (segmentos de rollback) e de mecanismos de bloqueio (locking).
Os segmentos de rollback registram as alteraes feitas base de dados, feitas pelos comandos de
DML. No caso de uma alterao de dados (UPDATE), a imagem anterior alterao copiada para este tipo de
segmentos, garantindo assim que se algum outro usurio desejar consultar informao que est sendo alterada
no momento, possa ter acesso a dados consistentes. Os segmentos de rollback necessitam de uma gerncia
cuidadosa por parte do DBA.
A consistncia de leitura deve tambm garantir que no existe mais do que um usurio atualizando os
mesmos dados num mesmo momento. Para tal, existe um mecanismo de bloqueio (lock). Um usurio espera at
adquirir o direito de bloqueio sobre determinadas linhas ou sobre uma tabela e quando o obtm bloqueia os
dados que vai modificar. Quando o bloqueio for liberado pode depois ser adquirido por outro usurio. Os
bloqueios so liberados por um usurio explicitamente, quando a operao de UPDATE confirmada (COMMT)
ou cancelada (ROLLBACK) ou, implicitamente, quando uma sesso de conexo base de dados "morre
subitamente (ou terminada pelo DBA). Nesta altura o processo de background chamado process monitor
(PMON) encarrega-se de verificar se a sesso recm terminada deixou pendentes alguns bloqueios que
necessitem ser liberados. Caso contrrio, os outros usurios que desejassem efetuar operaes de UPDATE
sobre os mesmos dados teriam de esperar eternamente!
Resumindo: a consistncia de leitura deve garantir que nos mesmos dados os processos de leitura no
devem esperar pelos processos de escrita e vice-versa.
Os passos dados pelo server process para i5ple5entar 05a opera+.o de UPDATE s.o os
se80intes!
a) O server process vai aos datafiles buscar os blocos necessrios e os coloca no Database Buffer Cache, se
estes j no se encontrarem l. Da mesma forma que o comando SELECT, se no existir espao livre, o DBWR
DigiData Informtica 14 ! 94
Apostila de Oracle

sinalizado para o liberar escrevendo blocos dirty para o disco. Os blocos dirty so aqueles cuja imagem em
memria mais atual que o seu correspondente em disco (nos datafiles).
b) Uma vez que vai efetuar uma operao de UPDATE, o server process necessita adquirir o lock sobre os
dados que vai alterar. Esse lock registrado no dicionrio de dados, mais precisamente na estrutura existente
em memria para tal, o Data Dictionary Cache na Shared Pool.
c) So registradas no Redo Log Buffer duas entradas, uma referente alterao a ser feita, outra com a
informao antiga.
d) Agora que os dados esto bloqueados e o registro feito no log, vo se efetuar as duas operaes de escrita
que necessitam de ser feitas no Database Buffer Cache: alterar os blocos dos dados que so afetados pelo
comando UPDATE e registrar a imagem antiga desses dados em blocos do segmento de rollback. Ambos os
tipos de blocos so marcados como dirty.
)ecanis5o de E-etiva+.o de Dados ;CO))IT<
Participantes:
Processos Envolvidos: Server Process, LGWR
Estruturas de Memria: Database Buffer Cache, Data Dictionary Cache (Shared Pool) e Redo Log Buffer.
Arquivos: Redo Log files
Como tudo funciona:
Depois de efetuar o comando COMMT, todos aqueles que esto habituados a trabalhar com uma base
de dados transacional (Oracle ou no) costumam respirar aliviados! De fato, a mensagem que o servidor Oracle
envia de volta ao usurio de que os seus dados esto confirmados, gravados, seja l o que for, quando se
executa o comando COMMT, nos leva a crer que estes esto efetivamente gravados em disco. Vamos ver
passo a passo como executada internamente a salvaguarda dos dados:
a) O COMMT registrado como uma entrada no Redo Log Buffer pelo server process.
b) O LGWR sinalizado para escrever em disco, no arquivo de log corrente, o contedo do Redo Log Buffer.
Desta forma est salvaguardada a inteno do usurio.
c) Depois desta escrita nos logfiles, o usurio informado que o COMMT foi feito com sucesso.
d) S depois de registrar no log e de informar o usurio que o server process vai iberar eventuais locks que a
transao poderia ter obtido, liberando assim os blocos de dados que estavam na Database Buffer Cache
reservados a segmentos de rollback.
Ento, quando que os dados so guardados em disco? Para surpresa de muitos que esto habituados
a associar a operao de commit ao comum "gravar, surge aqui a primeira lio sobre Backup e Recuperao: o
que importa o que est no log. Abaixo seguem relacionados trs cenrios de falha, para mostrar que o dado foi
realmente gravado em algum lugar, e a mensagem de Commit bem sucedido vlida:
CenArio de %al7a antes do Co55it
Se no momento em que se preparava para confirmar uns 100 comandos de NSERT, 50 DELETES e
uma mo cheia de UPDATES, naquilo que constitua uma transao pesada, acontece uma falha de energia
inultrapassvel, ento toda a informao que estava em memria se perde. E o que que estava em memria?
Possivelmente at nem estava muito, pois alguns dos blocos dirty que haviam sido afetados pelas operaes de
manipulao de dados, at j podiam ter sido escritos para disco. sso mesmo! Dados que ainda ningum
confirmou podem j ter ido parar nos datafiles devido falta de espao em memria.
Ao voltar a energia e ao iniciar-se a instncia, o processo SMON (system monitor) vai olhar para os
arquivos de log e para os datafiles colocando-os de acordo com aquilo que est confirmado nos logs, e
desfazendo tudo aquilo que so dados no confirmados. Por este motivo, o registro que "manda o que est
feito nos logfiles.
DigiData Informtica 15 ! 94
Apostila de Oracle

CenArio de %al7a d0rante o Co55it
O cenrio de falha que mais gera dvida sempre o seguinte: O que que acontece se a luz falhar
exatamente no momento em que o comando de COMMT emitido, escrito como entrada em memria no Redo
Log Buffer, mas o LGWR no teve tempo de registr-lo nos arquivos de log?
Se a luz falhou antes do LGWR ter tempo de escrever em disco todas as entradas do Redo Log Buffer
incluindo o nosso COMMT, ento significa que ainda no devolveu a mensagem de confirmao
(acknowledgement) de volta ao usurio. Se o usurio no recebeu a mensagem, ento no dever ter muitas
esperanas de que a sua transao tenha ficado salvaguardada.
De qualquer modo, o importante colocar a base num estado consistente quando for iniciada e, por isso,
o que est registrado no log a lei. Se o nosso COMMT no estiver l, ento toda a transao ser cancelada
(ROLLBACK).
CenArio de %al7a depois do Co55it
magine que a base de dados foi fechada de forma abrupta pelo DBA ou at mesmo que a mquina onde
est o Oracle foi desligada de forma abrupta. Novamente o que estava em memria se evaporou, mas o
COMMT j foi registrado nos logfiles em disco, por isso o DBA pode dormir descansado. sto significa que,
mesmo que os dados referentes a esta transao estivessem ainda em memria no momento do crash, eles
seriam repostos e confirmados, pois o SMON, no seu processo de recuperao automtica da instncia, ao ser
iniciada a base, iria encarregar-se de aplicar aos datafiles as entradas registradas nos logs.
ESTRUTURA
Lin80a8e5 SQL
A linguagem SQL ferramenta bsica para o acesso aos dados de um banco de dados relacional e o primeiro e
mais importante passo para se estabelecer nele. Nos ltimos anos, a linguagem SQL saiu do mainframe e foi
estendida ao desktop. Essa mudana se deve ao fato de que os bancos de dados relacionais tambm
expandiram suas plataformas e hoje possuem verses que executam desde um PC at um mainframe.
Por possuir uma estrutura adequada para a arquitetura cliente/servidor, cada vez mais aplicaes e pginas que
acessam bancos de dados relacionais esto sendo criadas por intermdio da linguagem SQL.
ANSI SQL
Significa American National Standards nstitute, uma organizao que responsvel por planejar padres para
vrios produtos e conceitos. No caso do SQL, isso fornece um esqueleto bsico de fundamentos bsicos
necessrios, que como um resultado final, permite consistncia entre vrias implementaes. Com a linguagem
SQL podemos nos comunicar com qualquer banco de dados que trabalhe com o sistema (RDBMS), afinal, se
tivssemos uma linguagem para cada banco de dados, ficaria difcil a comunicao e at mesmo a migrao
desses dados entre bancos de dados.
Exemplo, imagine que cada pas fosse um banco de dados, logo, cada pas tem uma lngua nativa, dificultando
ento a comunicao entre eles, com isso, teramos que aprender cada lngua desses pases. Assim como o
ingls que uma lngua de comunicao universal, o SQL a lngua universal de comunicao entre banco de
dados relacional, tornando mais fcil a comunicao entre os usurios e aplicativos com o banco de dados.
DigiData Informtica 16 ! 94
Apostila de Oracle

Tipos de co5andos de SQL
D)L ;Data )anip0lation Lan80a8e<
Linguagem de Manipulao de Dados, a parte de SQL utilizada para manipular dado dentro de objetos de um
banco de dados relacional.
H trs comandos bsicos de DML:
NSERT
UPDATE
DELETE
DDL ;Data De-inition Lan80a8e<
Linguagem de definio de dados, a parte de SQL que permite criar e reestruturar objetos de banco de dados,
como criar e excluir uma tabela.
Os principais comandos de DDL incluem os seguintes:
CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE NDEX
ALTER NDEX
DROP NDEX
DCL ;Data Control Lan80a8e<
Linguagem de Controle de Dados, permitem que voc controle o acesso a dados dentro do banco de dados, so
normalmente utilizados para criar objetos relacionados com acesso de usurio e tambm para controlar a
distribuio de privilgios entre usurios, alguns comandos de controle de dados so:
ALTER PASSWORD
GRANT
REVOKE
CREATE SYNONYM
Co5andos de Controle Transacional
Permitem ao usurio gerenciar transaes dentro de banco de dados.
COMMT
ROLLBACK
DigiData Informtica 17 ! 94
Apostila de Oracle

Lo8in Padr.o/Criar Us0Arios
Qualquer pessoa que deseja acessar o Oracle precisa ser previamente cadastrada como um usurio desse
banco de dados e deve possuir privilgios para realizar suas tarefas.
Para ter acesso ao banco de dados, seja qual for a operao desejada, necessrio fazer o login de acesso.
Observando abaixo, quando da execuo do utilitrio, foi fornecido uma interface para entrada de dados de login.
Aqui devemos utilizar para Nome do Usurio e Senha, system e 123, respectivamente, pois foram esses os
valores utilizados quando da instalao do produto. Na prtica, somente a Senha (123) foi opcional na
instalao, j que o Nome do Usurio (system) padro para todas as instalaes.
Observando a Figura 02, quando da execuo do utilitrio, foi fornecido uma interface para entrada de dados de
login.
%i80ra BC
DigiData Informtica 18 ! 94
Apostila de Oracle

Alterando o Lo8in Padr.o
Como primeira tarefa, devemos criar um novo login, na verdade, logado como System/123 (usurio padro),
criaremos um novo usurio para com este novo login criar os objetos necessrios para nosso projeto, inclusive
dar a este novo usurio, poderes de DBA da mesma forma que o usurio System.
%i80ra BD
%i80ra BE
DigiData Informtica 19 ! 94
Apostila de Oracle

Observando a Figura 03, clique na opo de menu Criar Usurios, e em seguida oriente-se pela Figura 04 para
definir as propriedades e permisses para o novo usurio.
Aqui adotamos o nome do usurio como sendo Aluno, com senha de acesso igual a 123. Marque todas as
opes conforme a Figura 04. Ao fina termos criado um novo usurio conforme Figura 05.
%i80ra BF
Criando Ta/lespace
No encontraremos um nico arquivo responsvel pela existncia do banco de dados, na verdade existe uma
coleo de arquivos que compe uma base Oracle. O estudo minucioso deste aspecto foge ao escopo deste
apostila, ficando o foco naquilo que denominamos Tablespace e seus arquivos de dados (Datafile).
Um Tablespace um objeto lgico, que lista um ou mais DataFile (arquivos de dados fsicos). O uso de um
Tablespace especfico para cada projeto, ou at mesmo vrios Tablespaces para um mesmo projeto, concorre
para os seguintes benefcios:
a) solamento dos objetos (Table, View, etc.) de uma projeto de banco de dados de outros permitindo melhor
administrao.
b) Melhor performance, principalmente para projetos onde existe um volume de dados superior a Gigabytes de
dados. Assim podemos definir quais objetos residam em que Tablespace.
c) No mesmo sentido do item anterior, podemos dividir os DataFiles de um Tablespace em vrios diretrios do
servidor e ,inclusive, em vrios dispositivos de mdia (HDs) do servidor. sto especialmente eficiente, sendo a
tomada de deciso correta no sentido de otimizar acesso aos dados.
DigiData Informtica 20 ! 94
Apostila de Oracle

Observe a Figura 06 e 07, para iniciar o processo de criao de Tablespace para nosso projeto. Em seguida
execute a seguinte instruo no Editor SQL de nosso utilitrio:
CREATE TABLESPACE TBS_ALUNO
DATA%ILE 'C:\ORACLE10GEXPRESSEDTON\TBS\DF_ALUNO.DBF'
SIGE 5M
REUSE AUTOEXTEND ON
NEXT 5M
)AXSIGE 150M;
A Figura 08 exibe o Editor SQL, onde devemos colocar o cdigo acima, e em seguida clicar no boto Executar
para proceder criao da Tablespace. Conforme ainda poderemos observar ao longo deste manual, quase a
totalidade das operaes de criao de objetos so baseados em interfaces amigveis com simples opo de
escolha e pouca entrada de dados.
%i80ra BH
DigiData Informtica 21 ! 94
Apostila de Oracle

%i80raBI
%i80ra BJ
DigiData Informtica 22 ! 94
Apostila de Oracle

%i80raBK
Tarefas administrativas como criar Tablespace, alterar Tablespace default de usurios, entre outras, exigem o
uso do Editor de SQL. sto no chega a ser problema, at porque, em ambientes de desenvolvimento Oracle, os
editores de texto ainda imperam, possivelmente por mera tradio. Somos alheios a isto, e tentaremos obter o
mximo de produtividade os recursos RAD de nosso utilitrio.
Concludo a etapa exemplificada na Figura 08, podemos ver o resultado do trabalho navegando pelos passos representados
pelas Figuras 09 e 10. A figura 10 exibe uma tabela muito til para acompanharmos a evoluo de espao ocupado por
Tablespaces, servindo como termmetro para tomada de deciso quanto expanso ou criao de novas Tablespaces.
%i80ra LB
DigiData Informtica 23 ! 94
Apostila de Oracle

Rede-inindo Ta/lespace Padr.o do Us0Ario
Quando criamos o usurio para nosso projeto, no tnhamos mais que a Tablespace padro da instalao do
Oracle Database 1og Express Edition. Mas passado os passos da etapa anterior, ou seja a criao da
Tablespace TBS_ALUNO, devemos definir esta como Tablespace padro para o usurio Aluno, objetivando
acomodar fisicamente todos os objetos do nosso projeto, j que sero todos de domnio deste usurio.
Esta etapa tambm classificada como administrativa, e faz parte das tarefas que exigem digitao de cdigo
em nosso Editor SQL. Assim sendo, proceda conforme cdigo relacionado abaixo:
ALTER USER ALUNO
DE%AULT TABLESPACE TBS_ALUNO
Proceda a execuo do cdigo acima, observando o resultado no Editor SQL conforme exibida na Figura 11.
Agora faa um novo login, como usurio Aluno/123 visando corretamente criar objetos pertencentes a este
usurio, acomodados naturalmente na TableSpace TBS_ALUNO.
ROLE ;PAPEL<
Criando Papel
As instrues abaixo criam dois papis (Role) sem nenhum privilgio.
MCreate Role Papel_Basico;
MCreate Role Papel_Completo;
Concedendo Privil@8ios a 05 Papel
As instrues abaixo garantem privilgios a papis.
-"rant Resource to Papel_Basico;
-"rant Connect to Papel_Basico;
-"rant Resource to Papel_Completo;
-"rant Connect to Papel_Completo;
-"rant Select, nsert on Produtos to Papel_Basico;
-"rant Select, nsert , Update, Delete on Produtos to Papel_Completo;
Criando 05 novo 0s0Ario
Novo usurio, para posterior atribuies de papeis.
MCreate User Novo_Usuario identi-ied BN A123;
Concedendo Privil@8ios de Papel a 05 Us0Ario
As instrues abaixo atribuem papis a usurios.
-"rant Papel_Basico to Novo_Usuario;
Com a instruo acima, qualquer tentativa de inserir e selecionar registros na tabela Produtos, por este novo
usurio aps o login, ser bem sucedida. Porm, se tentar operaes como Delete e Update, certamente falhar
pois no tem permisso para tanto.
DigiData Informtica 24 ! 94
Apostila de Oracle

A soluo seria dar a este usurios privilgios por intermdio do papel Papel_Completo. Veja ento a rotina
abaixo:
-"rant Papel_Completo to Novo_Usuario;
%i80ra LL
So/re Ta/elas
Criando Ta/elas
Uma tabela [table] um objeto do banco de dados, composto de zero ou mais linhas [rows], contendo os dados,
organizados em uma ou mais colunas [columns]. Para criar a tabela voc pode usar o Enterprise Manager ou
utilizando comandos SQL DDL (Data Definition Language) em um editor SQL . Antes de criar suas tabelas,
importante levar em conta um bom projeto do banco de dados, que determina quais as informaes a serem
guardadas.
Tipos de Dados
Cada coluna tem um tipo de dados [data type], que determina que tipo de informaes (caracteres, nmeros,
datas/horas) podem ser colocadas nas colunas e quais as caractersticas desses dados. O tipo de dados
determinado quando a tabela criada e no pode ser alterado posteriormente. Voc pode usar tipo de dados do
sistema, predefinidos, ou criar novos tipos de dados, chamados tipo de dados do usurio baseados nos tipos de
dados existentes.
Os tipos de dados existentes so:
ARIOEIS SI)PLES
BNARY NTEGER numrico, para armazenamento de valores inteiros de -2**31 a (2**31) - 1
sinta?e! binary_integer
s0/tipos! natural -de 0 a (2**31) -1
positive -de 1 a (2**31) -1
DigiData Informtica 25 ! 94
Apostila de Oracle

NUMBER numrico, para armazenamento de valores em ponto flutuante com preciso de at 38 dgitos.
sinta?e! number [(<preciso>,<escala>)]
s0/tipos! dec idem a number
decimal idem a number
double precision idem a number
float idem a number
integer idem a number
int idem a number
numeric idem a number
real idem a number
smallint idem a number
CHAR alfanumrico de tamanho fixo com at 32767 caracteres.
sinta?e! char [(<comprimento>)]
s0/tipo! string idem a char
LONG alfanumrico de tamanho varivel com comprimento de at 32760.
sinta?e: long
VARCHAR2 alfanumrico de tamanho varivel com comprimento de at 32767.
sinta?e! varchar2 [(<comprimento>)]
s0/tipo! varchar idem a varchar2
RAW para armazenamento de dados binrios (tam.mx. at 32767).
sinta?e: raw (<comprimento>)
LONG RAW para armazenamento de dados binrios at o tamanho de 32760.
sinta?e: long raw
BOOLEAN valores boleanos (true, false, ou null).
DATE armazenamento de datas.
sinta?e: date
ROWD valores de "rowid do Oracle (em hexadecimal).
sinta?e: rowid
-or5ato! BBBBBBBBB.RRRR.FFFF
onde:
BBBBBBBBB - bloco dentro do arquivo (database file)
RRRR - row dentro do bloco (primeira row 0)
FFFF - nmero do arquivo (database file)
DigiData Informtica 26 ! 94
Apostila de Oracle

CONERS$O DE TIPO DE ARIOEL
Pode-se converter de um tipo de varivel para outro explicitamente, porm, em muitas situaes a PL/SQL pode
converter o tipo de caractere em outro, implicitamente. sto ocorre quando usamos varivel de um tipo onde era
esperado outro. A PL/SQL utiliza uma das seguintes funes para executar esta converso:
TO_CHAR TO_DATE
TO_VARCHAR2 TO_NUMBER
CHARTOROWD ROWDTOCHAR
HEXTORAW RAWTOHEX
TO_BNARY_NTEGER
EntidadesP Relaciona5entos e Atri/0tos
Quanto mais organizadas estiverem as informaes no Banco de dados, mais forte ser a "Conversa com o
Gerenciador de Banco de Dados. Para sso criou-se um modelo chamado de Modelo de Entidade e
Relacionamentos, do qual fazem parte trs elementos:
Entidades! Uma entidade um objeto de interesse do qual podem ser colecionadas informaes. Ex: Tabelas
de clientes, Tabela de pedidos de clientes.
Relaciona5entos! As entidades podem ser relacionadas entre si pelos relacionamentos.
Ex: Entidade de Clientes e Entidade de Pedidos ("clientes fazem pedidos).
Atri/0tos! So as caractersticas das entidades. So representadas pelas colunas das tabelas. Ex: nome,
endereo, telefone e etc.
Co5ponentes de 05a Ta/ela
O armazenamento e a manuteno de dados valiosos a razo para a existncia de qualquer banco de dados.
Lembre-se de que uma tabela a forma mais simples de armazenamento de dados em um banco de dados
relacional.
A seguir os componentes de uma tabela:
Ca5po! uma coluna em uma tabela que projetada para manter informaes especficas sobre cada registro
na tabela. Ex:
D_CLENTE NOME ENDEREO TELEFONE
Re8istro o0 Lin7a de dados! cada entrada individual que existe em uma tabela. Ex:
D_CLENTE NOME ENDEREO TELEFONE
20003 Joo da Silva R. Conde Palmeira 3333-3235
20004 Marcos Pereira R. Paula Frontes 2522-8589
Col0na! uma entidade vertical em uma tabela que contm todas as informaes associadas com um campo
especfico em uma tabela. Ex:
D_CLENTE
20003
20004
20005
DigiData Informtica 27 ! 94
Apostila de Oracle

Criando Ta/elas
Aps anlise que define a estrutura de dados para um projeto de banco de dados, inicia-se um processo de
criao de tabelas desta base, sendo que em nossa ferramenta, poderemos fazer a partir da interface grfica
facilitadora, ou executando instrues em cdigo no Editor SQL da mesma ferramenta.
%i80ra LC
DigiData Informtica 28 ! 94
Apostila de Oracle

O diagrama abaixo (Figura 13) exibe as tabelas de nosso projeto, bem como o nome de cada campo e o
relacionamento entre as mesmas.
%i80ra LD
O script a seguir, refere-se ao cdigo DDL (Data Definition Language) para cada tabela do projeto. Observe a
primeira tabela (CLENTES) onde aplicado a maioria dos tipos possveis considerando anlise prvia. Observe
ainda a definio de atributos como DEFAULT e NOT NULL.
Deve ser ressaltado, o fato de termos criado uma tabela para armazenar a foto (tipo imagem) do cliente, j que
no so permitidos dois campos do tipo BLOB em uma mesma tabela. O campo HSTORCO, na tabela
CLENTE o outro campo desta natureza.
QQQQQQQQQQQQQQQQQInRcio do Script QQQQQQQQQQQQQQQQQQQQQ
CREATE TABLE CLENTES (
D_CLENTE NUMBER (10, 0) NOT NULL,
NOME VARCHAR2 (100) NOT NULL,
CNPJ CHAR (18) NOT NULL,
TPO CHAR (1) DEFAULT 'J' NOT NULL,
STATUS NUMBER (1, 0) DEFAULT 1 NOT NULL,
DATA DATE NOT NULL,
HSTORCO CLOB,
CREDTO NUMBER (12, 2),
CDADED NUMBER (10, 0)
)
DigiData Informtica 29 ! 94
Apostila de Oracle

CREATE TABLE CLENTESFOTO (
D_CLENTE NUMBER (10, 0) NOT NULL,
FOTO LONG RAW
)
CREATE TABLE CDADES (
CDADED NUMBER (10,0) NOT NULL,
CDADENOME VARCHAR2 (25) NOT NULL,
ESTADO VARCHAR2 (2) NOT NULL
)
CREATE TABLE PRODUTOS (
D_PRODUTO NUMBER (10, 0) NOT NULL,
DESCRCAO VARCHAR2 (50) NOT NULL,
PRECOCOMPRA NUMBER (13, 2),
SALDO NUMBER (10, 0)
)
CREATE TABLE TENS (
D_PEDDO NUMBER (10, 0) NOT NULL,
D_PRODUTO NUMBER (10, 0) NOT NULL,
QUANTDADE NUMBER (10, 0) NOT NULL,
PRECOVENDA NUMBER (13, 2) NOT NULL
)
CREATE TABLE PEDDOS (
D_PEDDO NUMBER (10, 0) NOT NULL,
D_CLENTE NUMBER (10, 0) NOT NULL,
DATAPED DATE NOT NULL
)
QQQQQQQQQQQQQQQQQQQQQQQQQ %inal do Script QQQQQQQQQQ
Utilizaremos a tabela CLENTE para demonstrar como prtico e intuitivo o uso da wizard para Criar Tabela de
nosso utilitrio. sto ser feito em uma sequncia lgica, que ajudar compreender cada etapa necessria para:
definir os tipos de campos (colunas), definir chave-primria e chave-estrangeira e ainda algumas restries
impostas as colunas.
Para as outras tabelas presentes em nosso script, simplesmente executaremos as instrues DDL direto no
Editor SQL.
DigiData Informtica 30 ! 94
Apostila de Oracle

Etapa Col0nas
Basta observar o script para tabela CLENTE, e com o uso do mouse ir selecionando as opes conforme
ilustrado na Figura 14.
%i80ra LE
Constraints;Restri+,es<
SPri5arN =eNT
A chave primaria [primary key] de uma tabela uma coluna ou seqncia de colunas que identificam unicamente
uma linha dentro da tabela, ou seja, seu valor no pode ser repetido para outras linhas. Ao definir uma chave
primria, automaticamente criado um ndice na tabela. S pode haver uma chave primria na tabela.
Uma chave primria pode ser acrescentada tabela depois que ela foi criada com o comando ALTER TABLE.
Por exemplo, vamos criar chaves primrias s tabelas clientes e produtos:
ALTER TABLE clientes add constraint PK_cliente primary key (id_cliente)
C7aveMPri5Aria
Da mesma forma que a etapa anterior, observe a imagem da Figura 15, assinalando as opes para definir a
chave-primria da tabela CLENTE. Tornando o campo D_CLENTE chave-primria da tabela, estaremos
definindo uma restrio (constraint) que impedir a entrada de valores duplicados nesta coluna, criando uma
exceo em tempo de execuo caso algum aplicativo ou utilitrio tente proceder desta forma.
Ser criado um ndice com este campo, que dever tornar o campo D_CLENTE preferencial em pesquisa,
quando possvel, devido a performance superior obtida.
DigiData Informtica 31 ! 94
Apostila de Oracle

%i80ra LF
Visando criar em definitivo a tabela e todas as implementaes aplicadas mesma, basta clicar no boto
Finalizar. Tambm copie e execute os scripts das tabelas restantes no Editor SQL. Ao final do processo, todas
as tabelas estaro disponveis conforme demonstra a Figura 16.
%i80ra LH
DigiData Informtica 32 ! 94
Apostila de Oracle

)ais C7aveMPri5Aria
As tabelas Clientes_Foto, Pedidos, tens e Produtos ainda no contm chave-primria, entre outras coisas,
necessrias a implantao de restrio tipo chave-estrangeira a ser criada logo adiante.
Lembramos que para tabela Clientes, criada a partir do wizard, neste momento foi definida para o campo
D_Cliente.
%i80ra LI
Conforme imagem observada na Figura 17, clique na opo de menu Criar para obter a janela de ajuda da
Figura 18. Atingindo esta etapa defina as opes da caixa de dialogo representada pela Figura 19 e em seguida
clique no boto Prximo at chegar janela representada pela Figura 19.
Pronto, basta clicar no boto Finalizar e a chave-primria ser criada com sucesso.
Para as outras chaves ainda pendentes, ou seja, tabelas Pedidos, tens e produtos, utilizem as instrues do
script abaixo, executando-o na Editor SQL de nosso utilitrio:
Alter ta/le TENS add constraint
PK_TENS primary key (D_PEDDO, D_PRODUTO)
Alter ta/le PEDDOS add constraint
PK_PEDDOS primary key (D_PEDDO)
Alter ta/le PRODUTOS add constraint
PK_PRODUTOS primary key (D_PRODUTO)
Alguns pontos devem ser observados neste momento. O primeiro e evidente, que numa sequncia lgica,
primeiro criamos as chaves primrias do modelo, e s aps, empregamos a criao das chaves estrangeiras,
que iro consolidar o modelo relacional. Alis, os servidores de banco de dados como o Oracle, so comumente
denominados Banco de dados relacionais por esta forte caracterstica.
DigiData Informtica 33 ! 94
Apostila de Oracle

%i80ra LJ
%i80ra LK
DigiData Informtica 34 ! 94
Apostila de Oracle

C7aveMEstran8eira S%OREI"N =EUT
Chave-estrangeira define os relacionamentos entre tabelas de nosso modelo, implicando em duas restries: a
primeira refere-se a tabela em questo, impedindo que valores sejam assinalados na coluna que compem a
chave-estrangeira caso no existam antes na coluna de referncia na tabela de referncia. E a outra restrio,
diz respeito a tabela de referncia, onde os registros que tenham sido referenciados em uma tabela com chave-
estrangeira apontando para esta tabela, no podero ser excludos. A isso se da o nome de ntegridade
referencial. Particularmente neste caso em curso, criao da tabela CLENTE, no ter chave-estrangeira, pois
no existe coluna da mesma que referencie (dependa) de coluna em outra tabela. Mas, na sequncia aps
criarmos todas as tabelas, voltaremos a esta anlise visando concluir os relacionamentos mapeados no MER
(Modelo de Entidade Relacional).

De-inindo C7aveMEstran8eira
Quando criamos as tabelas, definimos conceitualmente chave-estrangeira, mas no aplicamos na prtica. Assim
sendo, observe a figura 20 para poder se orientar na edio da tabelas para cumprir esta tarefa. O diagrama
exibido na Figura 13 ser nossa base para criao de chave-estrangeira em todas as tabelas do modelo.
Todos os passos necessrios para utilizar o Wizard de criao de chave-estrangeira, esto dispostas entre as
Figuras 20 e figura 22 inclusive.
A tabela abaixo define nome e referncias para as chave-estrangeiras, seguida do script com cdigo para
execuo no Editor SQL caso seja a opo desejada.
No5e Ta/ela Col0naTa/ela de Re-& Col0na de Re-&
FK_ClientesFoto_Clientes ClientesFoto D_Cliente Clientes D_Cliente
FK_Pedidos_Clientes Pedidos D_Cliente Clientes D_Cliente
FK_tens_Pedidos tens D_Pedido Pedidos D_Pedido
FK_tens_Produtos tens D_Produto Produtos D_Produto
ALTER TABLE PEDDOS ADD CONSTRANT FK_PEDDOS_CLENTES
FOREGN KEY (D_CLENTE) REFERENCES CLENTES (D_CLENTE)
ALTER TABLE CLENTESFOTO ADD CONSTRANT
FK_CLENTESFOTO_CLENTES FOREGN KEY (D_CLENTE) REFERENCES
CLENTES (D_CLENTE)
ALTER TABLE TENS ADD CONSTRANT FK_TENS_PEDDOS
FOREGN KEY (D_PEDDO) REFERENCES PEDDOS (D_PEDDO)
ALTER TABLE TENS ADD CONSTRANT FK_TENS_PRODUTOS
FOREGN KEY (D_PRODUTO) REFERENCES PRODUTOS (D_PRODUTO)
DigiData Informtica 35 ! 94
Apostila de Oracle

%i80ra CB
%i80ra CL
DigiData Informtica 36 ! 94
Apostila de Oracle

%i80ra CC
C7ec>
Nesta ltima etapa, podemos definir regras de restrio para as colunas da tabela. Uma outra abordagem para implantao
de regras, principalmente regras de negcio, ser apresentado quando estivermos estudando os objetos Triggers.
Observando a Figura 23, vemos uma rea de entrada de cdigo, onde podemos criar regras de restrio para as colunas da
tabela em curso. Alista abaixo, expe as regras que iremos aplicar as colunas da tabela CLENTE, bastando definir a regra e
o nome do objeto, clicando em seguida no boto Adicionar.
Uma dica importante, clicar sob o link Constraints de Verificao Exemplos, na parte de baixo da janela Restries,
visando obter exemplos possveis aplicveis.
%i80ra CD
DigiData Informtica 37 ! 94
Apostila de Oracle

No5e da Restri+.o Re8ra
Alter table clientes add constraint CLENTES_ck_Tipo check (TPO N ('F', 'J'))
Alter table clientes add constraint CLENTES_ck_Cnpj check (LENGTH (CNPJ) >= 18)
Esse comando mostra informaes sobre a tabela, inclusive os nomes de cada restrio. Para excluir, usa-se
ALTER TABLE, com a opo DROP (independente do tipo de restrio).
ALTER TABLE clientes DROP CONSTRANT 'nome_da_restrio'
Visando criar em definitivo a tabela e todas as implementaes aplicadas mesma, basta clicar no boto
Finalizar. Tambm copie e execute os scripts das tabelas restantes no Editor SQL. Ao final do processo, todas
as tabelas estaro disponveis conforme demonstra a Figura 17.
Unicidade S0ni10eT
Uma restrio unique em uma coluna ou grupo colunas determina que seu valor deva ser nico na tabela. Esse
tipo de restrio usado para chaves alternadas, ou seja, valores que se repetem na tabela alm da chave
primria. Pode haver vrias restries UNQUE na tabela e as colunas de uma restrio UNQUE permitem
valores nulos. Repare na sintaxe:
ALTER TABLE clientes ADD constraint uk_cnpj UNQUE (CNPJ)
Vndices
Por10e VndicesW
ndice um mecanismo que acelera bastante o acesso aos dados. Consiste de uma estrutura de dados que
contm ponteiros ordenados para os dados. O Oracle usa [ndexes ou ndices] automaticamente em varias
situaes para acelerar a pesquisa e atualizao de dados. Por exemplo:
Se uma coluna esta na clusula WHERE em um comando SELECT, UPDATE ou DELETE, o
SQL Server verifica as condies mais rapidamente se houver um ndice, caso contrrio ele faz uma
varredura seqencial da tabela [table scan].
Se uma coluna muito usada para ordenar valores (com ORDER BY), essa ordenao mais
eficiente se ela tiver um ndice.
Se uma coluna usada para fazer juno de duas tabelas, essas junes podem ser feitas
mais eficientes se ela estiver indexada.
No entanto, ndices levam tempo para serem criados e ocupam espao em disco. Cada atualizao na tabela
tambm atualiza dinamicamente todos os ndices definidos. Portanto se voc criar muitos ndices inteis numa
tabela, pode estar atrapalhando o desempenho da atualizao de dados sem agilizar muito o tempo de
resposta nas consultas.
Para criar um ndice usamos o comando CREATE NDEX.
DigiData Informtica 38 ! 94
Apostila de Oracle

Al80ns E?e5plos!
CREATE INDEX DX_CLENTES_NOME ON CLENTES(NOME)
CREATE INDEX DX_PRODUTOS_DESCRCAO ON PRODUTOS (DESCRCAO)
CREATE INDEX DX_PEDDOS_DATAPED ON PEDDOS (DATAPED)
Se10ence
Sequence um objeto til para fornecer valores nicos para preenchimento da chave-primria de tabelas.
Para criar Sequence acompanhe na sequncia a imagem da Figura 24, clicando em seguida no boto Prximo e
depois no boto Criar. Abaixo temos o cdigo DDL gerado, bem como um detalhamento de cada propriedade.
%i80ra CE
Parte do C6di8o De-ini+.o
Create sequence SEQ_CLENTES Cria objeto Sequence com o nome SEQ_CLENTES
start with 1 nicia contagem a partir do nmero 1
increment by 1 Quando invocado o mtodo NextVal, incrementa e valor 1
maxvalue 1000000 Nmero mximo de valores retornados
minvalue 1 Valor mnimo da sequncia
cache 5 Quantidade colocada em Cache para otimizar acesso
nocycle Define como no cclica, no retornando a contagem ao incio
noorderDefine sem ordem pr estabelecida (Ascendente. ou Descendente)
DigiData Informtica 39 ! 94
Apostila de Oracle

Aproveite e crie outras seqncias teis ao desenvolvimento de procedimentos no futuro. O script abaixo
relaciona cdigo para outras seqncias sugeridas:
create se10ence SEQ_PEDDOS
start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder
create se10ence SEQ_PRODUTOS
start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder
Lin80a8e5 SQL
Inserindo Dados
O comando NSERT insere linhas em uma tabela. A forma mais simples do comando insert somente uma linha
de dados. Nesse caso, so informados os valores de todas as colunas da tabela, na ordem em que elas foram
definidas na tabela. Mas possvel possvel inserir dados parciais de apenas algumas colunas.

NSERT NTO nome_tabela (colunas) values (valores)
Ta/ela de Cidades
CIDADEID CIDADENO)E ESTADO
1 RO DE JANERO RJ
2 SO PAULO SP
3 VTORA ES
4 BELO HORZONTE MG
Ta/ela de Clientes
IDXCLIENTE NO)E CNPY TIPO STATUS DATA (ISTORICO CREDITO CidadeId
MADERAS
SAMAN
0002002/0001 J 1 2003/06/25 ENTREGA 1.505
1
SEQ_CLENTES
CAR
VECULOS
10025600/001 J 1 2005/04/12 1.112
1
SEQ_CLENTES CARLOS
PEDRERA
052116852-
85
F 1 2004/04/12 500.00
2
SEQ_CLENTES
FERNADA
FERRAZ
011452369-
85
F 1 2002/02/11 250.00
1
SEQ_CLENTES DANEL
SLVA
014548987-
20
F 1 2001/03/16 150.00
SEQ_CLENTES FRAN
ADESVOS
2005006/1000 J 0 2000/04/05 ENTREGA 50.00
SEQ_CLENTES SAPATOS E
CA.
10060085/100 J 1 2003/05/05 CLENTE 900.50
SEQ_CLENTES CALADOS
VARTA
2002550/0001 J 0 2001/07/12 874.60
2
SEQ_CLENTES
SALE
ADVOGADOS
00010003/555 J 1 2004/06/04 20.00
3
SEQ_CLENTES
PAULA
MEDEROS
003254896-
84
F 0 2002/06/01 10.00
4
DigiData Informtica 40 ! 94
Apostila de Oracle

Ta/ela de Pedidos
IDXPEDIDO IDXCLIENTE DATAPED
SEQ_PEDDOS 1 10/05/2007
SEQ_PEDDOS 2 10/05/2007
SEQ_PEDDOS 1 25/05/2007
SEQ_PEDDOS 3 01/06/2007
SEQ_PEDDOS 4 04/06/2007
SEQ_PEDDOS 4 27/06/2007
SEQ_PEDDOS 5 10/07/2007
SEQ_PEDDOS 2 13/07/2007
SEQ_PEDDOS 4 15/07/2007
Ta/ela de Prod0tos
IDXPRODUTO DESCRI#$O PRECOXCPO)PRA SALDO
SEQ_PRODUTOS CANETA 0.19 20
SEQ_PRODUTOS LAPS 0.10 112
SEQ_PRODUTOS BORRACHA 0.05 42
SEQ_PRODUTOS PAPEL LSO 5.60 23
SEQ_PRODUTOS PAPEL A4 5.80 22
SEQ_PRODUTOS COLA 1.19 3
SEQ_PRODUTOS GRAMPO 1.52 52
SEQ_PRODUTOS COPO PLASTCO 1.06 14
SEQ_PRODUTOS CADERNO 2.26 16
SEQ_PRODUTOS FCHAS 2.42 120
Ta/ela de Itens
IDXPEDIDO IDXPRODUTO QUANTIDADE PRECOXENDA
01 1 2 2,75
01 2 16 1,50
02 2 10 1,50
03 3 11 0,25
03 4 8 8,95
03 1 45 2,75
04 2 14 1,50
04 4 9 8,95
04 1 10 2,75
05 3 18 0,25
DigiData Informtica 41 ! 94
Apostila de Oracle

At0aliZando Dados
Os dados em uma tabela podem ser modificados utilizando o comando UPDATE. O comando update no
adiciona novos registros a uma tabela, e nem remove os registros, simplesmente atualiza os dados existentes. A
forma mais simples da instruo update a sua utilizao para atualizar uma nica coluna em uma tabela. Tanto
uma nica linha de dados como numerosos registros podem ser atualizados ao atualizar uma nica coluna em
uma tabela.
UPDATE CLENTES SET TPO = 'J'
WHERE D_CLENTE= 1
E?cl0indo Dados
O comando delete utilizado para remover linhas inteiras de dados de uma tabela. O comando delete no
utilizado para remover valores de colunas especificas, um registro completo, incluindo todas as colunas
removido. A instruo delete deve ser usada com cautela, ela funciona muito bem. Para excluir um nico registro
ou registro selecionados de uma tabela, a instruo delete deve ser utilizada com a seguinte sintaxe:
DELETE FROM CLENTES
WHERE D_CLENTE = 5
A Sinta?e SELECT
O comando SELECT recupera dados de uma ou mais tabelas, a instruo utilizada para construir consultas no
banco de dados. A clusula FROM a clusula obrigatria e sempre deve ser utilizada em conjuno com a
instruo SELECT.
H quatro clusulas, que so partes valiosas de uma instruo SELECT, A sintaxe mais simples para recuperar
dados dentro de um banco de dados:
SELECT listas_de_colunas
FROM listas_de_tabelas
WHERE condies
A lista_de_colunas especifica quais colunas sero retornadas como resultado, separadas por vrgula ou um
asterisco (*) que indica todas as colunas da tabela.
A clusula FROM, com uma lista_de_tabelas, especifica quais tabelas sero consultadas.
A clusula WHERE especifica condies que devem ser satisfeitas pelas linhas das tabelas.
Co5andos Select
SELECT, o camando que representa a Data Query Language (DQL) em que SQL, a instruo utilizada para
construir consultas no banco de dados. A clusula FROM a clusula obrigatria e sempre deve ser utilizada em
conjuno com a instruo SELECT.
H quatro clusulas, que so partes valiosas de uma instruo SELECT:
SELECT
FROM
WHERE
ORDER BY
DigiData Informtica 42 ! 94
Apostila de Oracle

Exemplo 01:
SELECT * FROM CLENTES
Exemplo 02:
SELECT D_CLENTE, NOME, CNPJ, STATUS, TPO, DATA
FROM CLENTES
Agora adicione uma condio mesma consulta.
SELECT D_CLENTE, NOME, CNPJ, STATUS, TPO, DATA
FROM CLENTES
WHERE D_CLENTE = 2
Operadores Arit5@ticos Per5itidos
(+) adio
(-) subtrao
(*) multiplicao
(/) diviso
D0as %or5as PossRveis de Select ;co5 e se5 ALIAS<
SELECT Cl.nome,
Cl.credito,
Pe.DataPed,
Sum(t.Quantidade * t.PrecoVenda) As Total
%RO) Clientes Cl, Pedidos Pe, tens t
:(ERE Cl.id_cliente = Pe.id_cliente AND
Pe.id_pedido = t.id_pedido
"ROUP BU Cl.nome, Cl.credito, Pe.DataPed
ou
SELECT Clientes.nome,
Clientes.credito,
Pedidos.DataPed,
Sum(tens.Quantidade * tens.PrecoVenda) As Total
%RO) Clientes, Pedidos, tens
:(ERE Clientes.id_cliente = Pedidos.id_cliente AND
Pedidos.id_pedido = tens.id_pedido
"ROUP BU Clientes.nome, Clientes.credito, Pedidos.DataPed
DigiData Informtica 43 ! 94
Apostila de Oracle

%0n+,es
COUNT
A funo COUNT utilizada para contar linhas ou valores de uma coluna que no tem valor null. A funo
COUNT quando utilizada com uma consulta retorna valor numrico.
SELECT COUNT(*) FROM CLENTES
SU)
utilizada para retornar um total nos valores de uma coluna para um grupo de linhas.
SELECT SUM(CREDTO) FROM CLENTES
A"
utilizada para localizar mdias para um grupo de linhas.
SELECT AVG (CREDTO) FROM CLENTES
)AX
A funo MAX utilizada para retornar o valor mximo para valores de uma coluna em um grupo de linhas.
SELECT MAX (CREDTO) FROM CLENTES
)IN
A funo MN retorna o valor mnimo de uma coluna para um grupo de linhas.
SELECT MN (CREDTO) FROM CLENTES
Operadores L68icos
So aqueles operadores que utilizam palavras-chave de SQL para fazer comparaes em vez de smbolos. Os
operadores lgicos abordados so:
IS NULL
Utilizado para comparar um valor com um valor null. No exemplo, o campo crdito no tem valor.
SELECT * FROM CLENTES WHERE HSTORCO IS NULL
DigiData Informtica 44 ! 94
Apostila de Oracle

BET:EEN
utilizado para procurar valores que esto dentro de um conjunto de valores, dado o valor mnimo e o valor
mximo. No exemplo, o campo valor deve estar entre 20 e 50.
SELECT * FROM CLENTES WHERE credito BET:EEN '20' AND [2000'
IN
utilizado para comparar um valor com uma lista de valores literais que foi especificada. No exemplo, o campo
crdito deveria ser um dos valores da lista.
SELECT * FROM CLENTES WHERE crdito IN (20, 30, 50)
LI=E
utilizado para comparar um valor com valores semelhantes utilizando operadores curinga.
(%) porcentagem
(_) sublinhado
-Exemplo: Localiza quaisquer valores que comecem com PAB
SELECT * FROM CLENTES WHERE nome LI=E 'PAB%' -
-Exemplo: Localiza quaisquer valores que contenham ABL a partir da segunda casa e terminem com quaisquer
valores.
SELECT * FROM CLENTES WHERE nome LI=E '_ABL%'
EXISTS
utilizado para procurar a presena de uma linha em uma tabela especfica que atenda a certos critrios. Veja
como pesquisar para ver se id_cliente 982 est na tabela clientes.
SELECT * FROM CLENTES
WHERE EXISTS ( Select id_cliente From clientes Where id_cliente = 982)
NOT EXISTS
utilizado para procurar a no ocorrncia de uma linha em uma tabela especfica que atenda a certos critrios.
Veja como pesquisar para ver se existem clientes que no compraram. Logo no ocorrem na tabela de pedidos.
SELECT * FROM CLENTES
WHERE NOT EXISTS ( Select id_cliente From Pedidos)
DigiData Informtica 45 ! 94
Apostila de Oracle

Op+,es Avan+adas da Lin80a8e5 SQL
Neste tpico vamos ver como usar JONs para retornar dados correlacionados de duas ou mais tabelas.
INNER YOINS
Um nner Join conecta duas ou mais tabelas segundo uma condio de juno. O NNER JON retorna os
registros que forem encontrados nas tabelas e respeitarem as condies de busca.Por exemplo:
SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
FROM Clientes NNER JON Cidades
ON Clientes.CidadeD = Cidades.CidadeD;
ClienteNo5e CidadeNo5e Estado
Cliente1 Rio de Janeiro RJ
Cliente2 So Paulo SP
Cliente4 Belo Horizonte MG
OUTER YOINS
Como podemos reparar no NNER JON, somente as linhas que possuem dados nas duas colunas do
relacionamento so retornadas. Caso uma das colunas no possua valor (tenha null), este registro no
participar da juno do SELECT.
sto pode no uma determinada pergunta. Voc pode estar querendo saber, por exemplo, quais os clientes que
voc tem cadastrados, e, se houver a informao, o nome da cidade destes.
LE%T OUTER YOINS
Neste caso, voc precisa de um OUTER JON. Um OUTER JON traz todas as linhas de uma determinada
tabela, tendo ou no relacionamento completo, e as linhas da segunda tabela que satisfizerem o relacionamento.
Vamos construir o exemplo dito antes:
SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
FROM Clientes LEFT OUTER JON Cidades
ON Clientes.CidadeD = Cidades.CidadeD;
ClienteNo5e CidadeNo5e Estado
Cliente1 Rio de Janeiro RJ
Cliente2 So Paulo SP
Cliente3 NULL NULL
Cliente4 So Paulo MG
RI"(T OUTER YOINS
Se quisssemos trazer todas as cidades, e os clientes que existirem nelas, faramos:
SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
FROM Clientes RGHT OUTER JON Cidades
ON Clientes.CidadeD = Cidades.CidadeD;
ClienteNo5e CidadeNo5e Estado
Cliente1 Rio de Janeiro RJ
Cliente2 So Paulo SP
Cliente4 So Paulo MG
NULL Vitria ES
DigiData Informtica 46 ! 94
Apostila de Oracle

Que esteja bem claro que a palavra LEFT ou RGHT refere-se apenas ordem escrita das tabelas, vamos ver
um outro exemplo de trazer todos os clientes e as cidades destes:
SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
FROM Cidades RGHT OUTER JON Clientes
ON Clientes.CidadeD = Cidades.CidadeD;
ClienteNo5e CidadeNo5e Estado
Cliente1 Rio de Janeiro RJ
Cliente2 So Paulo SP
Cliente3 NULL NULL
Cliente4 So Paulo MG
%ULL OUTER YOINS
E podemos, ainda, juntar os dois modos: ou seja, fazer um LEFT e RGHT OUTER JON ao mesmo tempo. sto,
na, verdade, se chama FULL OUTER JON. E o exemplo est a seguir:
SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
FROM Cidades FULL OUTER JON Clientes
ON Clientes.CidadeD = Cidades.CidadeD;
ClienteNome CidadeNome Estado
Cliente1 Rio de Janeiro RJ
Cliente2 So Paulo SP
Cliente4 So Paulo MG
NULL Vitria ES
Cliente3 NULL NULL
O0tros e?e5plos de INNER YOIN
Vamos gerar uma consulta que liste o nome dos clientes, as datas em realizaram pedidos e o valor total destes
pedidos, usando NNER JON.
SELECT Clientes.Nome, Clientes.Credito, Pedidos.DataPed, Sum (tens.Quantidade *
tens.PrecoVenda)as total
FROM Clientes NNER JON Pedidos
ON Clientes.d_Cliente = Pedidos.d_Cliente
NNER JON tens
ON Pedidos.d_Pedido = tens.d_Pedido
GROUP BY Clientes.Nome, Clientes.Credito, Pedidos.DataPed
LIN"UA"E) PL/SQL
CO)PONENTES DA LIN"UA"E)
IDENTI%ICADORES
Consiste de uma letra opcionalmente seguida de nmeros, "$, _ ou "#. As letras podem ser minsculas ou
maisculas.
Ex. Le8ais Ile8ais
money$$$tree teste&teste
ab### cd_depto
novo_teste_ nmfunc
DigiData Informtica 47 ! 94
Apostila de Oracle

PALARAS RESERADAS
Palavras que possuam um significado especial para a SQL.
Ex. BEGN
END
LITERAIS
uma representao explcita de um nmero, caractere, string ou boleano, no representado por um
identificador.
Ex.:
N05@ricos Caracteres Strin8s Boleanos
030 'Z' '10-NOV-91' TRUE
6 '%' 'hello,world' FALSE
-14 '7'
+32767 '.'
12.0 '.'
.5 'z'
'2E5 '('
-9.5E-3
CO)ENTORIOS!
O incio do comentrio marcado por dois hfens em qualquer ponto da linha. O restante da linha considerado
comentrio. Para comentrios que ultrapassem uma linha, pode-se usar a notao /* (inicio) e */(fim).
Ex.:
SELECT vl_sal NTO w_salario obtm o salrio atual
/* calculo da
bonificao */
F w_salario > 50000
ATRIBUTOS ESPECIAIS
As variveis PL/SQL e constantes possuem atributos, que so propriedades que permitem a referncia ao tipo e
estrutura do objeto sem necessidade de repetio de sua definio. As tabelas e colunas do database possuem
atributos similares, que podemos usar para facilitar a manuteno.
%TYPE este atributo copia os atributos de uma varivel, constante ou coluna do database. particularmente
usado quando declaramos variveis que pertenam as colunas do database.
sinta?e: <varivel>/<constante>/<coluna>%TYPE
Ex.:
DECLARE
W_CODGO NUMBER(3);
W_CODGO2 W_CODGO%TYPE; - varivel de tipo idntico a cdigo
W_COD_DEP DEPTO.CD_DEPTO%TYPE;
DigiData Informtica 48 ! 94
Apostila de Oracle

/* varivel de tipo idntico varivel da base de dados cd_depto */
%ROWTYPE este atributo gera um tipo de registro que representa uma linha da tabela. O
registro pode armazenar uma linha de dados selecionados da tabela ou recebidos de um cursor (fetched).
sinta?e! <tabela>/<cursor>%ROWTYPE
Ex.:
DECLARE
W_DEP_ROW DEPTO%ROWTYPE; - varivel do tipo row
W_MAT NUMBER(3);
CURSOR W_C1 Ls - cursor com apenas 2 colunas
SELECT CD_DEPTO,NM_DEPTO
FROM DEPTO; - colunas da tabela
W_C1_ROW WC1%ROWTYPE; - possui as mesmas colunas de
W_C1
BEGN
SELECT * NTO W_DEP_ROW - contm todos os dados lidos FROM
depto - da linha da tabela
WHERE cd_mat = W_MAT;
F W_DEP_ROW.CD_DEPTO = '00' - a referncia a cada campo THEN
- feita com o uso da varivel de
tipo ROWTYPE
CONSTANTES
A declarao de uma constante semelhante declarao de uma varivel, exceto que devemos adicionar a
palavra chave CONSTANT e, imediatamente, associar um valor inicial. Seu valor no poder ser alterado
durante o programa.
sinta?e! <nome da constante> CONSTANTE<tipo> :=/DEFAULT <valor inicial>;
Ex.:
DECLARE
W_TESTE CONSTANT REAL := 3.14159;
W_TESTE1 CONSTANT REAL DEFAULT := 3.14159;
CONERS$O DE TIPO DE ARIOEL
Pode-se converter de um tipo de varivel para outro explicitamente, porm, em muitas situaes a PL/SQL pode
converter o tipo de caractere em outro, implicitamente. sto ocorre quando usamos varivel de um tipo onde era
esperado outro. A PL/SQL utiliza uma das seguintes funes para executar esta converso:
TO_CHAR TO_DATE
TO_VARCHAR2 TO_NUMBER
CHARTOROWD ROWDTOCHAR
HEXTORAW RAWTOHEX
TO_BNARY_NTEGER
DigiData Informtica 49 ! 94
Apostila de Oracle

EXE)PLOS DE DECLARA#*ES
DECLARE
W_DATA DATE; - varivel de tipo data
W_CONTADOR SMALLNT := 0; - varivel iniciada com zero
W_CODGO CHAR(O3)NOT NULL := 'A00' - varivel c/ restrio
W_TESTE CONSTANT REAL := 3.14159; - /* constante de tipo real - o valor
inicial obrigatrio */
W_CODGO2 W_CODGO%TYPE := 'B01' - varivel de tipo idntico a cdigo
W_COD_DEP DEPTO.CD_DEPTO%TYPE - varivel de tipo idntico a varivel da
da base de dados cd_depto
W_DEP_ROW DEPTO%ROWTYPE - varivel tipo row
CURSOR W_C1 S - cursor c/ 2 colunas da tabela
SELECT cd_depto, nm_depto
FROM DEPTO;
W_C1_ROW W_C1%ROWTYPE - possui as mesmas colunas de w_c1
BEGN
SELECT *
NTO W_DEP_ROW
FROM DEPTO
WHERE cd_depto = 'A00';

F W_DEP_ROW.cd_DEPTO = 'A00'
THEN
W_CONTADOR := WHERE_CONTADOR + 1;
END F;
END
ARIOEIS ESPECIAIS
EXCEPTON - nomeia uma exceo definida pelo usurio.
sinta?e! <nome da exceo> EXCEPTON
Ex.:
DECLARE
erro_matrcula EXCEPTON;
CURSOR - declara um cursor.
sinta?e:
CURSOR <nome cursor>[(<parmetro> <tipo>[,<parmetro <tipo>...])]
RETURN<tipo>/<varivel%TYPE/<table.column>%TYPE/<table>%rowtype
S <comando SELECT >;
onde:
4. A clusula RETURN define o tipo de dado do resultado de um cursor.
5. Pode-se usar o atributo %ROWTYPE para representar uma linha em uma tabela
da base.
6. Pode-se usar %TYPE para representar o tipo de uma varivel, constante ou
coluna da base.
7. Um cursor deve estar associado a um comando SELECT com mesmo nmero,
tipo e ordem de elementos selecionados que os da clusula RETURN.
Ex.:
DECLARE
CURSOR w_c1 S SELECT cd_mat, vl_sal FROM func;
CURSOR w_c2 (dat_ini DATE) S
DigiData Informtica 50 ! 94
Apostila de Oracle

SELECT cd_mat, nm_func FROM func
WHERE de_nasc > dat_ini;
ATRIBUTOS PARA CURSOR
Existem 2 tipos de cursores em PL/SQL: implcito e explcito. A PL/SQL implicitamente declara um cursor para
cada comando SQL que manipule dados, inclusive queries que retornem uma nica row.
%FOUND - indica se o ltimo FETCH retornou uma linha ou no, para cursores explcitos. E se alguma row
foi afetada pelo ltimo comando NSERT, UPDATE ou DELETE para cursores implcitos.
sinta?e! <cursor> %FOUND
SQL%FOUND
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1%FOUND
THEN
%NOTFOUND - indica se o ltimo FETCH retornou uma row ou no, para cursores explcitos. E se alguma
row foi afetada pelo ltimo comando NSERT, UPDATE ou DELETE para cursores implcitos.
sinta?e! <cursor>%NOTFOUND
SQL%NOTFOUND
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1%NOTFOUND
THEN
EXT;
...
END LOOP;
%SOPEN - permite que se verifique se um cursor est aberto ou no. No caso de cursores implcitos o
resultado ser sempre FALSE, uma vez que o Oracle fecha o cursor aps uma operao.
sinta?e! <cursor>%SOPEN
SQL%SOPEN
Ex.:
F NOT (w_c1%SOPEN)
THEN
...
DigiData Informtica 51 ! 94
Apostila de Oracle

%ROWCOUNT - indica o nmero de rows lidas para o cursor associado (para cursores explcitos) ou o
nmero de rows afetadas no ltimo comando NSERT, UPDATE, DELETE ou SELECT (para cursores implcitos).
Aps a abertura do cursor, o valor de ROWCOUNT zero. O nmero s ser incrementado SE O LTMO
FETCH retornou uma row.
sinta?e! <cursor>%ROWCOUNT
SQL %ROWCOUNT
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1% ROWCOUNT THEN
...
%UN#*ES PR\MDE%INIDAS
A PL/SQL permite a utilizao de diversas funes pr-definidas para manipulao dos dados. Pode-se us-las
onde expresses do mesmo tipo so permitidas.
CONTROLE DE ERROS
SQLCODE
Funo numrica que retorna o cdigo do erro associado ltima exceo.
Definio: FUNCTON SQLCODE RETURN NUMBER
Ex.: <varivel> := SQLCODE;
SQLERR)
Funo string que retorna a mensagem de erro associado ao ltimo SQLCODE.
Definio: FUNCTON SQLERRM [(error_number NUMBER)] RETURN CHAR
Ex.: <varivel> := SQLERRM(-1023);
NU)\RICAS
ABS
Retorna o valor absoluto do argumento.
Definio: FUNCTON ABS (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := ABS (<varivel2>);
CEIL
Retorna o menor inteiro maior ou igual ao argumento.
DigiData Informtica 52 ! 94
Apostila de Oracle

Definio: FUNCTON CEL(<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := CEL (<varivel2>);
COS
Retorna o coseno do argumento, que deve ser expresso em radianos.
Definio: FUNCTON COS (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := COS (<varivel2>);
Obs.: se <n> estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos.
COS(
Retorna o coseno hiperblico do argumento.
Definio: FUNCTON COSH (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := ABS (<varivel2>);
EXP
Retorna e elevado n-esima potncia, onde e (~2.71828) a base do logaritmo neperiano.
Definio: FUNCTON EXP (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := EXP (<varivel2>);
%LOOR
Retorna o maior inteiro menor ou igual ao argumento.
Definio: FUNCTON FLOOR(<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := FLOOR (<varivel2>);
LN
Retorna o logaritmo natural do argumento, que deve ser maior que zero.

Definio: FUNCTON LN (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := LN (<varivel2>);
LO"
Retorna o logaritmo de <n> na base <m>, sendo que <m> deve ser maior que 1 e <n> deve ser maior que 1 e
<n> deve ser maior que zero.
Definio: FUNCTON LOG (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := LOG (<varivel2>);
)OD
Retorna o resto da diviso de <m> por <n>. Se <n> for zero, <m> retornado.
DigiData Informtica 53 ! 94
Apostila de Oracle

Definio: FUNCTON MOD (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := MOD (<varivel2>), (<varivel3>);
PO:ER
Retorna o nmero <m> elevado <n>-nesima potncia. Se <m> for negativo, <n> deve ser inteiro.
Definio: FUNCTON POWER (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := POWER (<varivel2>);
ROUND
Retorna <m> arredondado para <n> casas decimais. Se <n> for omitido, zero ser assumido.
Definio: FUNCTON ROUND (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := ROUND (<varivel2>), (<varivel3>);
SI"N
Retorna 1 se o argumento for negativo, 0 se igual a zero ou 1 se o argumento for maior que zero.
Definio: FUNCTON SGN (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := SGN (<varivel2>);
SIN
Retorna o seno de <n>, que deve ser expresso em radianos.
Definio: FUNCTON EXP (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := SN (<varivel2>);
Obs.: Se <n> estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos.
SIN(
Retorna o seno hiperblico do argumento.
Definio: FUNCTON SNH (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := SNH (<varivel2>);
SQRT
Retorna a raiz quadrada do argumento, que no pode ser negativo.
Definio: FUNCTON SQRT (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := SQRT (<varivel2>);
TAN
Retorna a tangente de <n>, que deve ser expresso em radianos.
DigiData Informtica 54 ! 94
Apostila de Oracle

Definio: FUNCTON TAN (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := TAN (<varivel2>);
TAN(
Retorna a tangente hiperblica do argumento.
Definio: FUNCTON TANH (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := TANH (<varivel2>);
TRUNC
Retorna o nmero <m> truncado para <n> casas decimais. Se o <n> for omitido, zero ser assumido.
Definio: FUNCTON TRUNC (<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := TRUNC (<varivel2>);
CARACTERES
ASCII
Retorna o cdigo ASC correspondente string informada no argumento.
Definio: FUNCTON ASC (<str> VARCHAR2) RETURN NUMBER
Ex.: <varivel> := ASC (<varivel2>);
C(R
Retorna a string correspondente representao numrica informada como argumento. o contrario da funo
ASC.
Definio: FUNCTON CHR (<n> NUMBER) RETURN CHR
Ex.: <varivel> := CHR (<varivel2>);
CONCAT
Retorna uma string que o resultado da concatenao de <str1> (na frente) com <str2>.
Definio: FUNCTON CONCAT (<str1> VARCHAR2,<str2> VARCHAR2) RETURN VARCHAR2
Ex.: <varivel> := CONCAT (<varivel2>,<varivel3>);
INITCAP
Retorna a primeira letra de cada palavra do argumento em letra maiscula e as demais em minsculas.
Definio: FUNCTON NTCAP (<str> VARCHAR2) RETURN VARCHAR2
Ex.: <varivel> := NTCAP (<varivel2>);
DigiData Informtica 55 ! 94
Apostila de Oracle

INSTR
Retorna a posio da <n>-nesima ocorrncia de <str2> dentro de <str1>, comeando na posio <pos>.
Definio: FUNCTON NSTR (<str1> VARCHAR2,<str2> VARCHAR2) [<pos> NUMBER [,<n> NUMBER ]])
RETURN NUMBER
E./ 0vari1ve23 /4 I5S)" (0vari1ve2,36 0variave2-360pos360n3)7
LEN"T(
Retorna o nmero de caracteres da string <str>. Se o argumento um item definido como CHAR, o comprimento
incluir os brancos. Se <str> for null, o resultado da funo ser NULL.
Definio: FUNCTON LENGTH (<str> VARCHAR2) RETURN NUMBER
Ex.: <varivel> := LENGTH (<varivel2>);
LO:ER
Retorna o argumento com todas as letras minsculas.
Definio: FUNCTON LOWER (<str> VARCHAR2) RETURN VARCHAR2
Ex.: <varivel> := LOWER (<varivel2>);
LPAD
Completa esquerda, com os caracteres <pad> para que o tamanho da string resultado seja <len>.
Definio: FUNCTON LPAD (<str> VARCHAR2,<len> NUMBER [,<pad> VARCHAR2]) RETURN
VARCHAR2
Ex.: <varivel> := LPAD (<varivel2>, <comprimento>,'*');
LTRI)
Retira , da esquerda para direita, os caracteres <set> at que seja encontrado um caracter diferente de <set>.
Definio: FUNCTON LTRM (<str> VARCHAR2 [, <set> VARCHAR2]) RETURN VARCHAR2
Ex.: <varivel> := LTRM (<varivel2>, <varivel3>);
REPLACE
Retorna <str1> com cada ocorrncia de <str2> substituda por <str3>. Se <str3> no for informado, todas as
ocorrncias se <str2> sero removidas. Se nem <str2> nem <str3> forem informadas a funo retornar NULL.
Definio: FUNCTON REPLACE (<str1> VARCHAR2,<str2> VARCHAR2[,<str3> VARCHAR2]) RETURN
VARCHAR2
Ex.: <varivel> := REPLACE (<varivel1>, <varivel2>,<varivel3);
RPAD
Completa, direita, com os caracteres <pad> para que o tamanho da string resultado seja <len>.
Definio: FUNCTON RPAD (<str> VARCHAR2,<len> NUMBER [,<pad> VARCHAR2])
RETURN VARCHAR2
(<n> NUMBER) RETURN NUMBER
Ex.: <varivel> := RPAD (<varivel2>, < tamanho>,'*');
RTRI)
Retira , da direita para esquerda, os caracteres <set> at que seja encontrado um caracter diferente de <set>.
Definio: FUNCTON RTRM (<str> VARCHAR2 [, <set> VARCHAR2]) RETURN VARCHAR2
Ex.: <varivel> := RTRM (<varivel2>, <varivel3>);
DigiData Informtica 56 ! 94
Apostila de Oracle

SOUNDEX
Retorna um string que represente o som de <str>.
Definio: FUNCTON SOUNDEX (<str> VARCHAR2) RETURN VARCHAR2
Ex.: <varivel> := SOUNDEX (<varivel2>);
SUBSTR
Retorna uma parte da string <str>, a partir da posio <pos> por <len> caracteres. Se l<len> for omitido, retorna
o restante da string.
Definio: FUNCTON SUBSTR (<str> VARCHAR2, <pos> NUMBER [,<len> NUMBER])
RETURN VARCHAR2
Ex.: <varivel> := SUBSTR (<varivel2>, <posio inicial>, <tamanho>);
TRANSLATE
Retorna <str>, substituindo cada um dos caracteres presentes em <set1> pelo caracter correspondente em
<set2>. Se <set1> tiver mais caracteres que <set2>, e esses caracteres estiverem presentes em <str>, sero
removidos do resultado.
Definio: FUNCTON TRANSLATE (<str> VARCHAR2, <set1> VARCHAR2,<set3> CHAR) RETURN
VARCHAR2
Ex.: <varivel> := TRANSLATE (<varivel2>, 'ABCDEF', GHJKL');
UPPER
Retorna o argumento com todas as letras maisculas.
Definio: FUNCTON UPPER (<str> VARCHAR2) RETURN VARCHAR2
Ex.: <varivel> := UPPER ('texto');
DATAS
ADDX)ONT(S
Retorna a data <dte> adicionada de <n> meses. <n. deve ser um inteiro e pode ser negativo.
Definio: FUNCTON ADD_MONTHS (<dte> DATE, <n>NUMBER) RETURN DATE
Ex.: <varivel> := ADD_MONTHS (v_dt_nasc,4);
LASTXDAU
Retorna a data do ltimo dia do ms de <dte>.
Definio: FUNCTON LAST_DAY (<dte> DATE) RETURN DATE
Ex.: <varivel> := LAST_DAY (<v_dt_adm>);
)ONT(SXBET:EEN
Retorna o nmero de meses entre <dte1> e <dte2>.
Definio: FUNCTON MONTHS_BETWEEN (<dte1> DATE,<dte2> DATE) RETURN DATE
Ex.: <varivel> := MONTHS_BETWEEN (sysdate, v_dt_nasc) /12;
DigiData Informtica 57 ! 94
Apostila de Oracle

NE:XTI)E
Converte a data e hora que est no meridiano <zon1>, para a data e hora no meridiano <zon2>.
Definio: FUNCTON NEW_TME (<dte> DATE,<zon1> VARCHAR2, <zon2> VARCHAR2)
RETURN DATE
Ex.: <varivel> := NEW_TME (v_dt_nasc, 'AST','GMT');
ABREIATURAS PARA )ERIDIANOS
AST,ADT Atlantic Standard ou Daylight Time
GMT Greenwich
PST, PDT Pacific Standard ou Daylight Time
NEXTXDAU
Retorna a data do primeiro dia da semana nomeado por <day> que seja posterior a <dte>.
Definio: FUNCTON NEXT_DAY (<dte> DATE,<day> VARCHAR2) RETURN DATE
Ex.: <varivel> := NEXT_DAY (sysdate, 'moday');
SUSDATE
Retorna a data e hora correntes.
Definio: FUNCTON SYSDATE RETURN DATE
Ex.: <varivel> := SYSDATE ;
ROUND
Retorna <dte> arredondado para o formato especificado.
Definio: FUNCTON ROUND (<dte> [,<fmt>]) RETURN DATE
Ex.: <varivel> := ROUND (sysdate,'ww');
TRUNC
Retorna uma data no formato especificado por <fmt>, representado <dte> truncada na unidade correspondente.
Definio: FUNCTON TRUNC (<dte> DATE [, <fmt> VARCHAR2 ) RETURN DATE
Ex.: <varivel> := TRUNC (sysdate,'ww');
FORMATOS PARA ROUND E TRUNC
CC Sculo
SYYY, YYYY, YEAR, SYEAR, YYY, YY, Y Ano
Q Quarto de ano
MONTH, MON, MM Ms
WW ncio da semana do ano
WHERE ncio da semana do ms
DDD, DD, J Dia
DAY, DY, D ltimo Sbado
HH, HH12, HH24 Hora
M Minuto
DigiData Informtica 58 ! 94
Apostila de Oracle

CONERS$O
C(ARTORO:ID
Converte a string <str> do tipo CHAR ou VARCHAR2 para ROWD.
Definio: FUNCTON CHARTOROWD (<str> CHAR) RETURN ROWD
Ex.: <varivel> := CHARTOROWD ('00000000E.000

0007');
(EXTORA:
Converte uma string hexadecimal do tipo CHAR ou VARCHAR2 para RAW.
Definio: FUNCTON HEXTORAW (<str> CHAR) RETURN RAW
Ex.: FUNCTON HEXTORAW (<str> VARCHAR2) RETURN RAW
<varivel> := HEXTORAW ('F6');
RA:TO(EX
Converte um valor binrio em uma string hexadecimal do tipo VARCHAR2.
Definio: FUNCTON RAWTOHEX (<bin> RAW) RETURN VARCHAR2
Ex.: <varivel> := RAWTOHEX (<varivel do tipo raw);
RO:IDTOC(AR
Converte o valor binrio de <bin> para uma string hexadecimal de 18 bytes.
Definio: FUNCTON ROWDTOCHAR (<bin> ROWD) RETURN VARCHAR2
Ex.: <varivel> := ROWDTOCHAR (<varivel do tipo rowid);
TOXC(AR
Converte um valor numrico ou data para o formato especificado.
Definio: FUNCTON TO_CHAR (<dte> DATE [,<fmt> VARCHAR2 [,<nls1>]])
RETURN VARCHAR2
FUNCTON TO_CHAR (<n> NUMBER) [,<fmt> VARCHAR2[,<NLS2>]])
RETURN VARCHAR2
Ex.: <varivel> := TO_CHAR(5678.32, '9.999.99', 'nls_numeric_characters =', '.');
FORMATOS NUMRCOS PARA TO CHAR E TO NUMBER
9 9999 A quantidade de 9's determina o comprimento
0 0999 Completa com zeros esquerda em vez de brancos
$ $999 Prefixa o valor com o smbolo $
B B999 Substitui o valor 0 por branco
M 999M Mostra "-" aps um valor negativo
S S999 Coloca um "-" ou um "+ antes do nmero.
PR 999PR Mostra um valor negativo entre <>
D 99D99 nclui o caracter decimal
G 99G99 nclui o caracter separador de milhar
, 99,99 Mostra uma ", na posio correspondente.
. 99.99 Mostra um ". decimal na posio correspondente.
V 999V99 Multiplica o valor por 10<n>, onde <n> corresponde ao nmero de
9's aps V
E 9.99EEEE Notao cientfica
RN,rn RN Maiscula ou minscula para numerais romanos
DigiData Informtica 59 ! 94
Apostila de Oracle

%OR)ATOS DE NLS
'NLS_DATE_LANGUAGE = <language>' ________________para <nls1>
'NLS_NUMERC_CHARACTERS = ' '<d> <g>',
NLS_CURRENCY = "<text>
NLS_SSO_CURRENCY = "<text> ____________ para <nls2>
Onde:
<d> caracter decimal
<g> separador de milhar
<text> smbolo monetrio
TO_DATE
Converte uma string ou um nmero para o formato data.
Definio: FUNCTON TO_DATE (<str> VARCHAR2[,<fmt> VARCHAR2 [,<nls1>]])
RETURN DATE
Ex.: <varivel> := TO_DATE ('12/01/84', 'dd/mm/yy')
%OR)ATOS DE DATA PARA TOXC(AR E TOXDATE
CC, SCC Sculo
SYYY, YYYY, YEAR, SYEAR, YYY, YY, Y Ano
Q Quarto de ano
MONTH Ms por extenso
MON Ms abreviado para trs letras
MM Ms (numrico)
WW Semana do ano
WHERE Semana do ms
WHERE ncio da semana do ms
DDD Dia do ano
DD Dia do ms
D Dia da semana
DAY Nome do dia
DY Dia abreviado p/ 3 letras
J Dia em data Juliana
HH, HH12, HH24 Hora
M Minuto
SS Segundo
TO_NUMBER
Converte <str> para o valor numrico correspondente.
Definio: FUNCTON TO_NUMBER (<str> VARCHAR2 [, <nls2> ]])
RETURN NUMBER
Ex.: <varivel> := TO_NUMBER ('5.678,32', '9.999,99', 'nls_numeric_characters = ' , '.');
DigiData Informtica 60 ! 94
Apostila de Oracle

CO)ANDOS
F THEN ELSE
A seqncia de comandos s ser executada se a condio for verdadeira.
sinta?e:
F <condio>
THEN
<seqncia de comandos>
END F;
ou
F <condio>
THEN
<seqncia de comandos>
ELSE
<seqncia de comandos>
END F;
ou
F <condio>
THEN
<seqncia de comandos>
ELSF <condio>
THEN
<seqncia de comandos>
ELSE
<seqncia de comandos
END F;
<condio>
[NOT] <expresso boleana> [[AND OR ] <expresso boleana>]
<expresso boleana>]
<literal boleano>
<varivel boleana>
<chamada de funo boleana>
(<expresso boleana>)
<expresso PLSQL> <operador relacional> <expresso PLSQL>
<expresso PLSQL> S [NOT] NULL
<expresso PLSQL> [NOT] LKE <pattern>
<expresso PLSQL> [NOT] BETWEEN
<expresso PLSQL> AND <expresso PLSQL>
<expresso PLSQL> [NOT] N (<expresso PLSQL>[,
<expresso PLSQL>])
<expresso PLSQL> { <nome cursor> SQL}
{%NOTFOUND %FOUND %SOPEN}
DigiData Informtica 61 ! 94
Apostila de Oracle

Ex.:
F val_sal < 300.00
THEN
Val_ir := 0;
ELSF val_sal BETWEEN 300.01 AND 1000.00+
THEN
val_ir := val_sal * .10;
ELSEF val_sal BETWEEN 1000.01 and 3000.00
THEN
val_ir := val_sal * .20;
ELSE
val_ir := val_sal * .30;
END F;
EXIT
Encerra um loop.
sinta?e: EXT [ <label>] [WHEN <condio>]
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1%FOUND
THEN
calc_ir....
....
NSERT
ELSE
EXT;
ENDF
END LOOP;
:(ILE LOOP
A seqncia de comandos executada enquanto a condio for verdadeira. Antes de cada iterao do loop, a
condio avaliada. Se for verdadeira, a seqncia de comandos executada.
sinta?e:
[<< <label> >>]
WHLE <condio> LOOP
<seqncia de comandos>
END LOOP;
Ex.:
OPEN w_c1;
FETCH w_c1 NTO w_c1_row;
WHLE w_c1%FOUND LOOP
...
NSERT NTO folha
END LOOP;
CLOSE w_c1;
DigiData Informtica 62 ! 94
Apostila de Oracle

LOOP
A seqncia de comandos executada num nmero infinito de vezes ou at que seja encontrado um comando
"EXT ou a condio de "WHEN seja satisfeita.
sinta?e:
[<< <label> >>]
LOOP
<sequencia de comandos>
END LOOP
ou
LOOP
<sequencia de comandos>
F ....
THEN
EXT; -- encerra o loop
END F;
END LOOP;
ou
LOOP
<sequencia de comandos>
EXT WHEN -- encerra o loop
END LOOP;
Ex.:
OPEN w_c1;
LOOP
FETCH WHERE_C1 NTO w_c1_row;
EXT WHEN w_c1%NOTFOUND;
calc_ir(w_c1_row.vl_sal,w_vl_lim);
...
END LOOP;
CLOSE w_c1;
%OR LOOP
A seqncia de comandos executada um nmero fixo de vezes estabelecido no comando. No incio do
comando a quantidade de vezes que o mesmo ser executado j conhecida, uma vez que no se pode alterar
o valor de <contador> durante a iterao.
sinta?e:
[<< <label> >>]
FOR <contador> N [REVERSE] <inferior>..<superior> LOOP
<seqncia da comandos>
END LOOP;
Ex.:
FOR i N 1..3 LOOP <seqncia de comandos>
<seqncias de comandos>
executa 3 vezes
END LOOP; o comando veZes invlido, pois i s
Vezes := i +1 existe no escopo do comando FOR
DigiData Informtica 63 ! 94
Apostila de Oracle

FOR i N incio..fim LOOP <seqncia de comandos>
<seqncia de comandos> <executada n vezes dependendo
END LOOP; do valor de incio e fim
Fim := 1;
FOR i N 3..fim LOOP <seqncia de comandos>
<seqncia de comandos> no ser executada
END LOOP;
FOR N REVERSE 1..3 LOOP <seqncia de comandos>
<seqncia de comandos> ser executado 3 vezes
END LOOP; i ter o valor inicial de 3
<<incio>> a varivel usada em um loop
FOR i N 1..25 LOOP automaticamente declarada pela PL/SQL
FOR i N 1..10 LOOP no exemplo foram criadas
F incio.i > 15 duas variveis i
THEN... a referncia ao nvel
END LOOP; externo feita atravs
END LOOP NCO; do label
<<incio>> esta forma de interrupo
FOR i N 1..25 LOOP do loop (exit <label> when..)
FOR i N 1..10 LOOP encerra os dois nveis
... de loops
EXT incio WHEN.
END LOOP;
END LOOP incio;
"OTO
Desvia incondicionalmente para um "label, o qual deve ser dentro do scopo e deve preceder um comando ou um
bloco da PL/SQL.
sinta?e: GOTO << <label> >>
Ex.:
BEGN
.
GOTO inclui; desvio para o comando NSERT
.
<<inclui>>
NSERT NTO func.
END;
BEGN
.
<<altera>>
BEGN
UPDATE func o desvio pode ser para traz
.
END;
GOTO altera;
.
<<fim>> este label porque END
END; no um comando executvel
DigiData Informtica 64 ! 94
Apostila de Oracle

NULL
Este comando explicitamente indica que no h ao a ser feita. Serve para compor certas situaes em que um
comando exigido, mas nenhuma ao realmente necessria.
sinta?e: NULL;
Ex.:
BEGN
.
<<fim>> o comando "null resolve
NULL; o problema anterior
END;
Instr0+,es Select 5ais Co5ple?as M ie]s
Uma viso (View) uma forma alternativa de olhar os dados contidos em uma ou mais tabelas. Para definir uma
viso, usa-se um comando SELECT que faz uma consulta sobre as tabelas. A viso aparece depois como se
fosse uma tabela.
Vises tm as seguintes vantagens:
Uma viso pode restringir quais as colunas da tabela podem ser acessadas (para leitura ou
modificao), o que til no caso de controle de acesso,
Uma consulta SELECT que usado muito frequentemente pode ser criada como viso. Com
isso, a cada vez que ela necessria, basta selecionar dados da viso,
Vises podem conter valores calculados ou valores de resumo, o que simplifica a operao,
Uma viso pode usada para exportar dados para outras aplicaes.
Objetos desta natureza so teis em algumas circunstncias: criar vises padronizadas e otimizadas de tabelas,
ocultar informaes (campos e registros) limitando visualizao de parte de tabelas e at combinao delas.
Criando ie]
Os exerccios abaixo exemplificam algumas Views relacionadas a tabelas de nosso modelo. Utilize o Editor Sql
para criar estes objetos.
Este exerccio tambm tem como proposta, iniciar o aprendizado sobre a linguagem SQL e tambm alguma
coisa sobre PL/SQL.
Observe a sequncia entre as Figuras 25 e 30, funcionando como um tutorial para uso da Wizard criador de
Views do utilitrio.
sinta?e!
VEW view_name[(column[,....n])]
AS
Select_statement
[WTH CHECK OPTON]
Ex:
VEW func_sal AS
SELECT cd_mat, vl_sal, FROM func WHERE vl_sal >= 1000.00;
DigiData Informtica 65 ! 94
Apostila de Oracle

Create ie] ie]XClientes(istorico As
Select Clientes.Nome, Clientes.historico
%ro5 Clientes Where Clientes.Status = 1
Create ie] ie]XItensdescricao As
Select Produtos.Descricao,tens.Quantidade, tens.Precovenda
%ro5 Produtos Inner Yoin tens
On tens.d_Produto = Produtos.d_Produto
Create ie] ie]XPedidosdata As
Select Clientes.Nome, Pedidos.Dataped, Pedidos.d_Pedido
%ro5 Clientes Inner Yoin Pedidos
On Clientes.d_Cliente = Pedidos. d_Cliente
:7ere Pedidos.Dataped >= Sysdate 150
Create ie] ie]Xendas)es As
Select To_Char(Pedidos.DataPed, 'Month') As Mes,
Sum (tens.Quantidade * tens.PrecoVenda) As Total
%ro5 Pedidos nner Join tens
On Pedidos.d_Pedido = tens.d_pedido
"ro0p BN To_Char(Pedidos.DataPed, 'Month')
%i80ra CF
DigiData Informtica 66 ! 94
Apostila de Oracle

%i80ra CH
I5portante! Esta janela acessada com um clique no link Query Builder na janela da figura anterior. Serve para
construir de forma grfica a instruo Sql que seleciona com critrio ou no dados, funcionando como a lgica da
View.
%i80ra CI
DigiData Informtica 67 ! 94
Apostila de Oracle

%i80ra CJ
%i80ra CK
DigiData Informtica 68 ! 94
Apostila de Oracle

%i80ra DB
Stored Proced0re
Um procedimento armazenado [stored procedure] um conjunto de comandos SQL que so compilados e
armazenados no servidor. Ele pode ser chamado a partir de um comando SQL qualquer. A vantagem de usar
procedimentos armazenados que eles podem encapsular rotinas de uso freqente no prprio servidor, e
estaro disponveis para todas as aplicaes. Parte da lgica do sistema pode ser armazenada no prprio banco
de dados, em vez de ser codificada vrias vezes em cada aplicao. Eles tambm aumentam o desempenho de
vrias operaes, pois so executados no servidor e pr-compilados, ao contrrio de comandos SQL que devem
ser interpretados no momento da execuo.
O Oracle disponibiliza a linguagem PL/SQL com uma vasta coleo de instrues, funes e tipos, voltados a
implementao de lgica no lado servidor de um aplicativo. No melhor do modelo Client-Server de
desenvolvimento de aplicativos, teremos nesta etapa do treinamento, uma exposio de rotinas na forma de
procedures que iro suprir tarefas como: manipular registros de tabelas, processar dados para posterior
utilizao e manipular cursores de dados.
sinta?e: PROCEDURE <nome da procedure> [(<parmetro>[,<parmetro>,.])] S
BEGN
<comandos>
[EXCEPTON
<tratamento das excees>]
END <nome da procedure>];
onde: par25etro possui a seguinte sintaxe:
<nome da varivel> [N | OUT |N OUT] <tipo> [{:= | DEFAULT} <valor>]
Quando [N | OUT .] no for especificado, ser assumido N.
DigiData Informtica 69 ! 94
Apostila de Oracle

Ex:
PROCEDURE calc_ir (val_sal N NUMBER, val_ir OUT NUMBER) S
BEGN
F val_sal < 300.00
THEN
val_ir := 0;
ELSF val_sal BETWENN 300.01 AND 1000.00
THEN
val_ir := val_sal * .10;
ELSF val_sal BETWEEN 1000.01 AND 3000.00
THEN
val_ir := val_sal *.20;
ELSE
val_ir := val_sal *.30;
END calc_ir;
CREATE PROCEDURE PROCNCCLENTE (
Parnome Clientes.Nome%Type,
Pardata Clientes.Data%Type,
Parstatus Clientes.Status%Type,
Parcredito Clientes.Credito%Type,
Parhistorico Clientes.Historico%Type,
Partipo Clientes.Tipo%Type,
Parcnpj Clientes.Cnpj%Type
) s
BE"IN
nsert nto Clientes Values (
Seq_Clientes.Nextval,
Parnome,
Parcnpj,
Partipo,
Parstatus,
Pardata,
Parhistorico,
Parcredito
);
END^
Co5entArios!
-Todas as definies que ficam entre parnteses aps a declarao do nome da procedure referem-se aos
parmetros de entrada do procedimento, e devem ser preenchidos quando invocado o procedimento por uma
aplicao cliente.
-A forma Tabela.Campo%Type, facilita a atribuio (definio) de tipo para o parmetro. Naturalmente, se um
parmetro vai ser utilizado para entrada de valor em uma coluna de tabela, naturalmente seu tipo deve ser igual
a referida coluna da tabela. Ento a instruo Clientes.Nome%Type define o tipo do parmetro Parnome como
Varchar(2) j que o campo Nome da tabela Clientes assim o .
-A instruo aqui nesta etapa, no est protegida por nenhum bloco de tratamento de excees, propositalmente
para no haver complexidade excessiva nesta fase do aprendizado. Na sequncia teremos entendimento desta
prtica to necessria.
-nsert nto Values e o que vem em seguida entre parnteses, so referncias aos parmetros de entrada da
Procedure, uma para cada campo da tabela Clientes, e na mesma ordem que estas colunas esto definidas na
estrutura da tabela.
- NextVal uma funo embutida do Oracle, que faz retornar uma valor apartir da Sequence Seq_Clientes.
DigiData Informtica 70 ! 94
Apostila de Oracle

Coloque o cdigo da procedure no Editor Sql, clicando em seguida no boto Executar, objetivando criar nossa
primeira procedure. Proceda o mesmo para criar as outras procedures definidas e comentadas abaixo.
CREATE PROCEDURE PROCALTCLENTE (
Parcodigo Clientes.d_Cliente%Type,
Parnome Clientes.Nome%Type,
Parcnpj Clientes.Cnpj%Type,
Partipo Clientes.Tipo%Type,
Parstatus Clientes.Status%Type,
Pardata Clientes.Data%Type,
Parhistorico Clientes.Historico%Type,
Parcredito Clientes.Credito%Type) s
BE"IN
Update Clientes Set
Clientes.Nome = Parnome,
Clientes.Data = Pardata,
Clientes.Status = Status,
Clientes.Credito = Parcredito,
Clientes.Historico = Parhistorico,
Clientes.Tipo = Partipo,
Clientes.Cnpj = Parcnpj
:7ere Clientes.d_Cliente = Parcodigo;
END^
Co5entArios!
-Basicamente uma repetio do procedure anterior, exceto que existe um parmetro a mais, visando termos uma
chave de pesquisa para a instruo Update.
-Ao contrrio da instruo nsert, no necessrio ter a mesma ordem de colunas da tabela, pois aqui feito
uma atribuio de valor para a coluna, identificando explicitamente qual coluna pelo nome.
Da mesma forma que para o procedimento anterior, copie o cdigo executando-o no Editor Sql de nosso utilitrio
de desenvolvimento do projeto.
CREATE PROCEDURE PROCEXCCLENTE (
Parcodigo Clientes.d_Cliente%Type) S
BEGN
Delete Clientes :7ere d_Cliente = Parcodigo;
END;
Co5entArios!
-instruo bsica DDL para excluso de registros em uma tabela.
-Somente um parmetro necessrio, pois a pesquisa na clsula Where s testa o campo D_Cliente.
Para o prximo exemplo, adotaremos ao Wizard implementado pela nossa ferramenta, visando demostra quanto
temos de ajuda com a mesma. Observe as Figuras 32, 33, 34, 35, 36 e 37 para tomar conhecimento.
CREATE PROCEDURE PROCMANUTPRODUTOS(
ParOpcao VarChar2, Pard_Produto Produtos.d_Produto%Type,
ParDescricao Produtos.Descricao%Type, ParPrecoCompra Produtos.PrecoCompra%Type,
ParSaldo Produtos.Saldo%Type) s
BE"IN
F ParOpcao = '' THEN
DigiData Informtica 71 ! 94
Apostila de Oracle

NSERT NTO Produtos Values(Seq_Produtos.NextVal, ParDescricao, ParSaldo, ParPrecoCompra);
ELSF ParOpcao = 'D' THEN
DELETE PRODUTOS WHERE d_Produto = Pard_Produto;
ELSE
UPDATE PRODUTOS SET Produtos.Descricao = ParDescricao, Produtos.Saldo = ParSaldo,
Produtos.PrecoCompra = ParPrecoCompra WHERE Produtos.d_Produto = Pard_Produto;
END F;
END^
Co5entArios! A nica novidade aqui a instruo F, exemplificada com sua variao ELSEF finalizada com a
condio ELSE. END F encerra um bloco condicional F.
A Figura 31 representa o incio do processo de uso do Wizard construtor de Procedures e a Figura 32 onde
definimos o nome da Procedure.
%i80ra DL
DigiData Informtica 72 ! 94
Apostila de Oracle

%i80ra DC
A imagem representada pela Figura 33 permite definirmos todos os parmetros da Procedure.
%i80ra DD
Aps passagem pela passo anterior, sempre clicando no boto Prximo temos a rea onde devemos entrar com
o corpo da Procedure. Aqui necessrio conhecer a linguagem PL/SQL a fim de criar a lgica necessria ao
procedimento. Observe a Figura 34 para tanto.
DigiData Informtica 73 ! 94
Apostila de Oracle

%i80ra DE
Seguindo em frente, quando clicarmos no boto Prximo da tela anterior, seremos apresentado a ltima interface
de criao, onde devemos naturalmente clicar no boto Finalizar. Pronto as Figuras 35 e 36 resumem esta
ltima etapa. Repare na tela da Figura 36, as opes de funcionalidades para manuteno do procedimento
recm criado.
%i80ra DF
DigiData Informtica 74 ! 94
Apostila de Oracle

%i80ra DH
Criando Proced0re co5 C0rsor
No oracle temos uma funcionalidade especial, que permite criarmos instrues Sql, basicamente instruo Select
da linguagem SQL (DML), armazenando em memria esta coleo de registros selecionados com finalidade de
navegar entre esses registros para uso mais diversificado possvel.
Em nosso e.emp2o6 a2can8aremos com a instru89o Se2ect a2guns registros da tabe2a Pedidos combinados com a tab2e Itens a
*im de arma:enar estes registros em uma outra tabe2a para posterior an12ise
OPEN CURSOR
Executa o query associado com uma declarao explcito de cursor.
sintaxe: OPEN <cursor> [(<parmetro> [, <parmetro> ...])]
Ex.:
DECLARE
CURSOR w_c2 (matrcula NUMBER) S
SELECT nm_func, cd_mat
FROM func
WHERE cd_mat <= matrcula;
BEGN
OPEN w_c2 (350);
....
END;
DigiData Informtica 75 ! 94
Apostila de Oracle

CURSOR LOOP
mplicitamente declara uma rea para receber a row, abre um cursor, l cada row e fecha o cursor quando todas
as rows tiverem sido processadas.
sintaxe: [<< <label> >>]
FOR <RECORD> N <cursor> [(<parmetro> [,<parmetro> ...])] LOOP
<seqncia de comandos>
END LOOP;
Ex.:
DECLARE
CURSOR w_c2 S SELECT cd_mat, vl_sal, vl_sal * .10 fgts FROM func;
BEGN
DELETE FROM folha;
COMMT;
FOR w_c2_row N w_c2 LOOP
calc_ir(w_c2_row.vl_sal, w_vl_ir);
w_vl_inss := calc_inss(w_c2_row.vl_sal, w_vl_lim);
NSERT NTO folha(cd_mat, vl_sal, vl_ir, vl_inss, vl_fgts)
VALUES (w_c2_row.cd_mat, w_c2_row.vl_sal, w_vl_ir,
w_vl_inss, w_c2_row.fgts);
END LOOP;
COMMT;
END;
ATRIBUTOS PARA CURSOR
Existem 2 tipos de cursores em PL/SQL: implcito e explcito. A PL/SQL implicitamente declara um cursor para
cada comando SQL que manipule dados, inclusive queries que retornem uma nica row.
%FOUND - indica se o ltimo FETCH retornou uma linha ou no, para cursores explcitos. E se alguma row foi
afetada pelo ltimo comando NSERT, UPDATE ou DELETE para cursores implcitos.
sintaxe: <cursor> %FOUND
SQL%FOUND
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1%FOUND
THEN
%NOTFOUND - indica se o ltimo FETCH retornou uma row ou no, para cursores explcitos. E se alguma row
foi afetada pelo ltimo comando NSERT, UPDATE ou DELETE para cursores implcitos.
sintaxe: <cursor>%NOTFOUND
SQL%NOTFOUND
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1%NOTFOUND THEN
EXT;
END LOOP;
DigiData Informtica 76 ! 94
Apostila de Oracle

%SOPEN - permite que se verifique se um cursor est aberto ou no. No caso de cursores implcitos o resultado
ser sempre FALSE, uma vez que o Oracle fecha o cursor aps uma operao.
sintaxe: <cursor>%SOPEN
SQL%SOPEN
Ex.:
F NOT (w_c1%SOPEN)
THEN
...
%ROWCOUNT - indica o nmero de rows lidas para o cursor associado (para cursores explcitos) ou o nmero
de rows afetadas no ltimo comando NSERT, UPDATE, DELETE ou SELECT (para cursores implcitos). Aps a
abertura do cursor, o valor de ROWCOUNT zero. O nmero s ser incrementado SE O LTMO FETCH
retornou uma row.
sintaxe: <cursor>%ROWCOUNT
SQL %ROWCOUNT
Ex.:
LOOP
FETCH w_c1 NTO w_c1_row;
F w_c1% ROWCOUNT THEN
Para concluirmos com sucesso a criao de nossa procedure, devemos antes criar a tabela que receber os
dados alcanados conforme cdigo abaixo:
CREATE ta/le VENDASCL (
NOMECLENTE VARCHAR2(100),
TOTALCOMPRAS NUMBER(18,2)
)
O cdigo completo da procedure proposta a ser executado no Editor Sql, est na sequncia, bem com os
comentrios para cada instruo que ainda no foi aqui apresentada.
CREATE PROCEDURE ProcVendasCli (
Pardata Pedidos.Dataped%Type,
Parvalor tens.PrecoVenda%Type) As
C0rsor CursorVendasCli Is
Select Clientes.Nome, Sum(tens.Quantidade * tens.PrecoVenda) As Total
%ro5 Clientes Inner Yoin Pedidos
On Clientes.d_Cliente = Pedidos.d_Cliente
Inner Yoin tens
On Pedidos.d_Pedido = tens. d_Pedido
:7ere Pedidos.Dataped >= Pardata
"ro0p BN Clientes.Nome
(avin8 Sum(tens.Quantidade * tens.PrecoVenda) >= Parvalor
Order BN Clientes.Nome;
VarNome Clientes.Nome%Type;
VarTotal tens.PrecoVenda%Type;
BEGN
Delete VendasCli;
Open CursorVendasCli;
%etc7 CursorVendasCli Into VarNome,VarTotal;
f CursorVendasCli %NotFound Then
RaiseXApplicationXError(-20000, 'No h vendas neste perodo.');
DigiData Informtica 77 ! 94
Apostila de Oracle

End f;
Insert Into endascli al0es ;arno5eP artotal<^
Loop
%etc7 CursorVendasCli Into VarNome,VarTotal;
E?it :7en C0rsorvendascli_Not-o0nd;
Insert Into Vendascli al0es (Varnome, Vartotal);
End Loop^
Close Cursorvendascli;
End;
Co5entArios!
-Cursor CursorVendasCli s: Define um objeto Cursor.
-A instruo que vai de Select a Order By, compe o cdigo que retorna o total de compras de clientes em um
perodo (Pedidos.Dataped >= Pardata).
-VarNome Clientes.Nome%Type e VarTotal tens.PrecoVenda%Type, respectivamente definem duas variveis.
-Delete VendasCli: Exclui possveis registros nesta tabela.
-Open CursorVendasCli: Abre o cursor, carregando os registros alcanados por sua instruo Select.
-f Sql%NotFound Then: Verifica se existe registros no cursor. A instruo Select teria retornado registros.
-Raise_Application_Error(-20000, 'No h vendas neste perodo.'): Levanta uma exceo, fazendo interromper o
processo, caso a condio do F seja verdadeira.
-Loop: nicia o processo de leitura (giro) incondicional.
-Fetch CursorVendasCli nto VarNome,VarTotal: Faz leitura do registro atual do Cursor, atribuindo valores das
colunas deste Cursor as variveis locais previamente definidas. Tambm posiciona o Cursor no prximo registro.
-Exit When Cursorvendascli%Notfound: Aborta o Loop caso no exista mais registros no Cursor.
-nsert nto Vendascli Values (Varnome, Vartotal): nstruo (DML) que insere registro na tabela VendasCli.
-End Loop: Encerra um bloco Loop.
-Close Cursorvendascli: Fecha o Cursor liberando recursos.
Objetivando ampliar o conhecimento da linguagem PL/SQL, teremos na sequncia algumas rotinas que fazem
uso dos principais recursos desta linguagem.
Usando o co5ando I%&&& T(EN e LOOP&&& END LOPP
Em uma procedure atualize o preo do produto com o valor do parmetro passado como argumento, para todos
os produtos com saldo superior a zero.
+ Create or Replace Proced0re CORRGEPRECOPRODUTO (Percentual N NUMBER) is
2. VarSaldo Number;
3. Vard_Produto Number;
4. Cursor ListaProdutos is Select id_produto, saldo From Produtos Where Saldo > 0;
F& Be8in
6. Open ListaProdutos;
7. LOOP
8. Fetch ListaProdutos nto Vard_Produto, VarSaldo;
DigiData Informtica 78 ! 94
Apostila de Oracle

9. Exit When ListaProdutos%NotFound;
10. if VarSaldo > 0 then Update Produtos Set PrecoCompra =PrecoCompra * (1 + (Percentual /
100))
Where id_produto = Vard_Produto;
11. end if;
12. END LOOP;
13. Close ListaProdutos;
LE& End^
Co5entArios!
Lin7a Co5entArio
02 e 03 Define variveis internas da procedure com o tipo Number
04 Declara cursor com o nome ListaProdutos ,e a instruo Select para o cursor
06 Abre o cursor, executando a instruo select
07 nica bloco Loop (executa incondicionalmente)
08 Obtem 1 linha do cursor, atribuindo valores das colunas para as variveis locais
09 Caso no exista mais registros no cursor, abandona o Loop
10 Comando que avalia condio. No caso, uma varivel
12 e 13 Executa a instruo Update para atualizar
16 Fim do bloco Loop
Usando o co5ando CASE&&& END para atri/0i+.o de valores&
O exerccio consiste em varrer os registros da tabela Clientes, identificando quais registros atendam ao critrio
que traz somente aqueles cujo campo Credito seja maior que 1000. Na sequncia, identifica a qual estado
pertence o cliente, aplicando por critrio decidido pelo comando CASE, um valor de acrscimo a uma varivel do
tipo numrica naturalmente. Por fim ajusta o valor do campo Credito baseado no valor da varivel em questo.
+ Create or Replace Proced0re ATUALZACREDTOCLENTE is
2. Vard_Cliente Number;
3. VarEstado Varchar(2);
4. Varpercentual Number;
5. Cursor ListaClientes is Select Clientes.id_cliente, Cidades.estado
a. From Clientes nner Join Cidades
b. On Cidades.Cidaded = Clientes.Cidaded
c. Where Clientes.credito >= 1000;
H& Be8in
7. Open ListaClientes;
8. LOOP
9. Fetch ListaClientes nto Vard_Cliente, VarEstado;
10. Exit When ListaClientes%NotFound;
11. Varpercentual:=
12. Case VarEstado
13. When 'RJ' Then 1.15
14. When 'SP' Then 1.18
15. When 'MG' Then 1.16
16. Else 1.10
17. end;
18. Update Clientes Set Credito = Credito * Varpercentual where Clientes.id_cliente = Vard_Cliente;
19. END LOOP;
20. Close ListaClientes;
CL& End^
DigiData Informtica 79 ! 94
Apostila de Oracle

Co5entArios!
Lin7a Co5entArio
12 Atribuio a varivel que receber o valor retornado pelo comando CASE
13 nicia o seletor do CASE
14 Condio para verificar o valor do seletor do CASE
15 dem
16 dem
17 Condio valida quando nenhuma condio explcita for verdadeira
O/s! No comentado linhas j abordadas em outras rotinas.
TRATA)ENTO DE ERROS
Em PL/SQL uma warning ou error condition chamada uma e?ception. Existem algumas excees j definidas
pelo Oracle com minemnicos para referncia. Para as demais, podem ser dados nome pelo usurio, como
veremos neste captulo.
Quando um erro ocorre, uma e?ception setada, isto , a seqncia de execuo do programa interrompida e
o controle transferido para a rea de tratamento de execuo do programa.
As excees pr-definidas pelo Oracle so setadas quando a condio de erro ocorre. As excees criadas pelo
programa devero ser setadas explicitamente pelo verbo RASE.
EXCE#*ES PR\MDE%INIDAS
No5e da E?ce+.o Oracle Error SQLCODE Condi+.o de Erro
CURSOR_ALREADY_OPEN ORA-06511 -6511 setada se for executado um OPEN
para um cursor j aberto.
DUP_VAL_ON_NDEX ORA-00001 -1 setada se for tentada uma incluso
de uma coluna com valor duplicado
em uma tabela que possui um ndice
unique nesta coluna.
NVALD_CURSOR ORA-01001 -1001 setada se for feita uma operao
ilegal com um cursor. Por exemplo:
CLOSE em um cursor no aberto.
NVALD_NUMBER ORA-01722 -1722 setada se algum comando SQL
tentou uma converso de uma string
para nmero e esta converso falha
porque a string no representa um
nmero.
LOGN_DENED ORA-01017 -1017 setada se for feita uma tentativa de
logon com um username/password
invlido.
NO_DATA_FOUND ORA-01403 +100 setada se num SELECT NTO
nenhuma row foi retornada ou se foi
feita uma referncia a uma row no
inicializada em uma tabela PL/SQL.
NOT_LOGGED_ON ORA-01012 -1012 setada se uma programa PL/SQL
tenata fazer acesso ao database sem
efetuar um logon.
PROGRAM_ERROR ORA-06501 -6501 setada se ocorrer um problema
interno.
STORANGE_ERROR ORA-06500 -6500 setada se PL/SQL sai da memria
ou se a memria estiver corrompida.
TME_ON_RESOURSE ORA-00051 -51 setada se ocorrer timeout enquanto
o ORACLE estiver aguardando por um
recurso.
DigiData Informtica 80 ! 94
Apostila de Oracle

TOO_MARY_ROWS ORA-014222 -1422 setada se um comando SELECT
NTO retormar mais que uma row.
TRANSACTON_BACKED_O
UT
ORA-00061 -61 setada quando a parte remota de
uma transao desmanchada. A
transao local deve ser
desmanchada tambm.
VALUE_ERROR ORA-06502 -6502 setada se uma operao aritmtica,
converso, constraint error, truncation
ocorrer.
ZERO_DVDE ORA-01476 -1476 setada se houver ocorrido uma
diviso por zero.
Ex.:
DECLARE
.
BEGN
SELECT .
SELECT .
SELECT .
EXCEPTON
WHEN NO_DATA_FOUND THEN
.
END;
EXCE#*ES DE%INIDAS PELOS USUORIOS
A PL/SQL permite que sejam definidas excees de um programa. Este tipo de exceo deve ser setada
explicitamente pelo verbo RASE.
RAISE
Seta uma exceo.
sinta?e: RASE <exceo>
Ex.:
DECLARE
erro_soma EXCEPTON;
.
BEGN
F .
THEN
RASE erro_soma;
END F;
EXCEPTON
WHEN erro_soma THEN
.
WHEN OTHERS THEN
.
END;
Obs.: O desvio de execuo do programa transferido para a exceo OTHERS quando o erro ocorrido no foi
tratado em outras excees mais especficas. uma opo para diminuio da lista de e?ceptions.
DigiData Informtica 81 ! 94
Apostila de Oracle

PRA")A EXCEPTIONXINIT
Associa um nome de exceo com um nmero de SQLCODE. sto permite que se faam testes se erro mais
especficos em vez de usar OTHERS.
sinta?e: PRAGMA EXCEPTON_NT (<nome da exceo>,<nmero>)
Ex.:
DECLARE
sem_privilegio EXCEPTON;
PRAGMA EXCEPTON_NT (sem_privilegio, -1031);
O ORACLE retorna o erro -1031 se, por exemplo, for feita uma tentativa de alterar uma tabela em que o
usurio s tem autorizao de SELECT.
BEGN
.
EXCEPTON
WHEN sem_privilegio THEN
.
END;
RAISEXAPPLICATIONXERROR
uma procedure que permite ao usurio enviar mensagens de um subprograma ou database trigger.
sinta?e: RASE_APPLCATON_ERROR (<nmero>,<mensagem>);
Ex.:
CREATE TRGGER checa_salario
.
DECLARE
.
BEGN
.
F (:new.vl_sal <salario_minimo OR :new.vl_sal > salrio_maximo)
THEN
RASE_APPLCATON_ERROR (-20225, 'Salrio fora de faixa');
.
END F;
END;
Obs.: <nmero> deve variar de -20000 a -20999 e a <mensagem> deve possuir at 512 bytes de comprimento.
DigiData Informtica 82 ! 94
Apostila de Oracle

PROPA"A#$O DA EXCE#$O
Quando uma exceo setada, se PL/SQL no encontrar um tratamento para ela no bloco correto ou
subprograma, a exceo se propaga. sto , a exceo se reproduz no bloco externo e assim por diante at que
a PL/SQL retorne um erro para o ambiente (abortando o programa).
Ex.:
BEGN
.
BEGN
F x = 1 THEN RASE A;
ELSF x = 2 THEN RASE B;
ELSE RASE C;
END F;
.
EXCEPTON
WHEN A THEN
.
END;
.A'
EXCEPTON
WHEN B THEN
.
END;
A exceo A tratada no bloco mais interno. Aps seu tratamento o programa continua no comando A.
A exceo B se propaga para o bloco mais externo, tratada e o programa termina normalmente.
A exceo CO)ANDO SQL! se propaga para o bloco mais externo, no e tratada e o erro passa para o
ambiente, isto , o programa abortado.
SQLERR)
String procedure para traduzir um SQLCODE.
sinta?e: SQLERRM (<sqlcode>)
Ex.:
DECLARE
msg CHAR(100)
BEGN
FOR num N 1..9999 LOOP
msg := SQLERRM (num * -1);
NSERT NTO tab_erro VALUES (msg);
END LOOP;
END;
DigiData Informtica 83 ! 94
Apostila de Oracle

DM Este exemplo implementa uma Procedure para incluir registros nas tabelas Produtos e DataProdutos,
simultaneamente, controlando o fluxo de cdigo para observar se houve erro. Havendo erro na operao,
levantada uma exceo identificada que tratada pelo bloco E?ception.
mportante ressaltar, que no existe at o momento, a tabela DataProdutos, assim, utilize o script abaixo para
criar a mesma.
CREATE Ta/le DATAPRODUTOS (
D_PRODUTO NUMBER (18,0) NOT NULL,
DATA DATE NOT NULL,
Constraint DATAPRODUTOS_PK primary key (D_PRODUTO)
)
+ Create or Replace PROCEDURE ncluiProdutos
2. (Descricao N Varchar2, PrecoCompra Number, Saldo N NUMBER) is
3. VardProduto Number;
; BE"IN
5. Select SEQ_Produtos.NextVal nto VardProduto From Dual;
6. nsert nto Produtos(id_produto, descricao, precocompra, saldo)
7. Values(VardProduto, Descricao, PrecoCompra, Saldo);
8. nsert nto DataProdutos(id_produto, data)
9. Values(VardProduto, SysDate);
10. Commit;
LL& EXCEPTION
+, :(EN DUP_VAL_ON_NDEX THEN
13. Raise_Application_Error(-20000, 'Valor de Chave duplicado');
+; :(EN OTHERS THEN
15. Raise_Application_Error(-20000, 'ERRO NOVO:' || ' N.:' || TO_CHAR(SQLCODE) || '
MENSAGEM: ' || SQLERRM);
LH& End^
Co5entArios!
Lin7a Co5entArio
05 Atribui valor (da sequncia) para varivel
11 Verifica se a ltima instruo retornou erro, tentando o valor da varivel SQLCODE
12 Levanta um exceo internamente identificada como VarErro_DataProdutos
17 dem linha 11
18 dem linha 12
20 Aplica um Commit explcito, efetivando as inseres nas duas tabelas
22 ncio do bloco de tratamento de excees
23 Condio que tenta identificar se houve o erro VarErro_Produtos
24 Levanta uma exceo para aplicativo cliente, com nmero padro e mensagem especfica.
25 dem linha 23
26 dem linha 24
27 Condio outra de erro no identificada
28 dem linha 24
DigiData Informtica 84 ! 94
Apostila de Oracle

%0nction
Semelhante a Procedure, mas com a capacidade de retornar um valor, Functions so uma tima opo para
processamento junto a base de dados que devam retornar valores.
Normalmente fazemos muita incurso na base de dados, muita vezes varrendo literalmente dezena de milhares
de registros, em vrias tabelas, a fim de processar tais registros e retornar um valor resultante. sto traria um
impacto siguinificativo sobre a performance de uma aplicativo que viesse acessar o Oracle para obter e
processar esta informao, sem falar no atrito de rede que isto provocaria, uma vez que dezena de milhares de
registros ou mais, trafegariam pela rede. Dependendo da instruo isto pode provocar o caos.
A soluo, conforme exemplo abaixo, seria criar uma Function que internamente ao banco de dados obteria os
registros e depois processaria tais retornando a aplicao solicitante. Mesmo que isto tenha alguma demanda
que provoque alguma espera pela aplicao cliente, ainda assim melhor de ter este tempo e o atrito de rede de
quebra.
Ento vamos ao cdigo da funao que dever ser executado no Editor Sql de nosso utilitrio.
sinta?e: FUNCTON <nome da funo> [(<parmetro>[,<parmetro>,.])]
RETURN <tipo da funo> S
[<variveis locais>]
BEGN
<comando>
[EXCEPTON
<tratamento das excees>]
END <nome da funo>];
onde: par25etros possui a seguinte sintaxe:
<nome da varivel> [N | OUT | N OUT] <tipo> [{:=| DEFAULT} <valor>]
Quando [N | OUT .] no for especificado, ser assumido N.
CREATE %UNCTION Func_Totcompracli
(Parcodcli n Clientes.d_Cliente%Type,
Pardata1 n Pedidos.Dataped%Type,
Pardata2 n Pedidos.Dataped%Type)
Return Number
As
Vartotal Number (13,2);
BE"IN
Select Sum(tens.Quantidade * tens.Precovenda) nto Vartotal
From Pedidos nner Join tens
On Pedidos.d_Pedido = tens.d_Pedido
Where Pedidos.d_Cliente = Parcodcli And
Pedidos.Dataped Between Pardata1 And Pardata2;
Return Vartotal;
END^
Co5entArios!
-Trs parmetros de entrada.
-Return Number: Define o tipo de retorno da Function.
- Vartotal Number (13,2): Define uma varivel local para receber o valor alcanado pela instruo Select.
-De Select a Where, a instruo Sql que alcanar o valor a ser retornado pela Function.
-Return Vartotal: Efetivamente retorna o valor para a aplicao solicitante.
DigiData Informtica 85 ! 94
Apostila de Oracle

Ta/elas te5porArias
Como padro, as tabelas so criadas como permanentes, ou seja, existem at que sejam especificamente
excludas ou modificadas. Por meio do comando CREATE TEMPORARY TABLE, o Oracle permite a criao de
uma tabela que existe apenas durante o processamento de uma transao ou sesso.
Comandos SQL do tipo DML, que modificam os dados em uma tabela temporria, no geram entradas para os
arquivos de redo log, mas geram para os redo logs de rollback. Uma tabela temporria pode ter ndices criados
para ela com o comando NDEX. Esses ndices, assim como as vises e os triggers, tambm so excludos
quando ela o tambm no final da sesso ou transao.
Tri88ers
Um gatilho [trigger] um tipo de procedimento armazenado, que executado automaticamente quando ocorre
algum tipo de alterao numa tabela. Gatilhos "disparam quando ocorre uma operao NSERT, UPDATE e
DELETE numa tabela.
Geralmente gatilhos so utilizados para reforar restries de integridade que no podem ser tratadas pelos
recursos mais simples, como regras, restries, a opo NOT NULL etc.
Um gatilho tambm pode ser usado para calcular e armazenar valores automaticamente em outra tabela.
Deste forma, pode-se usar um DATABASE TRGGER para:
Logar modificaes
garantir crticas complexas
Gerar o valor de colunas
mplementar nveis de segurana mais complexos
Manter tabelas duplicadas
Pode-se associar at 12 TRGGERS a cada tabela, um de cada tipo (BEFORE UPDATE <row>, BEFORE
DELETE <row>, BEFORE NSERT <row>, BEFORE NSERT <comando>, BEFORE UPDATE <comando>,
BEFORE DELETE <comando> e as mesmas sintaxes para AFTER). Um DATABASE TRGGER composto de 3
partes:
evento
constraint (opcional)
ao
Vamos cria um gatilho, chamado nclusaoCliente, que ser ativado por uma operao NSERT na tabela
dbo.clientes.
CREATE TRI""ER TRG_NCTEM BE%ORE INSERT ON TENS %OR EAC( RO:
DECLARE
Varsaldo produtos.saldo%type;
VarDescricao produtos.descricao%type;
DigiData Informtica 86 ! 94
Apostila de Oracle

BE"IN
Select Produtos.Saldo,Produtos.Descricao nto Varsaldo,Vardescricao
From Produtos Where Produtos.d_Produto = :New.d_Produto;
f Varsaldo >= :New.Quantidade Then
Update Produtos Set Produtos.Saldo = Produtos.Saldo - :New.Quantidade
Where Produtos. d_Produto = :New.d_Produto;
Else
Raise_Application_Error( -20000, 'ni O Saldo Do Produto ' ||
Vardescricao || ' De: ' ||
To_Char(Varsaldo) || ' No
Atendendo O Solicitado. Fim' );
End f;
END^
Co5entArios!
-CREATE TRGGER TRG_NCTEM: Define o nome da Trigger.
-BEFORE NSERT ON TENS: Define o disparo antes da insero de registros na tabela tens.
-FOR EACH ROW; Garante execuo para todas as linhas da tabela.
-DECLARE Varsaldo produtos.saldo%type e VarDescricao produtos.descricao%type: Define variveis local.
-:New.Quantidade : Retorna o valor do campo Quantidade para o registro que disparou a Trigger.
CREATE TRI""ER TRG_ALTTEM BE%ORE UPDATE ON TENS %OR EAC( RO:
DECLARE
Varsaldo produtos.saldo%type;
VarDescricao produtos.descricao%type;
BE"IN
Update Produtos Set Produtos.Saldo = Produtos.Saldo + :Old.Quantidade
Where Produtos.d_Produto = :Old.d_Produto;
Select Produtos.Saldo,Produtos.Descricao nto Varsaldo,Vardescricao
From Produtos Where Produtos. d_Produto = :New.d_Produto;
f Varsaldo >= :New.Quantidade Then
Update Produtos Set
Produtos.Saldo = Produtos.Saldo - :New.Quantidade
Where Produtos. d_Produto = :New.d_Produto;
Else
Raise_Application_Error(-20000, 'ni O Saldo Do Produto ' ||
Vardescricao || ' De: ' ||
To_Char(Varsaldo) ||
' No Atendendo O Solicitado. Fim');
End f;
END^
CREATE TRI""ER TRG_EXCTEM BE%ORE DELETE ON TENS %OR EAC( RO:
BE"IN
Update Produtos Set Produtos.Saldo = Produtos.Saldo + :Old.Quantidade
Where Produtos.d_Produto = :Old.d_Produto;
END^
CREATE TRI""ER TRG_AJUSTAPRECOVENDA BE%ORE INSERT OR UPDATE ON TENS %OR EAC(
RO:
DECLARE Varprecocompra Produtos.PrecoCompra%Type;
DigiData Informtica 87 ! 94
Apostila de Oracle

BE"IN
Select Produtos.PrecoCompra nto Varprecocompra
From Produtos Where Produtos.d_Produto = :New.d_Produto;
f :New.Precovenda < (Varprecocompra * 1.17) Then
:New.PrecoVenda := (Varprecocompra * 1.17);
End f;
END^
PAC=A"ES
Um package um objeto que grupa logicamente subprogramas, objetos e tipos PL/SQL. Packages so
compostos de duas partes: A especificao e o corpo do pacote. A especificao a interface com as
aplicaes. Nela so declarados os tipos, variveis, constantes, excees, cursores e subprogramas. No corpo
do pacote concluda a definio dos cursores e subprogramas e feita a implementao da especificao.
Um package no pode ser chamado, receber parmetro nem ser aninhado (declarado dentro de outro package).
sinta?e: PACKAGE <nome do pacote> S parte da especificao
<declaraes>
END [<nome do pacote>];
PACKAGE BODY <nome do pacote> S corpo do pacote
<corpo dos subprogramas>
[BEGN
<comandos de inicializao>]
END [<nome do pacote>];
A parte de especificao so declaraes pblicas, visveis pelas aplicaes. O corpo implementa detalhes e
declaraes privadas que so invisveis pelas aplicaes. O corpo seria uma cai?a preta.
Um pacote pode ser criado internamente no SQL*PLUS ou no SQL*DBA usando-se os comandos CREATE
PACKAGE e CREATE PACKAGE BODY.
sinta?e: CREATE [OR REPLACE]
PACKAGE <nome do pacote> AS/IS
<declaraes>
END <nome do pacote>
CREATE [OR REPLACE]
PACKAGE BODY <nome do pacote> AS/IS
<corpo dos subprogramas<
[BEGN
<inicializaes>]
END <nome do pacote>
Deve-se observar que somente a especificao do pacote visvel e acessvel pela aplicao. Detalhes da
implementao que se localizam do /odN so invisveis e inacessveis. Desta forma pode-se alterar o /odN sem
haver necessidade de se recompilar os programas que usarem os packages
DigiData Informtica 88 ! 94
Apostila de Oracle

ANTA"ENS DO USO DE PAC=A"ES
Packages oferecem vrias vantagens:
Modularidade Packages permitem que se encapsulem logicamente tipos, objetos e
subprogramas relacionados.
Desenho da aplicao quando uma aplicao desenhada, tudo que necessrio
inicialmente a informao da especificao do package. Pode se
codificar e compilar a especificao sem o corpo do package. Uma vez
que armazenado a referncia ao pacote pode ser compilada tambm.
Segurana Com pacotes pode-se especificar que tipos, objetos e subprogramas
so pblicos ou privados. Os pblicos so especificados na parte de
especificao dos packages. J os privados so totalmente
especificados do body do package. Eles so usados dentro do prprio
pacote e no precisam ficar visveis a quem usar os pacotes.
Funcionalidade Variveis pblicas e cursores empacotados podem ser compartilhados
por todas as procedures que executarem no ambiente.
Performance Quando feita a primeira chamada de um package subprogram pela
primeira vez, todo o pacote carregado na memria. Assim,
subsequentes chamadas a outros subprogramas dentro do pacote no
requerem /O de disco
RE%ER'NCIAS A pac>a8eS
Para fazer uma referncia aos tipos, objetos e subprogramas declaradas dentro da especificao de packages
deve-se usar a seguinte notao:
<nome de package>. <tipo>
<nome de package>. <objeto>
<nome de package>. <subprograma>
Pode-se fazer referncia a pacotes de dentro de database triggers, stored subprograms e blocos PL/SQL dentro
de programas e blocos PL/SQL annimos.
A inicializao da parte executvel do package feita uma nica vez, na primeira vez que for feita referncia ao
package (por sess.o).
Criando 05a Pac>a8e
CREATE OR REPLACE PACKAGE Entidade_Produto
S
PROCEDURE PROCMANUTPRODUTOS(
ParOpcao VarChar2,
Pard_Produto Produtos.d_Produto%Type,
ParDescricao Produtos.Descricao%Type,
ParPrecoCompra Produtos.PrecoCompra%Type,
ParSaldo Produtos.Saldo%Type) ;
%UNCTION Func_Totcompracli (
Parcodcli n Clientes.d_Cliente%Type,
Pardata1 n Pedidos.Dataped%Type,
Pardata2 n Pedidos.Dataped%Type)
return number;
END^
CREATE OR REPLACE PACKAGE BODY Entidade_Produto
S
DigiData Informtica 89 ! 94
Apostila de Oracle

%UNCTION Func_Totcompracli
(Parcodcli n Clientes.d_Cliente%Type,
Pardata1 n Pedidos.Dataped%Type,
Pardata2 n Pedidos.Dataped%Type)
Return Number
As
Vartotal Number (13, 2);
BEGN
Select Sum(tens.Quantidade * tens.Precovenda) nto Vartotal
%ro5 Pedidos Inner Yoin tens
On Pedidos.d_Pedido = tens.d_Pedido
:7ere Pedidos.d_Cliente = Parcodcli And
Pedidos.Dataped Between Pardata1 And Pardata2;
Return Vartotal;
END %0ncXTotco5pracli^
PROCEDURE PROCMANUTPRODUTOS(
ParOpcao VarChar2,
Pard_Produto Produtos.d_Produto%Type,
ParDescricao Produtos.Descricao%Type,
ParPrecoCompra Produtos.PrecoCompra%Type,
ParSaldo Produtos.Saldo%Type) s
BEGN
F ParOpcao = '' THEN
NSERT NTO Produtos Values(Seq_Produtos.NextVal,
ParDescricao, ParSaldo, ParPrecoCompra);

ELSF ParOpcao = 'D' THEN
DELETE PRODUTOS WHERE d_Produto = Pard_Produto;
ELSE
UPDATE PRODUTOS SET
Produtos.Descricao = ParDescricao,
Produtos.Saldo = ParSaldo,
Produtos.PrecoCompra = ParPrecoCompra
WHERE Produtos.d_Produto = Pard_Produto;
END F;
END PROC)ANUTPRODUTOS^

END EntidadeXProd0to^

Executando um procedimento Pblico Empacotado

SQL> execute Entidade_Produto. Func_Totcompracli(1,'01/01/2000','01/01/2001')
DigiData Informtica 90 ! 94
Apostila de Oracle

Sin`ni5os
Consiste em uma prtica simples para garantir segurana no acesso a dados de uma tabela e objetos em geral.
Na prtica, sinnimos so nomes alternativos (apelido) dado a objetos de banco de dados.
Aspectos como: fornecer um nome no tcnico ao objeto de forma abreviada, permitir mudana do nome do
objeto sem que isso afete referncias a este objeto em rotinas, e ainda segurana, so alguns dos motivos para
se criar Sinnimos.
Vejamos alguns exemplos:
Create P0/lic SNnonN5 Clientes
to Aluno.Clientes;
-Cria um sinnimo pblico nomeado SN_Clientes, que representa a tabela Clientes do esquema Aluno.
Naturalmente podemos fazer uso de nosso Editor Sql, ou ainda utilizar o wizard para construir mais facilmente.
Caso queira utilizar a interface grfica para isto, clique na opo Browser de Objetos|Criar|Sinnimo, observe a
Figuras 01.
%i80ra BL
Para encerrar o processo de criao, basta clicar no boto Prximo e em seguida no boto Finalizar.
Agora voc pode fazer o teste com o comando:
-Select * From SN_Clientes, tendo como retorno o mesmo caso faa uso direto da tabela Clientes.
DigiData Informtica 91 ! 94
Apostila de Oracle

E?ercRcios de Revis.o
L< Criar as se80intes ta/elas!
Associados
d_Associado Numeric (10,2) Not Null
Nome Varchar2 (50) Not Null
Cidade Varchar2 (25) Not Null
Estado Varchar2 (2) Not Null
Data Date
Especialidades
d_Especialidade Numeric(10,2) Not Null
Descricao Varchar2(25) Not Null
AssociadosXEspecialidades
d_Associado Numeric(10,2) Not Null
d_Especialidade Numeric(10,2) Not Null
Nota1:
Os itens 1.1 e 1.2 referem-se as tabelas que identificam os agentes do projeto. J o item 1.3, armazena os
relacionamentos possveis entre associados e especialidades.
Nota2:
Quanto a chave primria, para 1.1 e 1.2, somente os campos iniciados com d compem a chave; e para a tabela
do item 1.3, as duas colunas compem a chave primria.
Nota3:
Finalizando a estrutura, observa-se que as duas colunas da tabela Associados _Especiali dades, so
individualmente chave estrangeira, respectivamente com referncia as tabelas dos itens 1.1 e 1.2.
Adicionar 4 registros a tabela associados, 4 registros a tabela especialidades e pelo menos 12 registros na ltima
tabela.
Criar ndices para os campos nome, cidade e estado da tabela associados e ndice para o campo descricao da
tabela especialidades.
Obs.: Usar a seguinte nomenclatura : dx_campo_tabela
DigiData Informtica 92 ! 94
Apostila de Oracle

C< Criar as se80intes ie]s!
View que retorne a quantidade de cadastros por ms:
Select To_Char (Associados.Data, 'Year') || ''||
TO_CHAR (Associados.Data, 'Month') As AnoMes,
Count(Associados.nome) As Total
From Associados
Group by
TO_CHAR (Associados.Data, 'Year') || ''||
TO_CHAR (Associados.Data, 'Month')
View que retorne quantas especialidades tem cada associado, que tenha mais de uma especialidade:
Select Associados.Nome,
Count (Associados_Especialidades.d_Associado) As Qtd
From Associados, Associados_Especialidades
Where Associados.d_Associado = Associados_Especialidades.d_Associado
Group by Associados.Nome
Having Count(Associados_Especialidades.d_Associado) > 1
D< Criar a se80inte Stored Proced0re!
- Criar uma procedure para a incluso de associados, possibilitando alterao
e excluso. Tambm implementar tratamento de erros (excption) e controle
de Transao.
Create or replace proced0re Proc_Manut_Associados(
Pd Associados.d_Associado%type,
Pnome Associados.Nome%type,
Pcidade Associados.Cidade%type,
Pestado Associados.Estado%type,
Pdata Associados.Data%type,
Poperacao Varchar2)
s
Begin
f Poperacao = '' Then
nsert into Associados Values(Seq_Associados.nextval, Pnome, Pcidade, Pestado, Pdata);
Elsf Poperacao = 'A' then
Update Associados Set
Associados.Nome = Pnome, Associados.Cidade = Pcidade,
Associados.Estado = Pestado, Associados.Data = Pdata
Where Associados.d_Associado = Pid;
Else
Delete Associados Where Associados.d_Associado = Pid;
End f;
Commit;
Exception
When nomeerro Then
Raise_application_error(-20000,'mensagem...');
When nomeerro
When Others Then
Raise_application_error(-20000,'mensagem...');
End;
Nota1: Conforme demonstrado no comando nsert, deve ser criado uma seqncia de nome Seq_Associados.
DigiData Informtica 93 ! 94
Apostila de Oracle

E< Criar 05a -0nction
- Que retorna a quantidade de associados que tenham
especialidades por estado. Esta function dever prover um parmetro para escolha do estado.
Create or Replace %0nction Func_QtdeAssociados_Estado (Pestado varchar2)
Return Numeric is
Vqtde number;
Begin
Select Count(Associados.d_Associado) As Qtd
nto Vqtde
From Associados, Associados_Especialidades
Where Associados.d_Associado = Associados_Especialidades. d_Associado
And Associados.estado = Pestado;
Return Vqtde;
End;
F< Criar Tri88er
- Uma triggers que dispare uma exceo, quando da incluso ou alterao na tabela especialidades,
provocar um contedo para o campo descrio com menos de trs caracteres.
Create or replace tri88er Trig_validadescricao Be-ore insert or 0pdate on Especialidades -or eac7 ro]
Begin
f Length(:new.descricao) < 3 then
Raise_application_erro(-20000, 'Minha mensagem..............');
End f;
End;
- Uma Trigger que limite o total de especialistas de uma especialidade(Descricao) em no mximo 4(quatro),
por Estado.
Create or replace tri88er Trig_Controla_Lim_Espec Be-ore insert or 0pdate
on Associados_Especialidades -or eac7 ro]
DeclareVtotal Number; Vestado Varchar;
Begin
Select Associados.Estado nto Vestado From Associados
Where Associados.d_Associado = :New.d_Associado;
Select Count(Associados.Estado) nto VTotal
From Associados, Associados_Especialidades
Where Associados.d_Associado = Associados_Especialidades.d_Associado And
Associados_Especialidades. d_Especialidade = :New.d_Especialidade
And Associados.Estado = VEstado;
f Vtotal > 4 Then
Raise_Application_Error(-20000, 'Minha Mensagem.....);
End f;
End;
DigiData Informtica 94 ! 94