Você está na página 1de 295

Pr o g r a m a o e m PL /SQL

Es t r u t u r a d o Cu r s o
Introduo a PL/ SQL
Conceitos Bsicos de PL/ SQL
Variveis e Dados de Programa
Controle Condicional e Sequencial
Loops
Registros em PL/ SQL
Tabelas PL/ SQL

Es t r u t u r a d o Cu r s o
SQL em PL/ SQL
Funes de SQL integradas
Cursores
Procedimentos e Funes
Packages
Triggers
Tratamento de Erros

Es t r u t u r a d o Cu r s o
Testes e Depurao
PL/ SQL Dinmico
Entrada e Sada em Arquivos
Desempenho e Otimizao

PL /SQL
Procedural Language extensions to SQL.
Usamos esta linguagem no Oracle Server
e em aplicaes-cliente (p.e. Oracle
Forms).
Adiciona construes de programao no
existentes na linguagem de banco de
dados padro.
Permite a combinao de comandos SQL
com construes procedurais.

V e r s e s d o PL /SQL
Cliente
Verso 1.1 Developer/2000
Verso 8.0 Developer 6

Servidor

Verso 2.0 - Oracle 7.0


Verso 2.1 - Oracle 7.1
Verso 2.2 - Oracle 7.2
Verso 2.3 - Oracle 7.3
Verso 8.0 - Oracle 8.0

A r q u i t e t u r a d o PL /SQL
Oracle Forms
Gerador
de SQL

Programa
PL/SQL local
PL/SQL V8.0
Runtime Engine

Oracle Server
Stored Program Unit
Processador
de comandos
SQL

PL/SQL V8.0
Runtime Engine

A m b i e n t e s d e Ex e c u o
Servidor
Oracle 7: PL/ SQL verso 2
Oracle 8: PL/ SQL verso 8
SQL* Plus (modo interativo)

Cliente
Oracle Developer ( Forms, Reports e
Procedure Builder)
utilizam compiladores PL/ SQL prprios

Co n c e i t o s B s i c o s d a
L i n g u a g e m PL /SQL

Ch a r a c t e r Se t d o PL /SQL

Tipo
Letras

Caracteres
A-Z, a-z

Dgitos
Sm bolos

0-9
~!@ #$%&*()_
-+=|[]{}:;
<>
,.?/
Tab, espao, Enter

Espao em Branco

Ch a r a c t e r Se t d o PL /SQL
O PL/ SQL no uma linguagem sensvel
ao contexto.
letras maisculas so tratadas da mesma
maneira que minsculas, a no ser no caso
destas pertencerem a uma cadeia de
caracteres.
If x < > s then
If x < > S then

Sm b o l o s Si m p l e s e Co m p o s t o s
S m b o lo
;

D e s c r i o
te rm in a d o r d e c o m a n d o s

in d ic a d o r d e a trib u to (p .e .
% IS O P E N ); s m b o lo w ild c a r d
s m b o lo w ild c a r d
in d ic a d o r d e v a ri v e l h o s p e d e ira
o p e ra d o r e x p o n e n c ia l
d ife re n te
o p e ra d o r d e c o n c a te n a o
d e lim ita d o r d e r tu lo

