Escolar Documentos
Profissional Documentos
Cultura Documentos
3
Fundamentos das Exceções com PL/SQL
4
O Que É uma Exceção?
5
Tratando a Exceção: Exemplo
6
Tratando Exceções
A
exceção
foi inter- Encerre
ceptada? Não abruptamente.
Sim
Encerre
normalmente.
7
Tipos de Exceções
8
Sintaxe para Interceptar Exceções
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
9
Diretrizes para Interceptar Exceções
10
Interceptando Erros Predefinidos do Servidor Oracle
11
Interceptando Erros Não
Predefinidos do Servidor Oracle
Fazer
Declarar Associar
Referência
12
Funções para Interceptar Exceções
13
Interceptando Exceções Definidas pelo Usuário
14
Procedure RAISE_APPLICATION_ERROR
Sintaxe:
raise_application_error (error_number,
message[, {TRUE | FALSE}]);
15
Procedure RAISE_APPLICATION_ERROR
16
Visão Geral de Funções Armazenadas
Uma função:
• É um bloco PL/SQL nomeado que
retorna um valor
• Pode ser armazenada no banco de
dados como um objeto de esquema para
execuções repetidas
• É chamada como parte de uma
expressão ou usada para fornecer um
valor de parâmetro para outro
subprograma
• Pode ser agrupada em pacotes PL/SQL
17
Criando Funções
18
A Diferença entre
Procedures e Funções
Procedures Funções
São executados como uma instrução São chamadas como parte de uma
PL/SQL expressão
Podem conter uma instrução RETURN Devem conter pelo menos uma instrução
sem um valor RETURN
19
Criando e Executando Funções: Visão Geral
SIM
Usar o comando
SHOW ERRORS
no SQL*Plus
Criar ou Advertências ou erros Exibir
editar função do compilador? advertências
ou erros
NÃO do compilador
Usar as views
USER/ALL/DBA_ERRORS
Chamar função 20
Criando e Chamando uma Função Armazenada
Usando a Instrução CREATE FUNCTION: Exemplo
CREATE OR REPLACE FUNCTION pega_sal
(p_id empregadon.cd_empregado%TYPE) RETURN NUMBER IS
v_sal empregadon.vl_salario%TYPE := 0;
BEGIN
SELECT vl_salario
INTO v_sal
FROM empregadon
WHERE cd_empregado = p_id;
RETURN v_sal;
END pega_sal;
/
EXECUTE dbms_output.put_line(pega_sal(100))
21
Usando Diferentes Métodos para Executar Funções
SET SERVEROUTPUT ON
DECLARE
sal empregadon.vl_salario%type;
BEGIN
sal := pega_sal(100);
DBMS_OUTPUT.PUT_LINE('O salário é: '|| sal);
END;
/
22
Usando Diferentes Métodos para Executar Funções
EXECUTE dbms_output.put_line(pega_sal(100))
23
Vantagens das Funções Definidas pelo Usuário
em Instruções SQL
• Ampliam o alcance da linguagem SQL quando as
atividades são muito complexas ou não estão disponíveis
em SQL
• Aumentam a eficiência quando usadas na cláusula WHERE
para filtrar os dados, em vez de filtrá-los na aplicação
• Manipulam valores de dados
24
Usando uma Função em uma Expressão SQL:
Exemplo
CREATE OR REPLACE FUNCTION taxa(p_value IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (p_value * 0.08);
END taxa;
/
25
Chamando Funções Definidas pelo Usuário
em Instruções SQL
As funções definidas pelo usuário atuam como funções
incorporadas de apenas uma linha e podem ser usadas nos
seguintes locais:
• Na lista ou na cláusula SELECT de uma consulta
• Em expressões condicionais das cláusulas WHERE
e HAVING
• Nas cláusulas CONNECT BY, START WITH, ORDER BY,
e GROUP BY de uma cláusula
• Na cláusula VALUES da instrução INSERT
• Na cláusula SET da instrução UPDATE
26
Restrições à Chamada de Funções
em Expressões SQL
• As funções definidas pelo usuário que podem ser
chamadas em expressões SQL devem:
– Ser armazenadas no banco de dados
– Aceitar apenas parâmetros IN com tipos de dados SQL
válidos, e não tipos específicos PL/SQL-
– Retornar tipos de dados SQL válidos, e não tipos específicos
PL/SQL
• Ao chamar funções em instruções SQL:
– Você deve ser o proprietário da função ou ter o privilégio
EXECUTE.
– Você pode precisar ativar a palavra-chave
PARALLEL_ENABLE para permitir uma execução paralela da
instrução SQL
27
Controlando os Efeitos Colaterais ao
Chamar Funções em Expressões SQL
As funções chamadas em:
• Uma instrução SELECT não podem conter instruções DML
• Uma instrução UPDATE ou DELETE em uma tabela T não
podem consultar nem conter instruções DML na mesma
tabela T
• As instruções SQL não podem encerrar transações (ou
seja, não podem executar operações COMMIT ou
ROLLBACK)
Observação: As chamadas a subprogramas que não respeitam
essas restrições também não são permitidas na função.
28
Restrições à Chamada de Funções
em SQL: Exemplo
CREATE OR REPLACE FUNCTION dml_call_sql(p_sal NUMBER)
RETURN NUMBER IS
BEGIN
INSERT INTO empregadon(cd_empregado, nm_empregado,
vl_salario, vl_comissao, cd_depart)
VALUES(99, 'Esmeraldo', 8800.47, NULL, 10);
RETURN (p_sal + 100);
END;
UPDATE empregadon
SET vl_salario = dml_call_sql(2000)
WHERE cd_empregado = 130;
29
Notação Nomeada e Combinada em SQL: Exemplo
CREATE OR REPLACE FUNCTION f(
p_parameter_1 IN NUMBER DEFAULT 1,
p_parameter_5 IN NUMBER DEFAULT 5)
RETURN NUMBER
IS
v_var number;
BEGIN
v_var := p_parameter_1 + (p_parameter_5 * 2);
RETURN v_var;
END f;
/
30
O Que São Triggers?
Tabela Esquema
(proprietário)
Você pode gravar triggers que são acionados sempre que uma
das seguintes operações ocorra no banco de dados:
• Uma instrução DML (database manipulation) (DELETE,
INSERT, ou UPDATE).
• Uma instrução DDL (database definition) (CREATE, ALTER,
ou DROP).
• Uma operação em banco de dados como SERVERERROR,
LOGON, LOGOFF, STARTUP, ou SHUTDOWN.
Triggers de Aplicação e Banco de Dados
É executado uma vez para o evento de É executado uma vez para cada linha
trigger afetada pelo evento de trigger
É disparado uma vez mesmo que Não será executado se nenhuma linha
nenhuma linha seja afetada for afetada pelo evento de trigger
Sequência de Acionamento de Trigger:
Manipulação de uma Única Linha
Use a seguinte sequência para disparar um trigger em uma
tabela quando uma única linha for manipulada:
INSERT INTO departments
(cd_depart,department_name, location_id)
VALUES (400, 'CONSULTING', 2400);
Trigger de
instruçãoBEFORE
Trigger de linhaAFTER
Trigger de
instruçãoBEFORE
Trigger de linhaBEFORE
Trigger de linhaAFTER
...
Trigger de linhaBEFORE
Trigger de linhaAFTER
...
INSERT INTO
empregadon...;
UPDATE empregadon
SET vl_salario = 15500
WHERE nm_empregado = 'Russell';
Usando os Qualificadores OLD e NEW
Aplicação
TABELA 1
Trigger INSTEAD OF
UPDATE
MY_VIEW
TABELA 2
Criando um Trigger INSTEAD OF: Exemplo
INSERT na
INSTEAD OF INSERT
tabela
em EMP_DETAILS NEW_EMPS
1
3
UPDATE tabela
View EMP_DETAILS NEW_DEPTS
Criando um Trigger INSTEAD OF para
Executar DML em Views Complexas
CREATE TABLE new_emps AS
SELECT cd_empregado,nm_empregado,vl_salario,cd_depart
FROM empregadon;