Você está na página 1de 40

CENTRO DE TREINAMENTO

BANCO DE DADOS ORACLE

PL/SQL
Aula 04 - Exceções, Procedures e
Functions

Profª. Lucia Contente Mós

lcm.lucia@ig.com.br

Banco de Dados 1 PL/SQL


Tratando Exceções com
Código PL/SQL
– O que é uma exceção?
Identificador em PL/SQL que é criado durante a execução
– Como a exceção é criada?
» Quando ocorre um erro do Oracle.
» Quando você a cria explicitamente.
– Como você trata a exceção?
» Capture-a com um handler.
» Propaga-a para o ambiente de chamada.

Banco de Dados 2 PL/SQL


Tratando Exceções
 Capturar a exceção Propagar a exceção

DECLARE DECLARE

BEGIN BEGIN
A exceção A exceção
é criada é criada
EXCEPTION EXCEPTION

A exceção A exceção não é


é capturada END; END; capturada

A exceção propaga para


o ambiente de chamada

Banco de Dados 3 PL/SQL


Tipos de Exceção

– Predefinida pelo Oracle Server


– Não predefinida pelo
Oracle Server } Criada
implicitamente

– Definida pelo usuário Criada explicitamente

Banco de Dados 4 PL/SQL


Capturando Erros Predefinidos
do Oracle Server
– Fazer referência ao nome padrão na rotina de tratamento de
exceção.
– Exceções predefinidas de exemplo:
» NO_DATA_FOUND
» TOO_MANY_ROWS
» INVALID_CURSOR
» ZERO_DIVIDE
» DUP_VAL_ON_INDEX

Banco de Dados 5 PL/SQL


Exceção Predefinida
Sintaxe

BEGIN
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;

WHEN TOO_MANY_ROWS THEN


statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;

Banco de Dados 6 PL/SQL


Exceções Predefinidas pelo
Oracle Server - Exemplos 1 e 2
ACCEPT p_nome PROMPT ‘Digite o nome do funcionário ...’
DECLARE
v_nome emp.ename%type := ‘&p_nome’;
v_ename emp.ename%type;
v_sal emp.sal%type;
BEGIN
SELECT ename, sal
INTO v_ename, v_sal
FROM emp
WHERE job = 'CLERK' and ename = v_nome;
EXCEPTION
when NO_DATA_FOUND then
DBMS_OUTPUT.PUT_LINE('NENHUM REGISTRO FOI ENCONTRADO.');
when TOO_MANY_ROWS then
DBMS_OUTPUT.PUT_LINE('MUITOS FUNCIONÁRIOS POSSUEM ESTE CARGO.');
when OTHERS then
DBMS_OUTPUT.PUT_LINE('ERRO DESCONHECIDO.' );
END;
/

Banco de Dados 7 PL/SQL


Diretrizes para a Captura
de Exceções

– WHEN OTHERS é a última cláusula.


– A palavra-chave EXCEPTION inicia a seção de tratamento de
exceções.
– São permitidos vários handlers de exceção.
– Somente um handler é processado antes de se sair do bloco.

Banco de Dados 8 PL/SQL


Capturando Exceções
Sintaxe

EXCEPTION
WHEN exceção1 [OR exceção2 . . .] THEN
instrução1;
instrução2;
. . .
[WHEN exceção3 [OR exceção4 . . .] THEN
instrução1;
instrução2;
. . .]
[WHEN OTHERS THEN
instrução1;
instrução2;
. . .]

Banco de Dados 9 PL/SQL


Funções para Captura de
Exemplo Exceções
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM
SQLERRM ;
INSERT INTO errors
VALUES(v_error_code, v_error_message);
END;

Banco de Dados 10 PL/SQL


Funções para Captura
de Exceções

– SQLCODE
Retorna o valor numérico do código de erro
– SQLERRM
Retorna a mensagem associada ao número de erro

Banco de Dados 11 PL/SQL


Capturando o Erro - Exemplo 3
Create table erros (codigo_erro number, mensagem_erro varchar2(100));
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
v_sal emp.sal%type;
BEGIN
Select avg(sal)
Into v_sal
From emp
Group by deptno;
EXCEPTION
WHEN OTHERS THEN
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO erros
VALUES(v_error_code, v_error_message);
END;
/
select * from erros;

Banco de Dados 12 PL/SQL


Capturando Exceções
Definidas pelo Usuário

Declarar Criar Referência

Seção Seção Seção de tratamento


declarativa executável de exceção

• Nomeie a • Crie explicitamente • Trate a


exceção a exceção usando a exceção
instrução RAISE criada

Banco de Dados 13 PL/SQL


Exceção Definida pelo Usuário
Exemplo
DECLARE
EXCEPTION;
e_invalid_product EXCEPTION; 1
BEGIN
UPDATE product
SET descrip = '&product_description'
WHERE prodid = &product_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_product; 2
END IF;
COMMIT;
EXCEPTION
e_invalid_product THEN
WHEN e_invalid_product 3
DBMS_OUTPUT.PUT_LINE('Invalid product number.');
END;