_
:
**
< > e !=
||
<< e >>
<= e >=
:=
=>
-/* e * /

m e n o r o u ig u a l e m a io r o u ig u a l
o p e ra d o r d e a trib u i o
o p e ra d o r d e a s s o c ia o p a ra
n o ta o p o s ic io n a l
c o m e n t rio e m u m a n ic a d e lin h a
in c io e fim d e c o m e n t rio

Ch a r a c t e r Se t d o PL /SQL
Caracteres so agrupados, formando
unidades lxicas, que so os menores
componentes individuais da linguagem.
Uma unidade lxica pode formar:
identificadores
literais
delimitadores
comentrios

Ident ific adores


Identificador um nome para um objeto
PL/ SQL.
constante, varivel, exception, procedimento,
funo, package, registro, tabela PL/ SQL, cursor
e palavra reservada.

At 30 caracteres.
Tem que comear com uma letra.
Pode incluir $, _ e # .
No pode conter espaos.

Lit erais
Literal um valor no representado por
um identificador; simplesmente um
valor.
Nmero
415, 21.6 ou NULL

String
Esta uma frase , 01-03-97 ou NULL

Boolean
TRUE, FALSE ou NULL

De l i m i t a d o r e s
Delimitador Ponto e vrgula (;)
Indica o final de um comando
IF salario < min_salario
THEN
salario := salario + salario * .25;
END IF;

Co m e n t r i o s
Comentrio de uma nica linha
IF salario < min_salario(1994) -- retorna min salrio do ano
THEN
salario := salario * .25;
END IF;

Comentrio de mltiplas linhas


PROCEDURE calcula_receita (empresa IN NUMBER) IS
/ * Programa alterado em 23/ 9/ 94
Analista Responsvel: Manoel de Souza * /
...

Es t r u t u r a d e u m B l o c o
A estrutura da linguagem PL/ SQL
orientada a blocos
Modularizao
um bloco a unidade bsica de trabalho da
qual procedimentos e funes so construdos

Escopo
o bloco oferece um escopo ou contexto para
objetos logicamente relacionados

Se e s d e u m B l o c o
Cabealho (Header)
determina o modo como o bloco deve ser chamado

Seo de Declarao
onde declaramos variveis, cursores e sub-blocos e
sees de exceo

Seo de Execuo
parte que contm o cdigo a ser executado

Seo de Excees (Exceptions)


manipula excees ao processamento normal
(condies de aviso e erro).

Se e s d e u m B l o c o
Cabealho
Cabealho
IS
Seo
Seode
deDeclarao
Declarao
BEGIN
Seo
Seode
deExecuo
Execuo
EXCEPTION
Seo
Seode
deExceptions
Exceptions
END;

Se e s d e u m B l o c o
Blocos Annimos
No possuem nome

DECLARE
Seo
Seode
deDeclarao
Declarao
BEGIN
Seo
Seode
deExecuo
Execuo
EXCEPTION
Seo
Seode
deExceptions
Exceptions
END;

Bloc os Aninhados
Um bloco pode conter um ou mais
sub-blocos de cdigo.
As variveis dos blocos
externos podem ser
referenciadas nos
blocos internos, porm
no o contrrio.

PROCEDURE calcula_totais
IS
total_ano NUMBER;
BEGIN
total_ano := 0;
DECLARE
total_ms NUMBER;
BEGIN
total_ms := total_ano / 12;
END;
END;

Variveis e
Da d o s d e Pr o g r a m a

Variveis
Atributos de uma varivel
nome, tipo e valor

Nome
Pode ter at 30 caracteres
Tem que comear com uma letra

Constante
Tipo especial de varivel
Valor constante

T i p o s d e Da d o s
Nmero BINARY_INTEGER
Caractere CHAR
DEC
CHARACTER
DECIMAL
LONG
DOUBLE PRECISION
LONG RAW
FLOAT
RAW
INT
ROWID
INTEGER
STRING
NATURAL
VARCHAR
NUMBER
VARCHAR2
POSITIVE
Boleano
BOOLEAN
REAL
Data-hora DATE
SMALLINT

T i p o s d e Da d o s
Existem no banco de dados: Number, Char,
Long, Long Raw, Raw, Rowid, Varchar2, Date.

Binary_Integer: Utilizado para armazenar


inteiros com sinal. Com intervalo de:
-2147483647 .. 2147483647
Subtipos:
Natural (de 0 .. 2147483647)
Positive (de 1 .. 2147483647)

T i p o s d e Da d o s N u m r i c o s
Utilize NUMBER para armazenar nmeros
(inclusive ponto-flutuante)
Preciso Mxima: 38 dgitos
1.0E-129 at 9.999E125

Declarao de uma varivel numrica:


NUMBER ( preciso, escala )
preciso: nmero total de dgitos
escala: nmero de dgitos a direita ou
esquerda do ponto decimal em que o
arredondamento ocorrer.

T i p o s d e Da d o s N u m r i c o s
Se a escala positiva, ento a escala
determina que o ponto onde o
arredondamento ocorre est a direita do ponto
decimal.
Se a escala negativa, ento a escala
determina que o ponto onde o
arredondamento ocorre est a esquerda do
ponto decimal.
Se a escala zero, ento o arredondamento
ocorre para a parte inteira do nmero.
Se a escala no especificada, ento o
arredondamento no ocorre.

T i p o s d e Da d o s N u m r i c o s - Ex e m p l o s
EXEMPLO:

V ALOR
12345.6784
1234567891.23
1567899
53.35

F ORMATO
NUMBER(10,3)
NUMBER(10,3)
NUMBER(10,-6)
NUMBER(10,-6)

R ESULTADO
12345.678
ERROR
2000000
0

Su b t i p o s N u m r i c o s
Pr -d e f i n i d o s
Subtipo
DEC (prec, esc)
DECIMAL(prec, esc)
DOUBLE
PRECISION
FLOAT
INT
INTEGER
REAL
SMALLINT

Compatibilidade Correspondente no
Oracle
ANSI
NUMBER(prec, esc)
IBM
ANSI

NUMBER(prec, esc)
NUMBER

ANSI, IBM
ANSI
ANSI, IBM
ANSI
ANSI, IBM

NUMBER
NUMBER(38)
NUMBER(38)
NUMBER
NUMBER(38)

Ca r a c t e r e s
CHAR
Subtipos: Character e string.
especifica que a varivel tem um tamanho fixo
pode- se especificar o tamanho mximo (1 at
32767)
se o tamanho no for especificado, o valor padro
1 (um).
espaos em branco so adicionados ao final da
varivel, se esta armazenar uma cadeia de
caracteres de tamanho menor que o mximo.

Ca r a c t e r e s
VARCHAR2 e VARCHAR
armazenam cadeias de caractere de tamanho
varivel.
pode- se especificar o tamanho mximo (1 at
32767)
VARCHAR2 e VARCHAR so sinnimos
(visando a compatibilidade com bancos de
dados ANSI).
Recomendao da Oracle: utilize VARCHAR2

Ca r a c t e r e s
LONG
armazenam cadeias de caractere de tamanho
varivel, de at 32760 caracteres.
recomendao: utilize VARCHAR2.

RAW
armazena dados binrios de at 32767 bytes
o PL/ SQL no tenta interpretar os dados

LONG RAW
armazena dados binrios de at 32760 bytes

Ro w i d
No database Oracle, ROWID uma
pseudocoluna, pertencente a toda tabela.
Internamente gerado, ocupando 6 bytes.
ROWID em PL/ SQL um subtipo do CHAR
com tamanho fixo.
BBBBBBB.RRRR.FFFF
bloco no database file, linha no bloco e
database file

B o o l e a n o (B OOL EA N )
Tipo de dados lgico (no existe
correspondente no servidor Oracle).
Pode assumir os valores TRUE, FALSE ou
NULL.

Da t a -h o r a (DA T E)
Uma varivel do tipo DATE armazena tanto
informaes sobre data quanto sobre hora.
Valor de tamanho fixo, que ocupa 7 bytes.
DATE armazena as seguintes informaes:
sculo, ano, ms, dia, hora, minuto e
segundo
Datas vlidas para uma varivel data esto
entre 1 jan de 4712 AC a 31 dez de 4712 DC.
Podem ser feitas operaes aritmticas sobre
um valor do tipo DATE.

Co n v e r s o e n t r e T i p o s
Sempre que o PL/ SQL efetua uma operao
envolvendo um ou mais valores, ele primeiro
converte os dados para o formato correto
para a operao.
Converso Explcita
usada uma funo de converso pr- definida

Converso Implcita
sempre que necessrio, o PL/ SQL tenta converter
os valores para efetuar a operao

V a l o r e s N u l o s e m PL /SQL
NULL nunca igual a qualquer outra coisa
IF nome = NULL THEN ... -- ERRADO

Quando usados uma funo utilizando um


valor nulo, geralmente recebemos como
resultado um outro valor nulo.
nome := NULL;
IF LENGTH(nome) = 0 THEN -- No funciona

Maneira correta da comparao:


< identificador> IS NULL
< identificador> IS NOT NULL

V a l o r e s N u l o s e m PL /SQL
Resultado de funes com argumento NULL:
Concatenao
Existem duas maneiras de efetuarmos uma
concatenao: funo CONCAT ou operador | |
Nos dois casos, o valor NULL ignorado

Funo NVL
nova_desc := NVL(antiga_desc, No aplicavel );

Funo REPLACE
REPLACE( a.b.c.d.e.f. , . , NULL) = > abcdef

De c l a r a o d e V a r i v e i s
Antes de fazer qualquer referncia a uma
varivel, a mesma deve ser declarada.
Sintaxe
< nome_var> < tipo> [ atribuio de valor padro]

De c l a r a o d e V a r i v e i s
Exemplos
data_admissao DATE;
achou BOOLEAN;
total NUMBER(15,2);
paragrafo VARCHAR2(2000);
prox_aumento CONSTANT DATE := 15-APR- 96 ;
limite NUMBER DEFAULT 3;
nom_empr VARCHAR2(50) NOT NULL DEFAULT
PCS R US

Co n t r o l e Co n d i c i o n a l
e Se q u e n c i a l

Co m a n d o s I F...
Permitem que seja construda uma
lgica condicional nas aplicaes.
IF <condio> THEN
<comandos> - TRUE
END IF;
IF <condio> THEN
<comandos> - TRUE
ELSE
<comandos> - FALSE
END IF;
IF <condio> ...
ELSIF <condio>
ELSE
<comandos>
END IF

Determina se os comandos entre o


THEN e o END IF sero executados,
de acordo com a condio.
Baseado na condio informada, ser
executado o cdigo entre o THEN e o
ELSE (TRUE) ou entre ELSE e o END
IF (FALSE).
seleciona uma ao dentre vrias
condies mutuamente exclusivas,
executando os comandos associados
condio.

Co m b i n a o I F-T H EN
Exemplos
IF :empresa.total > media
THEN
aplicar_desconto(:empresa.empresa_id);
END IF;
IF relatorio_pedido
THEN
imprime_relatorio( relatorio_id);
END IF;

Co m b i n a o I F-T H EN -EL SE
Exemplo
IF :cliente.total_pedido >
THEN
pedido_excedente :=
ELSE
pedido_excedente :=
END IF;

max_permitido
TRUE;
FALSE;

Co m b i n a o I F-EL SI F
Exemplo
IF salario < 10000
THEN
bonus := 2000;
ELSIF salario < 20000
THEN
bonus := 1500;
ELSIF salario < 40000
THEN
bonus := 1000;
ELSE
bonus := 500;
END IF;

Co m a n d o GOT O
Desvio incondicional para um rtulo
definido no programa.
GOTO nome_rotulo;
...
< < nome_rotulo> >
...

Pelo menos um comando deve existir


aps a definio de um rtulo.
O rtulo deve ser nico no escopo.

Co m a n d o GOT O
Rtulo destino deve estar no mesmo escopo
que o comando GOTO.
IF, BEGIN, Loop, mdulo.

Rtulo destino deve estar na mesma parte


do bloco PL/ SQL que o comando GOTO.
ex.: um GOTO na seo executvel no pode
desviar para a seo de exceptions.

O cdigo resultante com o uso do GOTO


pode tornar-se complexo e desestruturado,
dificultando a manuteno.

Co m a n d o N U L L
Melhorar a clareza do programa
IF : report .selection = DETAIL
THEN
exec_detail_report ;
ELSE
NULL;
END IF;
Tirar o efeito de uma exception
Projeto top-down dos mdulos do sistema.
Utilizao conjunta com o GOTO.

SQL * Pl u s

SQL * Pl u s
Permite introduzir interativamente
instrues de SQL e blocos PL/ SQL a
partir de uma linha de comandos que so
enviadas diretamente para a base de
dados
Comandos no so sensveis a maisculas
e minsculas

V a r i v e i s d e Su b s t i t u i o
Identificadas pelo caracter &
Substituio textual da varivel antes de
enviar a instruo para o servidor
Exemplo:
select * from emp
where empno= &num_empregado;

Variveis de Assoc ia o
Variveis de memria, podendo ser
utilizadas em um ou mais blocos PL/ SQL
Tipos vlidos:
VARCHAR2
CHAR
NUMBER
No podem ser restringidas por preciso ou
escala

REFCURSOR (a partir do SQL* Plus 3.2)

Variveis de Assoc ia o
Exemplo:
SQL> VARIABLE v_contador NUMBER
SQL> BEGIN
2
SELECT COUNT(*)
3
INTO :v_contador
4
FROM emp
5
WHERE empno > 1000;
6 END;
7 /
SQL> PRINT v_contador

Aps a execuo, a varivel v_contador


conter o resultado do select feito no bloco.

EX ECU T E
Uma chamada a stored procedures deve
ser feita atravs do comando EXECUTE
Exemplo:
EXECUTE minha_procedure(param1,...);
O SQL* Plus enviar o seguinte bloco PL/ SQL
para a base de dados:
BEGIN minha_procedure(param1,...); END;

Ex e c u t a r A r q u i v o s d e I n s t r u e s
Para executar quaisquer instrues SQL
ou blocos PL/ SQL
Pode-se utilizar start ou @
Exemplos:
start cria_proc.sql
start cria_func
start pacote1.pck
@funcao_teste.fnc

A extenso default sql

SH OW ERRORS
Mostra erros de compilao armazenados
na view user_errors
Utilizado aps uma tentativa de criar
stored procedures e receber a mensagem:
Warning: Procedure created with compilation errors

Ex e r c c i o I .1
Faa um script que, dado um nmero inteiro,
retorne o sua raiz quadrada (p/ rodar no
SQL* Plus).
Sugestes:
utilize a funo SQRT
utilize o modo de entrada de dados do SQL* Plus
(&variavel)
construa um bloco annimo
utilize o comando DBMS_OUTPUT.PUT_LINE

Ex e r c c i o I .2
Faa um script que calcule as razes de uma
equao de 2o grau
Sugestes:
utilize o mdulo de entrada de dados do SQL* Plus
(&variavel)
construa um bloco annimo

Obs.: eq = ax2 + bx + c = 0
raiz1 = ( - b + sqrt (b2 - 4.a.c) ) / 2.a
raiz2 = ( - b - sqrt (b2 - 4.a.c) ) / 2.a

Loops

Co n c e i t o s
Um loop permite que um mesmo cdigo
seja executado repetidamente.
Loop Simples
Loop FOR (p/ nmeros e cursores)
Loop WHILE

Na maioria dos casos, uma lgica que


requer um loop pode usar qualquer das
trs construes existentes.

L o o p Si m p l e s
LOOP
< comandos>
END LOOP;

O teste para terminao feito dentro do


loop
EXIT
EXIT WHEN < condio>

L o o p Si m p l e s
Exemplos
LOOP
balanco_restante := balanco_conta(conta_id);
IF balanco_restante < 1000 THEN
EXIT;
ELSE
aplicar_balanco(conta_id, balanco_restante);
END IF;
END LOOP;
LOOP
balanco_restante := balanco_conta(conta_id);
EXIT WHEN balanco_restante < 1000;
aplicar_balanco(conta_id, balanco_restante);
END LOOP;

L o o p Si m p l e s
Quando usar
no existe a certeza de quantas vezes o loop ser
executado
o loop deve executar pelo menos uma vez

L o o p FOR
FOR numrico
FOR < indice_loop> IN [ REVERSE] < menor> ..< maior>
LOOP
< comandos>
END LOOP;

O loop termina quando o cdigo executado o


nmero de vezes correspondente ao intervalo
informado
Aps cada execuo do bloco, o PL/ SQL verifica
se o valor atual do ndice excede a diferena
entre o maior e menor nmero informado na faixa

L o o p FOR
FOR numrico
Quando usar:
cdigo dentro do loop ser executado um nmero fixo
de vezes, sem ser necessria uma interrupo

Regras
no declare o ndice usado no loop
no mude o valor das variveis usadas para informar
a faixa de valores (a faixa analisada no incio do
loop), muito menos o valor do ndice
no use o comando EXIT dentro do loop FOR

L o o p FOR
FOR numrico
Exemplos

FOR contador IN REVERSE 1..10


LOOP
...
END LOOP;

FOR contador IN 1..10


LOOP
...
END LOOP;
FOR ind_calc IN ini_periodo ..
LEAST(fim_periodo,
periodo_atual)
LOOP
...
END LOOP;

L o o p WH I L E
WHILE < condio>
LOOP
< comandos>
END LOOP;

Executa at que a condio seja falsa.


Antes de cada execuo do bloco dentro loop,
o PL/ SQL avalia a condio informada.

L o o p WH I L E
Quando usar
no temos certeza de quantas vezes devemos
executar o corpo do loop
desejamos interromper o loop de acordo com
uma condio
no necessariamente temos que executar o loop
pelo menos uma vez

L o o p WH I L E
WHILE total <= 25000 LOOP
...
SELECT sal INTO salary FROM emp WHERE ...
total := total + salary;
END LOOP;
Este exemplo garante a execuo ao
menos uma vez:
done := FALSE;
WHILE NOT done LOOP
sequence_of_statements;
done := boolean_expression;
END LOOP;

Re g i s t r o s e m PL /SQL

Co n c e i t o s
Um registro em PL/ SQL bastante
similar estrutura de linhas em uma
tabela.
Um registro uma estrutura de dados
composta.
O registro como um todo no tem um
valor. Cada componente ou campo
que o possui.

T i p o s d e Re g i s t r o
Baseado em Tabela
cada campo corresponde a uma coluna em
uma tabela, inclusive com o mesmo nome

Baseado em Cursor
cada campo corresponde a uma coluna ou
expresso no comando SELECT de um
cursor

Definido pelo Programador


cada campo definido explicitamente
(nome e tipo) atravs do comando TYPE

De c l a r a o d e u m Re g i s t r o
Baseado em Tabelas
< nome_reg> < nome_tabela> %ROWTYPE;
DECLARE
empresa_reg empresa%ROWTYPE;

Baseado em Cursores
< nome_reg> < nome_cursor> %ROWTYPE;
DECLARE
empresa_reg empresa_cur%ROWTYPE;

De c l a r a o d e u m Re g i s t r o
Definido pelo Programador
TYPE < nome_tipo> IS RECORD
( < nome_campo1> < tipo_dado1> ,
< nome_campo2> < tipo_dado2> ,
...
< nome_campoN> < tipo_dadoN> )
TYPE cliente_regtipo IS RECORD
(cliente_id NUMBER(5),
cliente_nome cliente.nome%TYPE,
total_vendas NUMBER(15,2) );

T a b e l a s PL /SQL

De f i n i o
Como um array, uma tabela PL/ SQL uma
coleo ordenada de elementos de um mesmo
tipo.
Uma tabela PL/ SQL no tem limites de
tamanho, pode ser incrementada
dinamicamente.
O ndice de acesso da tabela no precisa ser
um nmero sequencial. Por exemplo, pode-se
usar uma srie como nmero do empregado
(como 7369, 7499, 7521, 7566, )

De f i n i n d o u m a T a b e l a PL /SQL
TYPE table_type_name IS TABLE OF
datatype [NOT NULL]
[INDEX BY BINARY_INTEGER];
onde table_type_name um tipo especificado
pelo usurio.

Na verso 8 a clusula INDEX BY


opcional.

Ex e m p l o s

DECLARE
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE NOT NULL
INDEX BY BINARY_INTEGER;

DECLARE
TYPE TimeRecTyp IS RECORD (
hour SMALLINT := 0,
minute SMALLINT := 0,
second SMALLINT := 0);
TYPE TimeTabTyp IS TABLE OF TimeRecTyp
INDEX BY BINARY_INTEGER;

Re f e r e n c i a n d o T a b e l a s PL /SQL

DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
BEGIN
...
IF emp_tab(1).job = CLERK THEN ...
END;

U s a n d o T a b e l a s PL /SQL
DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = ACCOUNTING THEN ...
...
END;

U s a n d o T a b e l a s PL /SQL
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by its element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
process data record
END LOOP;
CLOSE c1;
END;

A t r i b u t o s d e T a b e l a : COU N T
Retorna o nmero de elementos na
tabela.
...
IF ename_tab.COUNT = 50 THEN
...
END;

A t r i b u t o s d e T a b e l a : DEL ET E
Este atributo tem 3 formas:
tabela.DELETE remove todos os elementos da
tabela;
tabela.DELETE(n) remove o elemento n da
tabela;
tabela.DELETE(m,n) remove o range m .. n.

uma instruo completa por si s; no


chamada como parte de uma expresso

A t r i b u t o s d e T a b e l a : EX I ST S
Retorna TRUE se existir uma linha com
ndice i na tabela, caso contrrio retorna
FALSE.
IF sal_tab.EXISTS(i) THEN
sal_tab(i) := sal_tab(i) + 500;
ELSE
RAISE salary_missing;
END IF;
...

A t r i b u t o s d e T a b e l a : FI RST e L A ST
Retornam o ndice da primeira e da ltima
linha da tabela, respectivamente.
...
FOR i IN emp_tab.FIRST .. emp_tab.LAST LOOP
...
END LOOP;

A primeira linha a que tem o ndice mais


baixo e a ltima, o mais elevado.

A t r i b u t o s d e T a b e l a : N EX T e PRI OR
Retornam o ndice do elemento seguinte
ou anterior da tabela, respectivamente.
DECLARE
...
i BINARY_INTEGER;
BEGIN
..
i := any_tab.FIRST;
WHILE i IS NOT NULL LOOP
process any_tab(i)
...
i := any_tab.NEXT(i);
END LOOP;
END;

SQL e m PL /SQL

I n s t r u e s d e SQL
Podem dividir-se em seis categorias:
DML: linguagem de manipulao de dados
DDL: linguagem de definio de dados
Controle de transaes
Controle de sesses
Controle do sistema
SQL incorporado (para pr- compiladores)

SQL e m PL /SQL
Num programa PL/ SQL s podem ser
usadas as seguintes instrues:
DML: select , insert , update, delete
Controle de transaes: commit , rollback,
savepoint

Existe uma alternativa para o uso de


instrues DDL em PL/ SQL
A package DBMS_SQL, disponvel a partir da
verso 2.1 permite a criao de SQL dinmico

DM L : Se l e c t
Busca informaes do banco de dados
para variveis PL/ SQL
SELECT emp.ename
INTO v_ename
FROM emp
WHERE emp.empno = 7902;

Deve retornar somente uma linha


A clusula INTO s usada em blocos
PL/ SQL

DM L : I n s e r t
Insere uma linha na tabela
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, comm,
deptno)
VALUES
(1, 'ALBERT', 'SALESMAN', 7698, SYSDATE,
1432, 260, 30);
INSERT INTO emp
SELECT * FROM emp;

DM L : U p d a t e
Altera o contedo de uma ou mais linhas
de uma tabela
UPDATE emp
SET sal = sal * 1.2
WHERE empno = 1;

DM L : De l e t e
Elimina uma ou mais linhas de uma tabela
DELETE FROM emp
WHERE empno = 1;

Cl u s u l a WH ERE
Nas instrues SELECT, UPDATE e
DELETE esta clusula serve para restringir
o conjunto de linhas sobre as quais a
operao ser executada.
Constituda por condies, normalmente
de comparao, separadas pelos
operadores AND, OR, NOT

Re f e r n c i a s d e t a b e l a s
As operaes de DML referenciam uma
tabela, de uma forma geral, no formato:
[ owner.] tabela[ @dblink]
onde:
owner
dblink

- usurio onde a tabela foi criada


- denominao de uma conexo a um
banco de dados remoto

Si n n i m o s
Utilizados para facilitar o acesso aos
objetos do banco de dados, evitando o
uso de owner e dblink para identific-los.
Exemplo:
CREATE PUBLIC SYNONYM empregado FOR
owner1.emp@bd1;
Aps isto pode-se usar:
SELECT * FROM empregado;
em vez de ter que fazer:
SELECT * FROM owner1.emp@bd1;

Ps e u d o -c o l u n a s
Funes adicionais que s podem ser
chamadas a partir de instrues SQL:
CURRVAL e NEXTVAL
LEVEL
ROWID
ROWNUM

Ps e u d o -c o l u n a s : CU RRV A L e N EX T V A L
Utilizadas com sequncias (objetos Oracle
para gerar nmeros nicos)
sequncia.CURRVAL
retorna o valor atual da sequncia

sequncia.NEXTVAL
retorna o prximo valor da sequncia

Exemplo:
SELECT my_seq.NEXTVAL from dual;

Ps e u d o -c o l u n a s : L EV EL
Utilizado dentro de uma instruo SELECT
que implementa uma pesquisa de rvore
hierrquica numa tabela utilizando as
clusulas START WITH e CONNECT BY.
Esta pseudo-coluna retorna o nvel atual
da rvore.

Ps e u d o -c o l u n a s : ROWI D
Retorna o endereo fsico de uma linha da
tabela, num valor do tipo ROWID
Um SELECT utilizando-se de ROWID na clusula
WHERE o mtodo mais otimizado de se
recuperar uma linha
Exemplo:
v_rowid ROWID;
...
SELECT ROWID INTO v_rowid FROM emp;
...
UPDATE emp set ... WHERE emp.rowid = v_rowid;

Ps e u d o -c o l u n a s : ROWN U M
Retorna o nmero atual da linha num
SELECT
Utilizado principalmente na clusula
WHERE para limitar as linhas a serem
consideradas
SELECT * FROM emp WHERE ROWNUM < 3;

O valor ROWNUM atribudo a uma linha


antes de ser efetuada uma ordenao
(ORDER BY)

Pr i v i l g i o s d e A c e s s o
Privilgios de Objeto
Para efetuar operaes num objeto
Privilgios de Sistema
Para efetuar operaes numa classe de
objetos

GRA N T
Para dar privilgios de acesso
Objeto:
GRANT privilgio ON objeto TO usurio
[WITH GRANT OPTION]

Sistema:
GRANT privilgio TO usurio
[WITH ADMIN OPTION]

REV OK E
Para revogar privilgios de acesso
Objeto:
REVOKE privilgio ON objeto FROM usurio
[CASCADE CONSTRAINTS]

Sistema:
REVOKE privilgio FROM usurio

Pe r f i s d e Gr u p o
Os privilgios comuns podem ser agrupados em
ROLES, para facilitar a concesso para vrios
usurios que possuem o mesmo perfil
Em vez de dar privilgios para cada usurio:
Cria- se uma role: CREATE ROLE role
Concedem- se os privilgios: GRANT ... TO
role
Atribuem- se os usurios para essa role
GRANT role TO usurio
PUBLIC: perfil genrico para todos os usurios

Co n t r o l e d e T r a n s a e s
COMMIT
Salva as operaes da transao e libera
locks. As operaes so visveis a outras
sesses
ROLLBACK
Desfaz as operaes e libera locks
SAVEPOINT
Ponteiro para marcar o nicio para onde
um ROLLBACK pode ser efetuado

Fu n e s d e SQL i n t e g r a d a s

Fu n e s p a r a Ca r a c t e r e s
Nome
ASCII

Descrio
retorna o cdigo ASCII de um caractere

CHR

retorna o caractere associado ao cdigo ASCII

CONCAT

concatena duas strings

INITCAP

transforma a primeira letra de cada palavra em


maiscula

INSTR
LENGTH

retorna a localizao em uma string da


substring especificada
retorna o tamanho da string

LOWER

converte todas as letras para minsculas

LPAD

adiciona uma string esquerda

Fu n e s p a r a Ca r a c t e r e s
Nome
LTRIM
REPLACE
RPAD
RTRIM

Descrio
retira do lado esquerdo da string todos os caracteres recebidos
como parmetro
substitui uma sequncia de caracteres por um conjunto
diferente de caracteres
adiciona os caracteres especificados direita da string
retira do lado direito da string todos os caracteres recebidos
como parmetro

SOUNDEX
retorna a representao fontica de uma string
SUBSTR
retorna a poro especificada da string
TRANSLATE traduz caracteres nicos em uma string por um caracter
diferente
UPPER
converte todas as letras para maisculas

Fu n e s p a r a Ca r a c t e r e s
Exemplos
FUNCTION INSTR(string1 IN VARCHAR2,
string2 IN VARCHAR2
[ , pos_ini IN NUMBER := 1
[ , nth_ocorrencia IN NUMBER := 1] ] )
RETURN NUMBER
INSTR( Estou procurando uma palavra , uma ) = >
18
FUNCTION LPAD(string1 IN VARCHAR2,
tamanho_pad IN NUMBER
[ , string_pad IN VARCHAR2] )
RETURN VARCHAR2
LPAD( 55 , 10, 0) = > 0000000055
LPAD( 12345678 , 5, 0 ) = > 12345

Fu n e s p a r a Ca r a c t e r e s
Exemplos
FUNCTION LTRIM(string1 IN VARCHAR2
[ , trim_string IN VARCHAR2] )
RETURN VARCHAR2
LTRIM(

Eu gosto de pizza ) = > Eu gosto de pizza

FUNCTION SUBSTR(string_in IN VARCHAR2,


pos_ini IN NUMBER
[ , tam_substr_in IN
NUMBER] )
RETURN VARCHAR2
SUBSTR( Eu gosto de pizza , 4, 5) = > gosto
SUBSTR( Eu gosto de pizza , -1) = > a

Fu n e s p a r a Da t a s
Nome
ADD_MONTHS

Descrio
adiciona o nmero de meses especificado data

LAST_DAY
retorna o ltimo dia do ms da data especificada
MONTHS_BETWEEN retorna o nmero de meses entre duas datas
NEW_TIME
retorna o valor data/hora, com o tempo alterado
de acordo com o time zone especificado
NEXT_DAY
retorna a data do primeiro dia de semana
especificado que maior que a data
ROUND
SYSDATE
TRUNC

retorna a data arrendondada para o formato


especificado
retorna a hora/data corrente no Oracle Server
trunca a data da sua poro hora, de acordo com
o formato especificado

Fu n e s p a r a Da t a s
Exemplos
LAST_DAY(data_in IN DATE) RETURN DATE
LAST_DAY(SYSDATE) - SYSDATE = > nmero de
dias at o final do ms.

NEXT_DAY(data_in IN DATE,
nome_dia IN VARCHAR2)
RETURN DATE
NEXT_DAY( 01-JAN-1997 , MONDAY )
= > 06-JAN-1997

Fu n e s N u m r i c a s
Nome
ABS
COS / ACOS / COSH
SIN / ASIN / SINH
TAN / ATAN TANH
CEIL

Descrio
valor absoluto do nmero
cosseno; cosseno inverso; cosseno hiperblico
seno; seno inverso; seno hiperblico
tangente; tangente inversa; tangente hiperblica
retorna o teto inteiro de um nmero

EXP(n)
FLOOR
LN(a)

e elevado n-sima potncia


maior inteiro menor ou igual ao nmero
logaritmo natural de a.

LOG(a, b)
MOD(a, b)

logaritmo na base a de b.
resto da diviso de a por b.

Fu n e s N u m r i c a s

Nome
POWER(a,b)
ROUND(a,b)

Descrio
a elevado b-sima potncia
retorna a arredondado em b casas decimais

SIGN(a)

retorna 1 se a > 0, 0 se a = 0 e -1 se a < 0

SQRT

raiz quadrada de um nmero

TRUNC(a, [b])

a truncado at b casas decimais

Ou t r a s Fu n e s
Nome
DECODE
DUMP
GREATEST
LEAST
NVL
SQLCODE

Descrio
retorna o resultado de uma comparao no estilo if-then-else
retorna uma string contendo um dump da expresso especificada
retorna o maior dos valores especificados
retorna o menor dos valores especificados
substitui o valor NULL por um outro valor
retorna o nmero do erro do Oracle para a exception mais recente

SQLERRM

retorna a mensagem de erro do Oracle para a exception mais


recente
retorna o User ID da sesso corrente no Oracle

UID
USER
USERENV
VSIZE

retorna o nome do usurio logado


retorna uma string contento infos sobre a sesso corrente no Oracle
retorna o nmero de bytes da representao interna do valor
especificado

Ou t r a s Fu n e s
Exemplos
FUNCTION SQLCODE RETURN INTEGER
FUNCTION SQLERRM RETURN VARCHAR2
EXCEPTION
WHEN OTHERS THEN
MESSAGE( Error | | TO_CHAR(SQLCODE)
| | : | | SQLERRM);

Fu n e s d e Co n v e r s o
Nome
Descrio
CHARTOROWID converte uma string para ROWID
CONVERT
converte uma string de uma character set
para outro
HEXTORAW
converte de hexadecimal para o formato
RAW
RAWTOHEX
converte de raw para hexadecimal
ROWIDTOCHAR converte de ROWID para uma string
TO_CHAR
TO_DATE
TO_NUMBER

converte um nmero ou data para string


converte uma string para data
converte uma string para nmero

Fu n o T O_CH A R
FUNCTION TO_CHAR(param IN { DATE/ NUMBER} ,
[ , formato IN VARCHAR2
[ , nls_language IN
VARCHAR2] ] )
RETURN VARCHAR2
TO_CHAR(SYSDATE, Month DD, YYYY )
= > March 10,1997
TO_CHAR(564.70, $999.9 ) = > $564.7
TO_CHAR(564.70, $0000999.9 ) = > $0000564.7

Fu n o T O_DA T E
FUNCTION TO_DATE(param IN { VARCHAR2| NUMBER}
[ , formato IN VARCHAR2
[ , nls_language IN VARCHAR2 ] ] )
RETURN DATE
TO_DATE( 123198 , MMDDYY ) = > 31-DEC- 1998
TO_DATE( 16/ 7/ 94 , DD/ MM/ YY ) = > 16-JUL- 1994

Fu n o T O_N U M B ER
FUNCTION TO_NUMBER(string_in IN
CHAR| VARCHAR2}
[ , formato IN VARCHAR2
[ , nls_language VARCHAR2] ] )
RETURN NUMBER

TO_NUMBER( 123.23 ) = >


TO_NUMBER( abcdef ) = >

123.23
ERRO

Fu n e s d e Gr u p o
Somente para SELECT com GROUP BY
Nome

Descrio

AVG
COUNT
MAX
MIN
STDDEV

retorna a mdia dos valores da coluna


retorna o nmero de linhas que a coluna no nula
retorna o valor mximo da coluna
retorna o valor mnimo da coluna
retorna o desvio padro da coluna

SUM
VARIANCE

retorna a soma dos valores da coluna


retorna a varincia estatstica da coluna

Cu r s o r e s

Co n c e i t o s
Um cursor pode ser encarado como um
ponteiro para a tabela virtual no banco de
dados representada pelo comando
SELECT associado.
Ex.:
CURSOR empregado_cur IS
SELECT * FROM empregado;
OPEN empregado_cur;
FETCH empregado_cur INTO empregado_rec;
CLOSE empregado_cur;

Op e r a e s e m Cu r s o r e s
OPEN
abre o cursor, faz o parse e o bind da
consulta associada, identificando o resultado
o cursor posicionado antes da primeira linha.

FETCH
busca a linha corrente do cursor e o posiciona na
prxima

CLOSE
fecha o cursor e libera a memria alocada.

T i p o s d e Cu r s o r e s
Cursores Estticos
sempre referenciam um comando SQL, que
conhecido em tempo de compilao.

Variveis Cursores
a varivel referencia um objeto cursor e pode
referenciar diferentes comandos SQL em
ocasies diferentes.
nova feature do PL/ SQL.

T i p o s d e Cu r s o r e s
Implcitos
o PL/ SQL utiliza um cursor implcito sempre que
um comandos SQL executado diretamente no
cdigo, desde que o cdigo no utilize um cursor
explcito
usados em cada UPDATE, INSERT ou DELETE
so menos eficientes que cursores explcitos
mais suscetveis a erro

T i p o s d e Cu r s o r e s
Explcitos
comando SELECT explicitamente definido na
seo de declarao, sendo um nome
associado a ele
usados quando desejamos recuperar mais de
uma linha de resultado
no existem para comandos de UPDATE,
INSERT e DELETE

De c l a r a o
CURSOR nome_cursor [ ( [ parmetro [ ,
parmetro ...] ) ]
[ RETURN especificao_retorno ]
IS comando_SELECT;

V a r i v e i s e m u m Cu r s o r
Nome do Cursor no uma varivel
No PL/ SQL, a lista de itens no SELECT pode
conter colunas, variveis do PL/ SQL e
variveis associadas (p.e. Oracle Forms).
DECLARE
bonus NUMBER := 100;
CURSOR empregado_cur IS
SELECT empregado_id, salario + bonus,
: revisao.avaliacao
FROM empregado
WHERE dt _contrat < ADD_MONTHS(SYSDATE, -36);

Pr e c e d n c i a d e u m I d e n t i f i c a d o r
Em um cursor, existe precedncia do nome
da coluna sobre o nome de uma varivel
PL/ SQL.
PROCEDURE melhorar_SQL
IS
salario NUMBER := 1000;
CURSOR dobrar_sal_cur IS
SELECT salario + salario
FROM empregado
WHERE dt _contrat < ADD_MONTHS(SYSDATE,-36);
BEGIN

A c l a s u l a RET U RN
Somente pode ser usada para cursores
que esto contidos em um package.
A clasula RETURN pode ser feita com as
seguintes estruturas:
Um record definido a partir de uma tabela,
usando %ROWTYPE
Um record definido a partir de um record prdefinido pelo progamador

Ex e m p l o d e U s o d a c l a s u l a RET U RN
Primeiro a definio da Package
PACKAGE empresa IS
CURSOR empresa_cur (id IN NUMBER)
RETURN empresa%ROWTYPE;
END empresa;

Depois a definio da Package Body


PACKAGE body empresa IS
CURSOR empresa_cur (id IN NUMBER)
RETURN empresa%ROWTYPE IS
SELECT * FROM empresa
WHERE empresa_id = id;
END empresa;

Po r q u e c o l o c a r c u r s o r n u m a Pa c k a g e ?
Uma package uma coleo de objetos
logicamente relacionados
Agrupando os cdigos, torna-se mais fcil
a identificao e uso dos cdigos pelo
programador
Cursores em packages so essencialmente
caixas pretas
O programador no precisa saber como
um cursor recuperado

A b r i n d o Cu r s o r e s
OPEN < nome_cursor> [ (parmetro [ ,
parmetro ...] ) ] ;

O comando OPEN no recupera linhas.


Todos os fetches refletiro os dados
exatamente como da ocasio em que o
cursor foi aberto.

Re c u p e r a n d o Da d o s d e Cu r s o r e s
FETCH < nome_cursor> INTO
< registro_ou_lista_variveis>
Exemplo:
FETCH empresa_cur INTO empresa_reg;
FETCH max_sal_cur INTO max_sal;
FETCH empr_cur INTO empr_nome(1),
dt _contrat ,
:depto.min_salario;

Fe c h a n d o Cu r s o r e s
CLOSE < nome_cursor>
Libera rea de memria (SGA).
Libera todo bloqueio (lock) causado pelo
cursor.
Existe um limite mximo de cursores que
podem ser abertos no SGBD Oracle.
Um cursor automaticamente fechado
quando o seu escopo abandonado.

A t r i b u t o s d e Cu r s o r e s
Nome

Descrio

%FOUND

retorna TRUE se o registro foi


recuperado com sucesso

%NOTFOUND recupera TRUE se o registro no foi


recuperado com sucesso
%ROWCOUNT retorna o nmero de registros
recuperados at o momento
%ISOPEN

retorna TRUE se o cursor estiver


aberto

A t r i b u t o s d e Cu r s o r e s
%FOUND
OPEN pedido_cur;
FETCH pedido_cur INTO pedido_id, empresa_id;
IF pedido_cur%FOUND THEN
:pedido.num_pedidos := :pedido.num_pedidos + 1;
END IF;
...

A t r i b u t o s d e Cu r s o r e s
%NOTFOUND
Oposto ao %FOUND
Muito utilizado para terminao de loops
EXIT WHEN empresa_cur%NOTFOUND;

A t r i b u t o s d e Cu r s o r e s
%ROWCOUNT
DECLARE
CURSOR emp_cur IS
SELECT nome, salario
FROM empregado
ORDER BY salario DESC;
emp_reg emp_cur%ROWTYPE;
BEGIN
OPEN emp_cur ;
LOOP
FETCH emp_cur INTO emp_reg;
EXIT WHEN emp_cur%ROWCOUNT > 10 OR
emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( emp_reg.nome | | - | |
emp_reg.salario);
END LOOP;
END;

A t r i b u t o s d e Cu r s o r e s
%ISOPEN
IF NOT emp_cur%ISOPEN THEN
OPEN emp_cur;
END IF;

A t r i b u t o s d e Cu r s o r e s I m p l c i t o s
Quando o RDBMS abre um cursor ou
executa um insert, update ou delete, ele
torna uma das seguintes variveis
habilitadas:
SQL%FOUND
SQL%NOTFOUND
SQL%ROWCOUNT
SQL%ISOPEN

Pa r m e t r o s e m Cu r s o r e s
Um parmetro faz com que um cursor se torne
mais reutilizvel.
DECLARE
CURSOR empresa_cur (categoria_in VARCHAR2)
IS
SELECT nome, categoria, contato
FROM empresa
WHERE categoria = UPPER(categoria_in);

Podemos definir um valor padro para um


parmetro.
CURSOR emp_cur( emp_in NUMBER := 0)

SEL ECT ... FOR U PDA T E


Quando um comando SELECT ... FOR
UPDATE executado, o Oracle
automaticamente bloqueia a linha de
maneira exclusiva
Ningum conseguir alterar estes registros
antes de um ROLLBACK ou COMMIT
CURSOR emp_cur IS
SELECT nome, salario
FROM empregado
WHERE salario < 100
FOR UPDATE

WH ERE CU RREN T OF
Esta clusula utilizada para comandos
DELETE e UPDATE dentro de um cursor.
O registro mais recentemente recuperado
apagado ou atualizado
Exemplo:
FETCH emp_cur INTO emp_reg;
...
UPDATE empregado SET salario := salario + bonus
WHERE CURRENT_OF emp_cur;

V a r i v e i s Cu r s o r e s
Disponvel a partir das releases 2.2 e 2.3.
Possibilidade de passar como parmetro o
resultado de consultas para outros
programas.
Variveis cursores so como ponteiros do
C ou Pascal, na qual um endereo de
memria assinalado. Declarando uma
varivel cursor se cria um ponteiro, no
um objeto.

Po r q u e u s a r v a r i v e i s c u r s o r ?
Usa-se uma varivel cursor para passar o
resultado de uma query entre stored
subprograms e aplicaes client.
Por exemplo, uma aplicao Client, Oracle
Forms, e Oracle Server podem ambos se
referenciar mesma rea de trabalho.

V a r i v e i s Cu r s o r e s

OPEN
OPENcursor
cursor
FETCH
FETCHreg1
reg1
FETCH
FETCHreg2
reg2
FETCH
FETCHreg3
reg3
CLOSE
CLOSEcursor
cursor

V a r i v e i s Cu r s o r e s
Exemplo
DECLARE
TYPE empresa_curtipo IS REF CURSOR
RETURN empresa%ROWTYPE;
empresa_curvar empresa_curtipo;
BEGIN
OPEN empresa_curvar FOR SELECT *
FROM empresa;
...

De f i n i n d o u m a V a r i v e l Cu r s o r
TYPE ref_type_name IS REF CURSOR
RETURN return_type;
onde ref _type_name o nome da varivel
especificada para uso subsequente e return_type
deve representar um record ou uma row na tabela.
Exemplo:
DECLARE
TYPE DeptCurTyp IS REF CURSOR
RETURN dept %ROWTYPE;

Em u m a St o r e d Pr o c e d u r e
CREATE PACKAGE emp_data AS
TYPE GenericCurTyp IS REF CURSOR;
TYPE EmpCurTyp IS REF CURSOR
RETURN emp%ROWTYPE;
PROCEDURE open_emp_cv
(emp_cv IN OUT EmpCurTyp,
choice IN NUMBER);
END emp_data;

Em u m a St o r e d Pr o c e d u r e
(c o n t i n u a o ...)
CREATE PACKAGE BODY emp_data AS
PROCEDURE open_emp_cv
(emp_cv IN OUT EmpCurTyp,
choice IN NUMBER) IS
BEGIN
IF choice = 1 THEN
OPEN emp_cv FOR SELECT * FROM emp
WHERE comm IS NOT
NULL;
ELSIF choice = 2 THEN
OPEN emp_cv FOR SELECT * FROM emp
WHERE sal > 2500;
ELSIF choice = 3 THEN
OPEN emp_cv FOR SELECT * FROM emp
WHERE deptno = 20;
END IF;
END open_emp_cv;
END emp_data;

L o o p Si m p l e s p a r a Cu r s o r e s
As instrues devem ser feitas
explicitamente:
Abrir o cursor
Colocar o fetch dentro do loop
Estabelecer a condio para fim do loop
Fechar o cursor

Requer maior ateno do desenvolvedor


Maior possibilidade de ocorrer erro

L o o p Si m p l e s p a r a Cu r s o r e s
Exemplo
DECLARE
CURSOR cur_emp IS ...
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO ...
EXIT WHEN cur_emp%NOTFOUND;
-- processar informaes do cursor
END LOOP;
CLOSE cur_emp;
END;

L o o p FOR p a r a Cu r s o r e s
FOR indice_registro IN nome_cursor
LOOP
< comandos>
END LOOP;
O loop termina incondicionalmente quando
todos os registros do cursor forem
recuperados
A cada execuo do loop, o PL/ SQL verifica o
atributo %NOTFOUND

L o o p FOR p a r a Cu r s o r e s
Exemplo
DECLARE
CURSOR ocupacao_cur IS
SELECT hosp_id, nm_quarto
FROM ocupacao WHERE dt _ocupacao = SYSDATE;
BEGIN
FOR ocupacao_reg IN ocupacao_cur
LOOP
atualiza_nota( ocupacao_reg.hosp_id,
ocupacao_reg.nm_quarto);
END LOOP;
END;

L o o p FOR p a r a Cu r s o r e s
Quando usar:
quando desejamos recuperar e processar
todos os registros do cursor
no apropriado situaes em que
condies devem ser avaliadas para
determinar o trmino da operao de
recuperao

Observao
o ndice do loop, neste caso uma varivel do
tipo registro, encarado da mesma forma
que ndices numricos

Ex e r c c i o I I .1
Liste os 3 departamentos com maior folha
(soma dos salrios dos empregados), em
ordem decrescente.
Sugesto:
Utilize as tabelas dept e emp (SCOTT/ TIGER)
utilize o procedimento
DBMS_OUTPUT.PUT_LINE

Ex e r c c i o I I .2
De acordo com o salrio de um
empregado, calcule o imposto de renda
correspondente.
Sugestes
Utilize a tabela emp SCOTT/ TIGER
No considere possveis dedues

Obs.:
salario <
salario >
salario >

900 - isento
900 e < = 1800 - 15% - R$135
1800 - 25% - R$315

Ex e r c c i o I I .3
Calcular o total de salrios pagos (salrio
+ comisso) para empregados de um
departamento. Determinar tambm
quantos empregados tem salrio maior
que $2000 e quantos tem a comisso
maior que o salrio.

Su b p r o g r a m a s :
Pr o c e d i m e n t o s e Fu n e s

Co n c e i t o s
Modularizao
processo de quebrar grandes blocos de
cdigo em pequenos pedaos (mdulos)
torna o cdigo:
mais reutilizvel
mais fcil de gerenciar
mais legvel
mais confivel

Co n c e i t o s
Estruturas para Modularizao
(PL/ SQL):
procedimento
bloco que efetua uma ou mais aes, sendo
possvel a passagem de informaes, tanto
para dentro quanto para fora do procedimento

funo
retorna um nico valor; podemos passar
informaes para a funo atravs de
parmetros

Co n c e i t o s
bloco annimo
bloco PL/ SQL que efetua uma ou mais tarefas;
usado para controlar o escopo dos
identificadores e manuseio de exceptions

package
coleo de procedimentos, funes, tipos e
variveis; no exatamente um mdulo, mas
est relacionado ao assunto

Es t r u t u r a d o B l o c o PL /SQL (Re v i s o )

Cabealho
Cabealho

DECLARE
Seo
Seode
deDeclarao
Declarao
BEGIN
Seo
Seode
deExecuo
Execuo
EXCEPTION
Seo
Seode
deExceptions
Exceptions
END;

IS
Seo
Seode
deDeclarao
Declarao
BEGIN
Seo
Seode
deExecuo
Execuo
EXCEPTION
Seo
Seode
deExceptions
Exceptions
END;

Es t r u t u r a d e B l o c o s PL /SQL
PROCEDURE contratar(nome_in IN VARCHAR2)
IS
data_contratacao DATE;
BEGIN
data_contratacao := SYSDATE - 2;
INSERT INTO empregado (nome, data_contratacao)
VALUES (nome_in, data_contratacao);
EXCEPTION
WHEN DUP_VAL_IN_INDEX
THEN
DBMS_OUTPUT.PUT_LINE( No inseriu );
END;

Es c o p o (Re v i s o )

DECLARE
DECLARE
data_contratacao
data_contratacaoDATE;
DATE;
BEGIN
BEGIN
DECLARE
DECLARE
total_vendas
total_vendasNUMBER;
NUMBER;
BEGIN
BEGIN

END;
END;
END;
END;

escopo
escopode
de
data_contratacao
data_contratacao

escopo
escopode
de
total_vendas
total_vendas

Pr o c e d i m e n t o s
Estrutura
PROCEDURE < nome> [ (parmetro [ ,
parmetro ...] ) ]
IS
[ comandos de declarao]
BEGIN
< comandos>
[ EXCEPTION
< comandos para manuseio de
exceptions> ]
END [ nome] ;

Pr o c e d i m e n t o s
Chamada
um procedimento chamado da mesma
maneira que um comando PL/ SQL
aplicar_desconto(nova_empr_id, 15.00);

Pr o c e d i m e n t o s
Cabealho
nome do procedimento e lista de parmetros
PROCEDURE aplicar_desconto(empr_id_in IN
empresa.empr_id%TYPE, desconto_in IN
NUMBER)

Corpo
cdigo necessrio para a execuo do
procedimento
PROCEDURE nada IS
BEGIN
NULL;
END;

Ex e m p l o d e Pr o c e d u r e
PROCEDURE raise_salary (emp_id INTEGER, increase REAL)
IS
current_salary REAL;
salary_missing EXCEPTION;
BEGIN
SELECT sal INTO current_salary FROM emp
WHERE empno = emp_id;
IF current_salary IS NULL THEN
RAISE salary_missing;
ELSE
UPDATE emp SET sal = sal + increase
WHERE empno = emp_id;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO emp_audit VALUES (emp_id, No such number );
WHEN salary_missing THEN
INSERT INTO emp_audit VALUES (emp_id, Salary is null );
END raise_salary;

Fu n e s
Estrutura
FUNCTION nome [ (parmetro [ , parmetro
...] ) ]
RETURN tipo_retornado
IS
[ comandos de declarao]
BEGIN
comandos
[ EXCEPTION
comandos para manuseio de exceptions]
END [ nome]

Fu n e s
Chamada
uma funo chamada como parte de um
comando, sempre que uma expresso pode
ser usada
vendas_95 := total_vendas( Marisol , 1995);
DECLARE
vendas_95 NUMBER DEFAULT
total_vendas( Marisol , 1995);
IF total_vendas( Marisol , 1995)
THEN ...

Fu n e s
Cabealho
nome da funo, lista de parmetros e
tipo do retorno
FUNCTION total_vendas(nome_in IN
empresa.nome%TYPE, ano_in pedido.ano%TYPE)
RETURN NUMBER;

Corpo
cdigo necessrio para a execuo da funo
FUNCTION nada RETURN BOOLEAN IS
BEGIN
RETURN TRUE;
END;

De c l a r a o RET U RN
Encerra a execuo da funo e retorna o
valor para o programa que a chamou.
Um subprograma pode conter vrias
declaraes RETURN.
Em procedures a declarao RETURN no
deve conter uma expresso.
Em funes a declarao RETURN deve
conter uma expresso que executada no
momento da execuo da declarao.

Ex e m p l o d e Fu n o
FUNCTION sal_ok (salary REAL, title REAL) RETURN BOOLEAN
IS
min_sal REAL;
max_sal REAL;
BEGIN
SELECT losal, hisal INTO min_sal, max_sal
FROM sals
WHERE job = title;
RETURN (salary >= min_sal) AND (salary <= max_sal);
END sal_ok;

Pa r m e t r o s
Modo de troca de informaes entre o
mdulo e o bloco PL/ SQL que o chamou.
Quando declaramos um parmetro, nunca
especificamos restries quanto ao
tamanho do tipo de dado.
PROCEDURE mostra_empresa(nome IN
VARCHAR2) IS

permitida a utilizao de %TYPE e


%ROWTYPE na declarao de parmetros

M o d o d e Pa s s a g e m d e Pa r m e t r o s
IN
somente para leitura

OUT
somente para escrita (o mdulo pode atribuir
um valor ao parmetro, que ser passado ao
bloco PL/ SQL que o chamou)

IN OUT
usado para leitura e escrita

Pa s s a g e m d e Pa r m e t r o s
PROCEDURE combine_formate_nomes (prim_nome IN OUT VARCHAR2,
ult_nome IN OUT VARCHAR2,
nome_comp OUT VARCHAR2,
formato IN VARCHAR2 := ULTIMO PRIMEIRO )
-- O parmetro formato no precisa obrigatoriamente ser informado
IS
BEGIN
IF formato = ULTIMO PRIMEIRO THEN
nome_comp := ult_nome | | , | | prim_nome
ELSIF formato = PRIMEIRO ULTIMO THEN
nome_comp := prim_nome | | | | ult_nome;
END IF;
END;

Co m o o PL /SQL f a z a a s s o c i a o d o s
parm et ros?
Notao Posicional
associa o valor ao parmetro correspondente
implicitamente atravs da posio

Notao por Nome Explicitamente


associa um valor a um parmetro
explicitamente atravs do seu nome
vendas_97 := total_vendas(nome_in = > Cia. JK ,
ano_in = > 1997);
vendas_97 := total_vendas(ano_in = > 1997,
nome_in = > Cia. JK );

St o r e d Pr o c e d u r e s /Fu n c t i o n s
Uma stored procedure ou stored function
uma unidade de programa PL/ SQL que:
tem um nome
pode receber e retornar valores
fica armazenada no dicionrio de dados
pode ser usada por vrios usurios

St o r e d Pr o c e d u r e s /Fu n c t i o n s
Exemplo:
CREATE PROCEDURE recupera_emp_reg
(emp_numero IN emp.empno%TYPE,
emp_reg
OUT emp%ROWTYPE) AS
BEGIN
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
INTO emp_ret
FROM emp
WHERE empno = emp_numero;
END;

Mdulo Loc al
Procedimento ou funo definido da seo
de declarao de um bloco PL/ SQL.
No pode ser chamado por nenhum outro
mdulo PL/ SQL definido fora do bloco ao
qual o mesmo pertence.
Vantagens
reduz o tamanho do mdulo, eliminando
cdigos repetitivos
torna o cdigo mais legvel

Ex e m p l o d e M d u l o s L o c a i s
DECLARE
rent REAL;
PROCEDURE raise_rent (increase IN OUT REAL) IS
BEGIN
rent := rent + increase;
...
END raise_rent;
...
BEGIN
...
raise_rent(rent);
indeterminate

De p e n d n c i a s d o s Su b p r o g r a m a s
Subprogramas so dependentes dos
objetos que referenciam
Caso algum destes objetos forem
alterados por uma operao DDL, o
subprograma fica com status INVALID e
deve ser recompilado
ALTER {PROCEDURE | FUNCTION} nome COMPILE;

Determinao de dependncia (no


INIT.ORA)
Timestamp
Assinatura

Pr i v i l g i o s d e A c e s s o
Para poder executar um subprograma
necessrio ter o privilgio EXECUTE para
o objeto.
Um subprograma executado utilizando
os privilgios explcitos do seu owner, sem
considerar privilgios de roles.

Pa c k a g e s

Co n c e i t o s
Uma package um conjunto de objetos
PL/ SQL que so empacotados com uma
sintaxe especial de BEGIN-END.
Podemos colocar em uma package:
cursores
variveis
nomes de exceptions
comandos TYPE
procedimentos e funes

Co n c e i t o s
Vantagens de utilizarmos packages:
information hiding
projeto orientado a objetos
projeto top- down
persistncia de objetos
melhor performance

Int erfac e

Package
DataBase
Especificao
Aplicao
Body

Es t r u t u r a d e u m a Pa c k a g e
Especificao
contm as definies e especificaes de
todos os elementos em uma package que
podem ser referenciados fora dela.
PACKAGE nome_package IS
[ declaraes de variveis e tipos ]
[ declaraes de cursores ]
[ declaraes de mdulos ]
END [ nome_package] ;

Es t r u t u r a d e u m a Pa c k a g e
Corpo
contm implementao de mdulos, cursores
e outros objetos
PACKAGE BODY nome_package IS
[ declaraes de variveis e tipos ]
[ especificaao de comandos SELECT de cursores ]
[ especificao do corpo de mdulos ]
[ BEGIN
comandos executveis ]
[ EXCEPTION
exception handlers ]
END [ nome_package] ;

Ex e m p l o Pa c k a g e - Es p e c i f i c a o
specification
CREATE PACKAGE emp_actions AS
TYPE EmpRecTyp IS RECORD (emp_id INTEGER, salary REAL);
CURSOR desc_salary RETURN EmpRecTyp;
PROCEDURE hire_employee (ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER);
PROCEDURE fire_employee (emp_id NUMBER);
END emp_actions;

Ex e m p l o Pa c k a g e - B o d y
CREATE PACKAGE BODY emp_actions
AS
CURSOR desc_salary RETURN EmpRecTyp IS
SELECT empno, sal FROM emp ORDER BY sal DESC;
PROCEDURE hire_employee (ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER)
IS
BEGIN
INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job,
mgr, SYSDATE, sal, comm, deptno);
END hire_employee;
PROCEDURE fire_employee (emp_id NUMBER)
IS
BEGIN
DELETE FROM emp WHERE empno = emp_id;
END fire_employee;
END emp_actions;

Pa c k a g e s e Es c o p o
Objetos declarados na Package
Specification tm escopo pblico,
podendo ser utilizados fora da package
nome_da_package.nome_do_subprograma (...)
nome_da_package.nome_do_tipo

Aqueles objetos definidos somente no


Package Body tm escopo privado,
podendo somente ser utilizados por
outros objetos dentro da package

Ov e r l o a d i n g d e M d u l o s
Dois ou mais mdulos podem ter o mesmo
nome com uma lista diferente de parmetros
FUNCTION valor_ok(numero_in IN NUMBER)
RETURN BOOLEAN
IS
FUNCTION valor_ok(data_in IN DATE)
BEGIN
RETURN BOOLEAN
RETURN numero_in > 0;
IS
END;
BEGIN
RETURN date_in <= SYSDATE;
END;

Ov e r l o a d i n g d e M d u l o s
Onde Fazer?
na seo de declarao de um bloco PL/ SQL
dentro de um package

No podemos fazer a sobrecarga de


nomes de programas independentes,
muito menos criar dois mdulos
independentes com o mesmo nome e
listas de parmetros distintas.

Ex e m p l o
DECLARE
TYPE DateTabTyp IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
TYPE RealTabTyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
hiredate_tab DateTabTyp;
comm_tab RealTabTyp;
indx BINARY_INTEGER;
...
BEGIN
indx := 50;
calls first version
initialize(hiredate_tab, indx);
calls second version
initialize(comm_tab, indx);
...
END;

I n i c i a l i za o d e Pa c k a g e s
Uma package pode conter um conjunto
de instrues a serem executadas
somente quando a mesma carregada
para a memria
CREATE OR REPLACE PACKAGE BODY nome_pack AS
...
BEGIN
-- Cdigo de inicializao
...
END nome_pack;

De p e n d n c i a s d e Pa c k a g e s
O Package Body depende da Package
Specification e dos objetos referenciados
A Package Specification no depende de
nada
Vises para dependncias no PL/ SQL 8.0:
user_dependencies
all_dependencies
dba_dependencies

U t i l i za o d e St o r e d Fu n c t i o n s e m
i n s t r u e s SQL
Uma funo independente ou contida
numa package pode ser chamada numa
instruo SQL, dependendo das restries
de referncia
Restries de Referncia: definem quais
tipos de estruturas de dados que a funo
l ou modifica
WNDS ( Writes No Database State)
RNDS ( Reads No Database State)
WNPS ( Writes No Package State)
RNPS ( Reads No Package State)

U t i l i za o d e St o r e d Fu n c t i o n s e m
i n s t r u e s SQL
Somente para Stored Functions
Parmetros
devem ser somente de entrada
no podem utilizar tipos PL/ SQL ( boolean,
record)

Tipo de retorno da funo tambm tem


que ser um tipo da base de dados

REST RI CT _REFEREN CES


Para funes independentes o PL/ SQL
consegue determinar as restries de
referncia.
Para funes em packages necessrio
discriminar as restries atravs da
pragma abaixo. Isto porque os blocos
PL/ SQL que chamam uma funo
empacotada dependem apenas da
package specification e no do body.
PRAGMA RESTRICT_REFERENCES (nome_funo, WNDS
[,WNPS] [,RNDS] [,RNPS]);

A l g u m a s Pa c k a g e s Pr -De f i n i d a s
Nome

Descrio

DBMS_DDL

execuo de comandos DDL

DBMS_JOB

DBMS_SNAPSHOT

submete e gerencia jobs programados


dentro do database
mostra sadas de programas PL/SQL
no terminal
gerenciamento de snapshots

DBMS_SQL

construo de SQLs dinmicos

UTL_FILE

permite que programas PL/SQL leiam


e escrevam em arquivos

DBMS_OUTPUT

Ex e r c c i o I I I .1
Converta o script criado no exerccio I.2
(razes de uma equao do 2o grau) para
um procedimento.
Armazene este procedimento no banco.

Ex e r c c i o I I I .2
Converta o script do exerccio II.1 (trs
departamentos com maior folha - soma de
salrios) para um procedimento.
Ao invs de mostrar as informaes na
tela, insira-as em uma tabela.
Armazene este procedimento no banco
(stored procedure).

Ex e r c c i o I I I .3
Converta o script do exerccio II.2 (clculo
do imposto renda) para uma funo, que
receba como parmetro a matrcula do
funcionrio e retorne o imposto a ser
pago.
Armazene esta funo no banco (stored
function).

Ex e r c c i o I I I .4
Construa uma package contendo as funes
/ procedimentos do departamento pessoal.
Armazene esta package no banco de dados
Oracle.
Salrio Lquido = SAL+ COMM - Imposto de
Renda
COMM = Se o JOB= CLERK , comisso =
1.03 * SAL
Gravar em Contra-Cheque (salrio normal,
comisso, imposto de renda e salrio
Lquido)

Triggers

Triggers
Correspondem a stored procedures, com
a diferena que os triggers so disparados
automaticamente quando houver
operaes de insert, update e delete nas
tabelas associadas.

Triggers
As aplicaes de triggers incluem:
clculo automtico de colunas
crtica de transaes
garantia de regras de segurana complexas
garantia de integridade referencial em bancos
de dados distribudos
implementao de regras de negcio
complexas

Si n t a x e
CREATE OR REPLACE schema.trigger
[BEFORE|AFTER] DELETE OR INSERT OR UPDATE [OF
column]
ON schema.table
[REFERENCING OLD AS old NEW AS new]
FOR EACH ROW
WHEN (condition)
pl_sql_block

T r i g g e r i n g St a t e m e n t
a especificao da ao que levar ao
acionamento do trigger, podendo ser:
INSERT
UPDATE
DELETE

T r i g g e r Re s t r i c t i o n
uma expresso que limita a execuo
de um trigger.
Deve resultar em valor TRUE ou FALSE.
O trigger somente ser executado para
valores TRUE.

Trigger Ac t ion
um bloco PL/ SQL que ser executado
quando o trigger for acionado.

Tipos de Triggers
ROW TRIGGERS
so executados uma vez para cada linha
da tabela afetada pelo comando SQL.

STATEMENT TRIGGERS
so executados apenas uma vez para cada
comando SQL que afete a tabelas,
independentemente do nmero de linhas
envolvidas.

Ac ionam ent o de Triggers


Quando definimos um trigger, podemos
especificar quando ele ser acionado:
before row
before statement
after row
after statement

T r i g g e r s (Ex e m p l o )
CREATE TRIGGER dummy
BEFORE DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
WHEN (new.empno > 0)
DECLARE
/ * variveis, constantes, cursores, etc. * /
BEGIN
/ * bloco PL/ SQL * /
END;

Lim it e de Triggers por Tabela

Um de cada tipo, totalizando at 12


triggers. No entanto no PL/ SQL 2.1 uma
tabela pode ter mais de um trigger de
cada tipo.
BEFORE UPDATE row
BEFORE DELETE row
BEFORE INSERT statement
BEFORE INSERT row
BEFORE UPDATE statement
BEFORE DELETE statement

AFTER UPDATE row


AFTER DELETE row
AFTER INSERT statement
AFTER INSERT row
AFTER UPDATE statement
AFTER DELETE statement.

T r i g g e r s i n s t e a d -o f
Em PL/ SQL 8.0, podem ser definidos
triggers que sero disparados em vez da
instruo DML que os disparou
Somente para vises
A nvel de linha
Exemplo:
Para eliminar linhas de uma view complexa

Ps e u d o -r e g i s t r o s
Disponvel para triggers a nvel de linha
:old
valores originais do registro da tabela
somente para leitura no corpo do trigger

:new
valores do registro que sero inseridos ou
atualizados na base de dados
podem ser atribudos valores (somente
quando before)

Cl u s u l a WH EN
Vlida para triggers a nvel de linha
O corpo do trigger ser executado para as
linhas que a condio especificada
resultar em TRUE
Os pseudo-registros :old e :new podem
ser utilizados dentro da condio, mas os
dois pontos devem ser suprimidos

Pr e d i c a d o s d e T r i g g e r
Usados em triggers disparados para
diferentes tipos de instrues de DML
Funes booleanas que identificam a
instruo que disparou o trigger
INSERTING
UPDATING
DELETING

T r a t a m e n t o d e Er r o s

Co n c e i t o s
Uma exception uma situao que no
deveria ter ocorrido.
Pode ser causada por:
erro gerado pelo sistema (p.e. out of
memory )
erro causado por uma ao do usurio
aviso gerado pela aplicao e direcionado ao
usurio

Ex c e p t i o n H a n d l e r s
Este mecanismo permite separar o cdigo
de processamento de erros do resto dos
comandos.
Oferece um modelo orientado a eventos.
No importa como uma exception foi
gerada, ela ser tratada na mesma seo
(exception section).

De s v i o d o Fl u x o
PROCEDURE fluxo
IS
novo_valor VARCHAR2(5);
BEGIN
novo_valor := valor_antigo || -novo ;
IF novo_valor LIKE open%
THEN
...
END IF;
EXCEPTION
WHEN VALUE_ERROR
THEN ...
END;

T i p o s d e Ex c e p t i o n s
Existem quatro tipos de exceptions:
exceptions do sistema com um nome
geradas devido a um erro no processamento do
SGBD ou do cdigo PL/ SQL

definidas pelo programador com um nome


geradas devido a um erro no cdigo; elas so
declaradas na seo correspondente

T i p o s d e Ex c e p t i o n s
Exceptions do sistema sem um nome
geradas devido a um erro no processamento do
SGBD ou do cdigo PL/ SQL; somente as mais
comuns possuem um nome

Definidas pelo programador sem um nome


procedimento RAISE_APPLICATION_ERROR
executado
o programador informa um nmero (-20000 a
20999) e uma mensagem de erro;
utilizada para facilitar a comunicao de erros do
ambiente cliente-servidor.

Ex c e p t i o n s d o s i s t e m a c o m u m n o m e
DECLARE
stmt INTEGER := 1;
designates 1st SELECT statement
BEGIN
SELECT ...
designates 2nd SELECT statement
stmt := 2;
SELECT ...
designates 3rd SELECT statement
stmt := 3;
SELECT ...
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO errors VALUES ( Error in statement || stmt);
...
END;

Ex c e p t i o n s Pr -De f i n i d a s
Exception Name
CURSOR_ALREADY_OPEN
DUP_VAL_ON_INDEX
INVALID_CURSOR
INVALID_NUMBER
LOGIN_DENIED
NO_DATA_FOUND
NOT_LOGGED_ON
PROGRAM_ERROR
ROWTYPE_MISMATCH
STORAGE_ERROR
TIMEOUT_ON_RESOURCE
TOO_MANY_ROWS
VALUE_ERROR
ZERO_DIVIDE

Oracle Error
ORA 06511
ORA 00001
ORA 01001
ORA 01722
ORA 01017
ORA 01403
ORA 01012
ORA 06501
ORA 06504
ORA 06500
ORA 00051
ORA 01422
ORA 06502
ORA 01476

SQLCODE Value
6511
1
1001
1722
1017
+100
1012
6501
6504
6500
51
1422
6502
1476

De f i n i d a s p e l o p r o g r a m a d o r c o m u m
nom e
Diferente das exceptions pr-definidas, as
exceptions definidas pelo programador
devem ser declaradas e devem ser
chamadas explicitamente atravs da
declarao:
RAISE

Definindo a Exception:
DECLARE
past_due EXCEPTION;
acct_num NUMBER(5);

Ex e m p l o
DECLARE
past_due EXCEPTION;
acct_num NUMBER;
BEGIN
...
DECLARE
incio do sub block
past_due EXCEPTION;
acct_num NUMBER;
BEGIN
...
IF ... THEN
RAISE past_due;
esta exception no
executada
END IF;
...
END;
fim do sub-block
EXCEPTION
WHEN past_due THEN
no usada
...
END;

EX CEPT I ON _I N I T p r a g m a
Pragma uma instruo especial ao
compilador
A EXCEPTION_INIT pragma indica que o
compilador deve associar um nome a uma
exception que possui um nmero
correspondente.

EX CEPT I ON _I N I T p r a g m a
Exemplo
ORA-2292 violated integrity constraining - child
record found
DECLARE
ainda_ha_empreg EXCEPTION;
PRAGMA EXCEPTION_INIT (ainda_ha_empreg, -2292);
BEGIN
DELETE FROM empresa;
EXCEPTION
WHEN ainda_ha_empreg THEN
DBMS_OUTPUT.PUT_LINE
( Ainda existem empregados para a empresa );
END;

U s a n d o r a i s e _a p p l i c a t i o n _e r r o r
A package DBMS_STANDARD, que vem
com o Oracle7, tem algumas facilidades
que ajudam a aplicao a interagir com o
Oracle. Por exemplo, a procedure
raise_application_error permite ao
programador definir uma mensagem de
erro ao seu modo.
continua...

U s a n d o r a i s e _a p p l i c a t i o n _e r r o r
raise_application_error(error_number,
message[, {TRUE | FALSE}]);
Onde error_number um inteiro negativo entre 20000 .. - 20999 e message uma string de
caracter com at 2048 bytes. Se o terceiro
parmetro TRUE, o erro colocado em uma
pilha de erros. Se o parmetro FALSE ( default ),
o erro substitui todos os erros anteriores.
A chamada a raise_application_error somente
pode ser feita de uma stored procedure. Quando
chamada, o subprograma encerrado e o
nmero do erro e a mensagem so retornados.

U s a n d o r a i s e _a p p l i c a t i o n _e r r o r
CREATE PROCEDURE raise_salary (emp_id NUMBER, increase NUMBER)
AS
current_salary NUMBER;
BEGIN
SELECT sal INTO current_salary FROM emp
WHERE empno = emp_id;
IF current_salary IS NULL THEN
/* Issue user defined error message. */
raise_application_error( 20101, Salary is missing );
ELSE
UPDATE emp SET sal = current_salary + increase
WHERE empno = emp_id;
END IF;
END raise_salary;

