Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila PLSQL Datainfo-Libre
Apostila PLSQL Datainfo-Libre
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
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
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;
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
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.
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
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
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
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> >
...
Co m a n d o GOT O
Rtulo destino deve estar no mesmo escopo
que o comando GOTO.
IF, BEGIN, Loop, mdulo.
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
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
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
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
L o o p Si m p l e s
LOOP
< comandos>
END LOOP;
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;
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
L o o p WH I L E
WHILE < condio>
LOOP
< comandos>
END LOOP;
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
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.
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.
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 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
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;
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
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;
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
CONCAT
INITCAP
INSTR
LENGTH
LOWER
LPAD
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(
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
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)
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)
SQRT
TRUNC(a, [b])
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
UID
USER
USERENV
VSIZE
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
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
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
SUM
VARIANCE
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;
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 ...] ) ] ;
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
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);
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
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
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
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;
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
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
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)
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
DBMS_JOB
DBMS_SNAPSHOT
DBMS_SQL
UTL_FILE
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.
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;
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
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
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;
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
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
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
Sintaxe
PROCEDURE PARSE (cursor_id IN INTEGER,
instruo IN VARCHAR2,
indicador_linguagem IN
INTEGER);
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);
Para consulta
determina o conjunto de linhas a serem
processadas
Sintaxe
FUNCTION EXECUTE (cursor_id IN INTEGER)
RETURN INTEGER;
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
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)
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
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 = *
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
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
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