Banco de Dados 14 PL/SQL


Exceção definida pelo usuário -
Exemplo 4
DECLARE
e_depto_invalido EXCEPTION;
v_deptno dept.deptno%type := &p_deptno;

BEGIN
update dept set loc = '&p_local‘
where deptno = v_deptno;
IF sql%notfound then
raise e_depto_invalido;
end if;

EXCEPTION
when e_depto_invalido then
dbms_output.put_line('departamento ' || v_deptno || ' não cadastrado.');
END;
/

Banco de Dados 15 PL/SQL


Capturando Erros Não
Predefinidos do Oracle Server

Declarar Associar Referência

Seção declarativa Seção de tratamento


de exceção

• Nomeie a • Codifique o PRAGMA • Trate a


exceção EXCEPTION_INIT exceção
criada

Banco de Dados 16 PL/SQL


PRAGMA_EXECEPTION_INIT

 Em PL/SQL, o PRAGMA EXCEPTION_INIT


informa o compilador para associar um nome de
exceção a um número de erro do Oracle.

Banco de Dados 17 PL/SQL


Erro Não Predefinido
Capturarpor número de erro do Oracle Server –
2292, uma violação de restrição de integridade.
DECLARE
e_emps_remaining EXCEPTION;
e_emps_remaining EXCEPTION; 1
PRAGMA
PRAGMA EXCEPTION_INIT
EXCEPTION_INIT ((
e_emps_remaining,-2292);
e_emps_remaining, -2292); 2
v_deptno dept.deptno%TYPE := &p_deptno;
BEGIN
DELETE FROM dept
WHERE deptno = v_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN 3
DBMS_OUTPUT.PUT_LINE ('Cannot remove dept ' ||
TO_CHAR(v_deptno) || '. Employees exist. ');
END;

Banco de Dados 18 PL/SQL


Exceção
Exceção definida
definida pelo
pelo usuário
usuário associada
associada aa um
um erro
erro do
do Oracle
Oracle --
Exemplo
Exemplo 55

DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT ( e_emps_remaining, -2292);
v_deptno dept.deptno%TYPE := &p_deptno;
BEGIN
DELETE FROM dept
WHERE deptno = v_deptno;
COMMIT;

EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE ('Não pode excluir o departamento ' ||
v_deptno || '. Empregados existem. ');
END;
/

Banco de Dados 19 PL/SQL


Procedimento
RAISE_APPLICATION_ERROR
Sintaxe

raise_application_error (error_number,
mensagem[, {TRUE | FALSE}]);
– Um procedimento que permite que você emita mensagens de
erro definidas pelo usuário a partir de subprogramas
armazenados
– Chamado somente a partir de um subprograma armazenado
em execução

Banco de Dados 20 PL/SQL


Retornando
Retornando uma
uma mensagem
mensagem de de erro
erro não
não
padronizada.
padronizada. -- Exemplo
Exemplo 66
ACCEPT p_mgr PROMPT ‘Digite o código do gerente ...’

DECLARE

V_mgr emp.mgr%type ;

BEGIN

V_mgr := &p_mgr;
DELETE FROM emp
WHERE mgr = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,'Este não é um gerente válido');
END IF;
END;
/

Banco de Dados 21 PL/SQL


PL/SQL - Procedimento
Procedimento

 Um procedimento é um conjunto de instruções que


realiza determinada tarefa.

Banco de Dados 22 PL/SQL


PL/SQL - Procedimento
Procedimento
A confecção de procedimentos envolve
basicamente os passos de:

 Identificação do procedimento
 Definição dos parâmetros ou
parâmetro
 Conjunto de instruções do
procedimento
 Submissão do código ao SGBDR

Banco de Dados 23 PL/SQL


PL/SQL - Procedimento
Procedimento

Após a confecção do procedimento:

O código fonte é armazenado no dicionário de


dados
 O procedimento é compilado
 se a compilação for bem sucedida o P-code é
armazenado no dicionário de dados e não
pode ser consultado
 se ocorrerem erros de compilação, estes
serão armazenados no USER_ERRORS

Banco de Dados 24 PL/SQL


PL/SQL - Procedimento
Procedimento
Sintaxe:
 