Se o Ex c e p t i o n
EXCEPTION
handler
WHEN exception_name1 THEN
sequence_of_statements1
WHEN exception_name2 THEN
another
handler
sequence_of_statements2
...
optional handler
WHEN OTHERS THEN
sequence_of_statements3
END;

U s a n d o SQL CODE e SQL ERRM


No tratamento de uma exception pode-se
usar as funes SQLCODE e SQLERRM
Para exceptions internas, o nmero do
SQLCODE negativo a menos que o erro
seja no_data_found que neste caso
+ 100.
O SQLERRM retorna a mensagem do
Oracle.

Ex e m p l o
DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);
INSERT INTO errors VALUES (err_num, err_msg);
END;

Ex e r c c i o I V .1
Altere o script do exerccio I.1, incluindo a
seo de exception (prevendo o caso em
que o nmero informado for menor que
zero).

Ex e r c c i o I V .2
Construa um script que faa uma consulta
simples base de dados (tabela scott.emp)
tomando como parmetro o nome do
funcionrio e retorne a sua matrcula.
Utilize o comando SELECT INTO
Pense na possibilidade do funcionrio no ser encontrado
Pense na possibilidade de existirem dois funcionrios com
o mesmo nome
Trate as demais exceptions de uma maneira genrica

Ex e r c c i o I V .3
Converta o script anterior (IV.2 - retorno
da matrcula do funcionrio dado um
nome) para uma procedimento (recebe o
nome, retorna a matrcula e um status
indicando se fez a recuperao com
sucesso, se no encontrou ou se existem
registros duplicados).
Armazene este procedimento no banco
(stored procedure).

