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 Dgitos Sm bolos

Caracteres A-Z, a-z 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 ; % _ : ** < > e != || << e >> <= e >= := => -/* e * / 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 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 de Declarao Seo de Declarao BEGIN Seo de Execuo Seo de Execuo EXCEPTION Seo de Exceptions Seo de Exceptions END;

Se e s d e u m B l o c o Blocos Annimos
No possuem nome
DECLARE Seo de Declarao Seo de Declarao BEGIN Seo de Execuo Seo de Execuo EXCEPTION Seo de Exceptions Seo de 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 ANSI, IBM ANSI ANSI, IBM ANSI ANSI, IBM NUMBER(prec, esc) NUMBER 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 1..10 LOOP ... END LOOP; FOR ind_calc IN ini_periodo .. LEAST(fim_periodo, periodo_atual) LOOP ... END LOOP; FOR contador IN REVERSE 1..10 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 CHR CONCAT INITCAP INSTR LENGTH LOWER LPAD Descrio retorna o cdigo ASCII de um caractere retorna o caractere associado ao cdigo ASCII concatena duas strings transforma a primeira letra de cada palavra em maiscula retorna a localizao em uma string da substring especificada retorna o tamanho da string converte todas as letras para minsculas 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 EXP(n) FLOOR LN(a) LOG(a, b) MOD(a, b) 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 e elevado n-sima potncia maior inteiro menor ou igual ao nmero logaritmo natural de a. 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) SIGN(a) SQRT TRUNC(a, [b])

Descrio a elevado b-sima potncia retorna a arredondado em b casas decimais retorna 1 se a > 0, 0 se a = 0 e -1 se a < 0 raiz quadrada de um nmero a truncado at b casas decimais

Ou t r a s Fu n e s
Nome DECODE DUMP GREATEST LEAST NVL SQLCODE SQLERRM UID USER USERENV VSIZE 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 retorna a mensagem de erro do Oracle para a exception mais recente retorna o User ID da sesso corrente no Oracle 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 AVG COUNT MAX MIN STDDEV SUM VARIANCE Descrio 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 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 %FOUND Descrio 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 cursor OPEN cursor FETCH reg1 FETCH reg1 FETCH reg2 FETCH reg2 FETCH reg3 FETCH reg3 CLOSE cursor CLOSE 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 )

DECLARE Seo de Declarao Seo de Declarao BEGIN Seo de Execuo Seo de Execuo EXCEPTION Seo de Exceptions Seo de Exceptions END; IS

Cabealho Cabealho Seo de Declarao Seo de Declarao BEGIN Seo de Execuo Seo de Execuo EXCEPTION Seo de Exceptions Seo de 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 )
escopo de escopo de data_contratacao data_contratacao

DECLARE DECLARE data_contratacao DATE; data_contratacao DATE; BEGIN BEGIN DECLARE DECLARE total_vendas NUMBER; total_vendas NUMBER; BEGIN BEGIN

escopo de escopo de total_vendas total_vendas

END; END; END; END;

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
CREATE PACKAGE emp_actions AS specification 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; initialize(hiredate_tab, indx); calls first version initialize(comm_tab, indx); calls second version ... 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 DBMS_DDL DBMS_JOB DBMS_OUTPUT DBMS_SNAPSHOT DBMS_SQL UTL_FILE Descrio execuo de comandos DDL submete e gerencia jobs programados dentro do database mostra sadas de programas PL/SQL no terminal gerenciamento de snapshots construo de SQLs dinmicos permite que programas PL/SQL leiam e escrevam em arquivos

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 ... stmt := 2; designates 2nd SELECT statement SELECT ... stmt := 3; designates 3rd SELECT statement 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 WHEN exception_name1 THEN handler sequence_of_statements1 WHEN exception_name2 THEN another handler sequence_of_statements2 ... WHEN OTHERS THEN optional handler 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