CREATE [ OR REPLACE] nome_procedimento
[parâmetro [{in, out, in out}]
tipo_parâmetro,
...
{IS ou AS}
 BEGIN
corpo_do_procedimento

END [nome_procedimento];

Banco de Dados 25 PL/SQL


Parâmetros de entrada (IN) -
Exemplo 7

CREATE OR REPLACE PROCEDURE reajuste


(v_codigo_emp IN emp.empno%type, v_porcentagem IN number)
IS 
BEGIN
UPDATE emp
SET sal = sal + (sal *( v_porcentagem / 100 ) )
where empno = v_codigo_emp;
COMMIT;
END reajuste;
/

select sal from emp where empno=7369;


execute reajuste (7369,10);
select sal from emp where empno=7369;

Banco de Dados 26 PL/SQL


Parâmetros
Parâmetros de
de saída
saída (OUT)
(OUT) --
Exemplo
Exemplo 88

CREATE OR REPLACE PROCEDURE


consulta_emp
(p_id in emp.empno%type, p_nome out emp.ename
%type, p_salario out emp.sal%type)
IS
BEGIN
select ename, sal
into p_nome, p_salario
from emp
where empno = p_id;
END consulta_emp;
/

Banco de Dados 27 PL/SQL


Parâmetros
Parâmetros de
de saída
saída (IN/OUT)
(IN/OUT) --
Exemplo
Exemplo 99
Create or replace procedure formata_fone
(p_fone in out varchar2)
is
BEGIN
P_fone := ‘(‘ || substr(p_fone, 1, 3) ||
‘)’ || substr(p_fone, 4, 3) ||
‘-’ || substr(p_fone, 7);
END formata_fone;
/

Banco de Dados 28 PL/SQL


Passagem de parâmetros

Por posição: Os parâmetros reais são listados de


acordo com a ordem dos parâmetros formais.

Por identificação: Os parâmetros reais são precedidos


da identificação do parâmetro formal, podendo ser
listados arbitrariamente.

Combinada: Os parâmetros passados por posição


devem ocupar os primeiros lugares da lista.

Banco de Dados 29 PL/SQL


Passagem de Parâmetros -
Por Posição - Exemplo 10
Create sequence deptno_seq;

Create or replace procedure incluir_dept


(p_nome in dept.dname%type, p_loc in dept.loc%type default ‘NC’)
IS
BEGIN
Insert into dept(deptno, dname, loc) values(deptno_seq.nextval, p_nome, p_loc);
end incluir_dept;
/
execute incluir_dept;
execute incluir_dept(‘Comercial’,’São Paulo’);
select * from dept; 

Banco de Dados 30 PL/SQL


Passagem de Parâmetros -
Por Identificação - Exemplo 11

SQL> EXECUTE Incluir_dept( p_loc =>


‘SP’, p_nome => ‘Treinamento’);
os parâmetros reais são precedidos da
identificação dos parâmetros formais e do sinal
de atribuição =>

Banco de Dados 31 PL/SQL


Passagem de Parâmetros -
Por Combinação - Exemplo 12

SQL> EXECUTE Incluir_dept(p_loc =>


‘RJ’); os parâmetros que não estão listados
receberão os valores defaut.
 

Banco de Dados 32 PL/SQL


Aninhamento de procedimentos
 Pode-se criar um procedimento dentro de outro
procedimento, este recurso é chamado, também, de
procedimentos em níveis.

Banco de Dados 33 PL/SQL


Exemplo 13
CREATE OR REPLACE PROCEDURE exemplo_sub (p_id in
emp.empno%type)
IS
PROCEDURE log_usuario
IS
BEGIN
Insert into log_tabela (user_id, log_data)
Values(user, sysdate);
END log_usuario;
BEGIN
Delete from emp
Where empno = p_id;
Log_usuario;
END exemplo_sub;
/
Banco de Dados 34 PL/SQL
PL/SQL - Função
Função

 Uma Função também é um conjunto de instruções


que realiza determinada tarefa, mas difere do
procedimento pois sempre tem um retorno.

Banco de Dados 35 PL/SQL


PL/SQL - função
função

A confecção de funções envolve


basicamente os passos de:

 Identificação da função
 Definição dos parâmetros ou
parâmetro
 Conjunto de instruções do função
 Submissão do código ao SGBDR

Banco de Dados 36 PL/SQL


PL/SQL - Função
Função

Após a confecção do Função:

O código fonte é armazenado no dicionário de


dados
 O Função é compilado
 se a compilação for bem sucedida o P-code é
armazenado no dicionário de dados e não
pode ser consultado
 se ocorrerem erros de compilação, estes
serão armazenados no USER_ERRORS

Banco de Dados 37 PL/SQL


PL/SQL - Função
Função
Sintaxe:
 CREATE [ OR REPLACE] nome_Função
[parâmetro [in}] tipo_parâmetro,
...
{IS ou AS}
 BEGIN
corpo_da_Função
END [nome_Função];

Banco de Dados 38 PL/SQL


Exemplo 14
CREATE OR REPLACE FUNCTION descobrir_salario
(p_id in emp. Empno%type)
return number
IS
v_salario emp.sal%type := 0;
BEGIN
Select sal into v_salario
From emp
Where empno = p_id;
Return v_salario;
End descobrir_salario;
/

Banco de Dados 39 PL/SQL


Resumo das diferenças entre
procedure e function

Procedure Function
É chamada em uma declaração SQL, É chamada como parte de uma
blocos PL/SQL ou por uma aplicação expressão
Não contém a clausula return no Contém a clausula return no cabeçalho
cabeçalho
Pode retornar nenhum, um ou vários Retorna somente um valor
valores
Pode devolver um retorno à rotina Retorna obrigatoriamente um valor para
chamadora a rotina chamadora.

Banco de Dados 40 PL/SQL

Você também pode gostar