T e s t e s e De p u r a o

Di r e t r i ze s d e De p u r a o
Encontrar o local onde ocorre o erro
Definir exatamente o problema
Reduzir o programa a um simples teste
Estabelecer um ambiente de teste

DB M S_OU T PU T
Pacote para mostrar mensagens
Procedure Descrio
enable
disable
put_line
get_line
get_lines

Habilita o buffer de mensagens.


No SQL*Plus pode-se usar SET SERVEROUTPUT ON
Desabilita o buffer de mensagens
Imprime uma linha no buffer
Obtm uma linha do buffer (dentro do bloco PL/SQL)
Obtm todas as linhas do buffer (dentro do bloco PL/SQL)

Ex e m p l o d e DB M S_OU T PU T
BEGIN
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LINE( Incio );
...
DBMS_OUTPUT.PUT_LINE( Fim );
END;

Pr o c e d u r e B u i l d e r
Ambiente de desenvolvimento de PL/ SQL
Serve como depurador de cdigo PL/ SQL
No pode depurar stored procedures,
somente chamar

PL /SQL I n t e r p r e t e r
Visualizador
Mostra o bloco, procedimento ou funo que
est sendo executado

Linha de comandos
Permite execuo imediata de instrues de
PL/ SQL

Fa c i l i d a d e s
Depurar sem necessidade de alterar o
cdigo
Insero de breakpoints
Visualizao e alterao dos valores das
variveis locais

Depurao mais simples


Ambiente de desenvolvimento integrado

PL /SQL Di n m i c o

DB M S_SQL
A instruo SQL pode ser montada
dinamicamente dentro do bloco
Processa trs tipos de instrues
instrues de DML e DDL
consultas
blocos de PL/ SQL annimos

Instrues SELECT no devem possuir a


clusula INTO
No incluir ponto e vrgula no final, exceto
blocos PL/ SQL annimos

DB M S_SQL .OPEN _CU RSOR


Abre o cursor para executar a instruo
SQL atribuindo um ID para o cursor que
ser utilizado nas chamadas
subsequentes.
Sintaxe:
FUNCTION OPEN_CURSOR RETURN INTEGER;

DB M S_SQL .PA RSE


Anlise da instruo
Verificao da sintaxe e semntica da
instruo
Se for uma consulta, determina o plano de
execuo

Sintaxe
PROCEDURE PARSE (cursor_id IN INTEGER,
instruo IN VARCHAR2,
indicador_linguagem IN
INTEGER);

onde indicador_linguagem pode ser V6, V7 ou


NATIVE.

DB M S_SQL .B I N D_V A RI A B L E
Associao de variveis de entrada de
dados variveis reais do bloco PL/ SQL
Sintaxe
PROCEDURE BIND_VARIABLE
(cursor_id IN INTEGER,
:nome_na_instruo IN
VARCHAR2,
valor_para_atribuir IN tipo_dado);

onde tipo_dado pode ser NUMBER,


VARCHAR2 ou DATE.

H variaes para os demais tipos de


dado

DB M S_SQL .DEFI N E_COL U M N


Associao de variveis de sada de dados
(resultado de uma consulta) variveis
reais do bloco PL/ SQL
Sintaxe
PROCEDURE DEFINE_COLUMN
(cursor_id IN INTEGER,
posio_coluna IN INTEGER,
nome_coluna IN tipo_dado);

Uma instruo para cada coluna da


consulta

DB M S_SQL .EX ECU T E


Para no consulta
executa a instruo e retorna o nmero de
linhas processadas

Para consulta
determina o conjunto de linhas a serem
processadas

Sintaxe
FUNCTION EXECUTE (cursor_id IN INTEGER)
RETURN INTEGER;

O retorno corresponde s linhas processadas


somente se forem instrues INSERT,
UPDATE ou DELETE.

DB M S_SQL .FET CH _ROWS


Somente usado em consultas
Faz o fetch buscando os dados no
servidor
Os dados de retorno so convertidos nos
tipos definidos com DEFINE_COLUMN
Sintaxe
FUNCTION FETCH_ROWS (cursor_id IN INTEGER)
RETURN INTEGER;

O retorno o nmero de linhas.

DB M S_SQL .EX ECU T E_A N D_FET CH


Combina as operaes de EXECUTE e a
primeira chamada de FETCH_ROWS
Sintaxe
FUNCTION EXECUTE_AND_FETCH
(cursor_id IN INTEGER,
busca_exata IN BOOLEAN DEFAULT FALSE)
RETURN INTEGER;
Se busca_exata for TRUE e a consulta retornar

mais de uma linha, abre a exception


TOO_MANY_ROWS.
O retorno o nmero de linhas.

DB M S_SQL .V A RI A B L E_V A L U E
Determina o valor de uma varivel de
associao, se for modificada pela
instruo (parmetros de sada)
Utilizado quando a instruo um bloco
PL/ SQL
Sintaxe
PROCEDURE VARIABLE_VALUE
(cursor_id IN NUMBER,
:nome_na_instruo IN VARCHAR2,
valor_variavel OUT tipo_dado);

DB M S_SQL .COL U M N _V A L U E
Somente usado em consultas, aps
FETCH_ROWS

Devolve realmente os dados


Variveis devem ser do mesmo tipo
definido em DEFINE_COLUMN
Sintaxe
PROCEDURE COLUMN_VALUE
(cursor_id IN INTEGER,
posio_coluna IN INTEGER,
valor_coluna OUT tipo_dado);

DB M S_SQL .CL OSE_CU RSOR


Fecha o cursor
Libera os recursos utilizados pelo cursor
Sintaxe
PROCEDURE CLOSE_CURSOR
(cursor_id IN OUT INTEGER)

Ex e c u t a r i n s t r u e s DM L (e x c e t o
c onsult as)
Passos necessrios:
Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE)
Associar quaisquer variveis de entrada de
dados (BIND_VARIABLE)
Executar a instruo (EXECUTE)
Fechar o cursor (CLOSE_CURSOR)

Ex e c u t a r i n s t r u e s DDL
Passos necessrios:
Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE)
Fechar o cursor (CLOSE_CURSOR)

No pode utilizar bind variables em DDL


As instrues so executadas j no
PARSE, no necessitando, assim, de
EXECUTE

Ex e c u t a r c o n s u l t a s
Passos necessrios:
Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE)
Associar quaisquer variveis de entrada de dados
(BIND_VARIABLE)
Definir variveis de sada de dados
(DEFINE_COLUMN)
Executar a consulta (EXECUTE)
Extrair as linhas (FETCH_ROWS)
Devolver os resultados s variveis PL/ SQL
(COLUMN_VALUE)
Fechar o cursor (CLOSE_CURSOR)

Ex e c u t a r PL /SQL
Passos necessrios:
Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE)
Associar quaisquer variveis de entrada de
dados (BIND_VARIABLE)
Executar a instruo (EXECUTE)
Obter o valor de quaisquer variveis de sada
de dados (VARIABLE_VALUE)
Fechar o cursor (CLOSE_CURSOR)

N o v a s f a c i l i d a d e s PL /SQL 8 .0
Capacidade de analisar cadeias de
caracteres de SQL de grandes dimenses
Processamento matricial
Associar e definir tipos Oracle8 (objetos,
LOBs)
Procedimento DESCRIBE_COLUMNS

Su g e s t e s e T c n i c a s
Reutilizar cursores
Um cursor aberto pode processar instrues
SQL diferentes
Instrues repetidas no necessitam repetir o
PARSE, apenas o EXECUTE

Permisses
Os perfis de grupo so desativados em
procedimentos empacotados, incluindo o
DBMS_SQL

Operaes de DDL e lock

En t r a d a e Sa d a e m A r q u i v o s

PL /SQL I /O e m A r q u i v o s OS
A release 7.3 do Oracle Server adiciona a
capacidade de se fazer I/ O atravs da package
UTL_FILE.
Isto similar quelas operaes padres em
arquivos de sistemas operacionais (OPEN, GET,
PUT, CLOSE) com algumas limitaes.
Por exemplo, pode-se chamar a funo FOPEN
para retornar um arquivo aberto, no qual as
chamadas subsequentes aos comandos
GET_LINE ou PUT so executados nos arquivos.
Enquanto no se fechar o arquivo (FCLOSE) as
operaes de I/ O no estaro completas.

Pr o c e d u r e s d a Pa c k a g e U T L _FI L E
Function/Procedure
FOPEN
IS_OPEN
FCLOSE
FCLOSE_ALL
GET_LINE
PUT
PUT_LINE
PUTF
NEW_LINE
FFLUSH

Description
Abre um arquivo para entrada e sada
Cria um arquivo de sada se ele no existir
Determina se um arquivo est aberto
Fecha um arquivo
Fecha todos os arquivos abertos
L uma linha texto de um arquivo aberto.
Escreve uma linha no arquivo.
No adiciona um caracter de terminao (EOL)
Escreve uma linha no arquivo.
Adiciona um caracter de terminao
Procedure com formatao.
Escreve uma ou mais linhas de terminao no arquivo.
Escreve fisicamente todas as linhas pendentes para
o arquivo de sada.

Se g u r a n a
O diretrio de acesso dos arquivos deve
ser especificado em um parmetro de
inicializao no arquivo INIT.ORA
UTL_FILE_DIR = < directory name>

A especificao do parmetro:
UTL_FILE_DIR = *

torna sem efeito a segurana

De c l a r a o d e T i p o s
A especificao para a package UTL_FILE
declarada no tipo:
TYPE file_type IS RECORD (id
BYNARY_INTEGER)
Exemplo:
v_filehandle UTL_FILE.FILE_TYPE;
...
v_filehandle := UTL_FILE.FOPEN(...);
...

Ex c e p t i o n s
Exception Name
INVALID_PATH
INVALID_MODE
INVALID_FILEHANDLE
INVALID_OPERATION
READ_ERROR
WRITE_ERROR
INTERNAL_ERROR

Descrio
Localizao ou nome do arquivo invlido
Modo de abertura do arquivo invlido.
Arquivo Invlido.
Arquivo no pode ser aberto.
Um erro de sistema operacional
ocorreu durante leitura.
Um erro de sistema operacional ocorreu
durante a escrita..
Um erro no especificado ocorreu no PL/SQL.

FOPEN
Sintaxe:
FUNCTION FOPEN(location IN VARCHAR2,
filename IN VARCHAR2,
open_mode IN
VARCHAR2)
RETURN UTL_FILE.FILE_TYPE;

FOPEN

Parmetros
location
filename
open_mode

Descrio
Diretrio
Nome do Arquivo
r ler um texto (GET_LINE)
w escrever um texto
(PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH)
a adicionar um texto
(PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH)

Re t o r n o d a Fu n o FOPEN
FOPEN retorna um file handle que deve
ser passado para todas as procedures
chamadas posteriormente.

I S_OPEN
Sintaxe:
FUNCTION IS_OPEN(file_handle IN
FILE_TYPE)
RETURN BOOLEAN;
Parmetro
file_handle

Descrio
Um file handle ativo retornado na funo FOPEN

FCL OSE
Sintaxe:
PROCEDURE FCLOSE (file_handle IN OUT
FILE_TYPE);
Parmetro
file_handle

Descrio
Um file handle ativo retornado na funo FOPEN

FCL OSE_A L L
Sintaxe:
PROCEDURE FCLOSE_ALL;

GET _L I N E
Sintaxe:
PROCEDURE GET_LINE
(file_handle IN FILE_TYPE,
buffer OUT VARCHAR2);
Parmetro
file_handle
buffer

Descrio
Um file handle ativo retornado na funo FOPEN
Um buffer para receber a linha lida do arquivo.

PU T
Sintaxe:
PROCEDURE PUT
(file_handle IN FILE_TYPE,
buffer IN VARCHAR2);
Parmetro
file_handle
buffer

Descrio
Um file handle ativo retornado na funo FOPEN
Um buffer que contm a linha a ser escrita.

N EW_L I N E
Sintaxe:
PROCEDURE NEW_LINE
(file_handle IN FILE_TYPE,
lines IN NATURAL := 1);
Parametro
file_handle
lines

Descrio
Um file handle ativo retornado na funo FOPEN
Nmero de linhas de terminao a serem
escritas no arquivo.

PU T _L I N E
Sintaxe:
PROCEDURE PUT_LINE
(file_handle IN FILE_TYPE,
buffer IN VARCHAR2);
Parmetro
file_handle
buffer

Descrio
Um file handle ativo retornado na funo FOPEN
Um buffer que contem a linha a ser escrita.

FFL U SH
Sintaxe:
PROCEDURE FFLUSH
(file_handle IN FILE_TYPE);
Parmetro
file_handle

Descrio
Um file handle ativo retornado na funo FOPEN

Ex e m p l o
PROCEDURE file_to_table
(loc_in IN VARCHAR2, file_in IN VARCHAR2,
table_in IN names_tabtype)
IS
names_file CONSTANT UTL_FILE.FILE_TYPE :=
UTL_FILE.FOPEN (loc_in, file_in, R );
line_counter INTEGER := 1;
BEGIN
LOOP
UTL_FILE.GET_LINE(names_file,
table_in(line_counter));
line_counter := line_counter + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
UTL_FILE.FCLOSE(names_file);
END;

De s e m p e n h o e Ot i m i za o

I n s t n c i a Or a c l e
SGA: Sistem Global Area
Shared Pool
Armazena instrues SQL recebidas do BD
Triggers
manter o cdigo o mais pequeno possvel, atravs
de chamadas de subprogramas armazenados
antes da verso 7.3 os triggers no eram
armazenados de forma compilada

Ot i m i za o d e i n s t r u e s SQL
Explain Plan
Tabela plan_table
Pode ser criada localmente atravs de
$ORACLE_HOME\ rdbms\ admin\ utlxplan.sql

No SQL* Plus
SET AUTOTRACE ON
Aps cada instruo faz automaticamente o
explain plan

Ot i m i za o d e i n s t r u e s SQL
Tkprof
ALTER SESSION SET SQL_TRACE= TRUE
gera um arquivo de log de todas as instrues
SQL, no formato ora_nnnnn.trc

Aps todos os comandos efetuados, fechar o


arquivo de log, alterando para FALSE
Executar tkprof para formatar o arquivo .trc

A n l i s e d e Re s u l t a d o s
NESTED LOOP
Operao necessria para executar os joins
de tabelas

TABLE ACCESS (FULL)


Pesquisa integral, buscando todas as linhas
da tabela

TABLE ACCESS (BY ROWID)


Modo mais rpido de buscar uma s linha
INDEX: { UNIQUE | RANGE} SCAN

Tc nic as
Verificar questes de rede
Utilizar PL/ SQL no Client sempre que
possvel
Evitar repeties de parse desnecessrias
Interface matricial Oracle
permite grandes quantidades de dados
enviados pela rede como uma unidade

Você também pode gostar