Sei sulla pagina 1di 84

Instituto Federal do

Sudeste de Minas
Gerais
Tecnologia em Sistemas para Internet
Functions, Triggers e
Stored Procedures
Oracle Database
Alunos

Armando Assuno
Richardson William
Samuel Gonalves
Wagner Almeida

PL/SQL
O que PL/SQL?

PL/SQL uma linguagem procedural projetada


especificamente para encapsular instrues SQL;
Programas PL/SQL so compilados e armazenados no
banco de dados Oracle;
Em tempo de execuo, tanto PL/SQL e SQL executam
dentro do mesmo processo do servidor, trazendo a
eficincia ideal.
Por qu usar PL/SQL?

Uma aplicao que usa o banco de dados Oracle (e


outros) no de grande valia se no houver garantia de
que apenas os dados corretos e completos sejam
persistidos;
A maneira correta de obter essa garantia evitar a
exposio dos detalhes de implementao.
Como esta garantia alcanada?

Subprogramas PL/SQL entregam dados encapsulando a


lgica de negcios envolvida.
Os dados podem ser alterados e visualizados somente
atravs de uma interface PL/SQL.
PL/SQL

O PL/SQL pode ser usado em algumas linguagens de


programao:
PHP
Java
Python
.NET
Node.js
Introduo

A unidade bsica de um programa o bloco, que agrupa


variveis e instrues.
Um bloco definido pelas palavras reservadas DECLARE,
BEGIN, EXCEPTION e END.
Exemplo 1 - Hello World!

Exemplo bsico. Apenas imprime uma mensagem na tela.

BEGIN
dbms_output.put_line('Hello world!');
END;
PL/SQL

Devido a cada bloco possuir sua prpria seo de


declarao e exceo, desenvolvedores podem usar
blocos annimos para prover escopo para identificadores
e tratamentos de exceo em um programa maior.
Exemplo 2 - Bloco completo

DECLARE
today date := sysdate;
BEGIN
dbms_output.put_line('Today is ' || to_char(today,'Day'));
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line(sqlerrm);
END;
Exemplo 3 - Adicionando lgica

DECLARE
today date := sysdate;
BEGIN
IF to_char(today,'D') < 4 THEN
dbms_output.put_line('Have a wonderful week');
ELSE
dbms_output.put_line('Enjoy the rest of the week');
END IF;
dbms_output.put_line('Today is ' || to_char(today,'Day'));
END;

Stored Procedures
Stored Procedures

Procedures so apenas blocos de cdigo PL/SQL com um


nomes definidos;
Conhecidos como subprogramas autnomos;
Quando compilados, so armazenados no banco de
dados e se tornam stored procedures.
A sua funo principal executar comandos.
Stored Procedures

Procedures podem aceitar argumentos;


Normalmente no retorna valores;
Mesmo no retornando valores, tem efeitos fora dele;
So executados por programas, sesses SQL ou Triggers.
So muito utilizadas na lgica de negcios.
Vantagens de Stored Procedures

Fornece reutilizao de cdigo;


Portabilidade;
Produtividade;
Aumento de performance;
Segurana.
Sintaxe de stored procedures

CREATE [OR REPLACE] PROCEDURE procedure_name


[ ( p_parameter1 [MODE1] datatipe1
,p_parameter2 [MODE2] datatipe2
)]
{IS | AS}
bloco PL/SQL
Parametros

REPLACE - indica que caso a procedure exista ela ser


eliminada e substituda pela nova verso criada pelo
comando.
PROCEDURE_NAME indica o nome da procedure.
PARMETRO indica o nome da varivel PL/SQL que
passada na chamada da procedure.
Parametros

MODE - Indica qual o tipo do parmetro, se IN(leitura), OUT


(escrita) ou IN OUT(leitura e escrita). O valor padro IN.
IS | AS So sinnimos quando usados na criao de
procedures. Por conveno usamos IS na criao de
procedures e AS na criao de pacotes.
BLOCO PL/SQL indica as aes que sero executadas por
aquela procedure.

Exemplos Procedures
Exemplo 01 - Descrio

Cria uma procedure que deleta um funcionrio com


determinado id.
A procedure recebe apenas o id do funcionrio.
Exemplo 01 - Declarao

CREATE OR REPLACE PROCEDURE proc_deleta_func(


p_id_func IN FUNCIONARIOS.ID_FUNC%TYPE
)
IS
BEGIN
DELETE FROM Funcionarios WHERE id_func =
p_id_func;
END proc_deleta_func;
Exemplo 01 - Utilizao

EXECUTE proc_deleta_func(1) ;

ou

BEGIN
proc_deleta_func(1);
END;
Exemplo 02 - Descrio

Cria uma procedure que aumenta o salrio dos


funcionrios de um determinado departamento .
A procedure recebe o id do departamento e o valor da
porcentagem.
Exemplo 02 - Declarao

CREATE OR REPLACE PROCEDURE proc_aumenta_salario_depto(


p_id_depto IN Funcionarios.id_dpto%TYPE,
porcentagem IN NUMBER)
IS
BEGIN
UPDATE
Funcionarios
SET salario = salario * (1 + porcentagem / 100)
WHERE id_dpto = p_id_depto;
END proc_aumenta_salario_depto;
Exemplo 02 - Utilizao

EXECUTE proc_aumenta_salario_depto(4, 50) ;

ou

BEGIN
proc_aumenta_salario_depto(4, 50);
END;
Exemplo 03 - Descrio

Para apagar uma procedure necessrio apenas do


comando:

DROP PROCEDURE procedure_name;


Exemplo 03 - Utilizao

Apagando a procedure proc_deleta_func.

DROP PROCEDURE proc_deleta_func;



Functions
Functions

Blocos PL/SQL nomeados;


Semelhantes s Stored Procedures;
Obrigatoriamente devem retornar um valor.
Vantagens de se utilizar Functions

Promovem reusabilidade;
Facilidade de manuteno;
Facilidade de utilizao: Podem ser chamadas a partir de
blocos PL/SQL ou instrues SQL.
Algumas Utilizaes

Converses de dados;
Formatar datas;
Contar o total de linhas;
Obter dados com base em critrios estabelecidos;
Alterar dados.
Sintaxe Bsica Criao e Substituio

CREATE [OR REPLACE] FUNCTION nome_da_funo


[( parameter1 [ mode1 ] datatype1,
parameter2 [ mode2 ] datatype2,
. . .)]
RETURN datetype_return
IS | AS
Bloco PL/SQL;
Parmetros

CREATE [OR REPLACE] - Utilizado para criar uma funo. O


parmetro OR REPLACE opcional e indica que caso a
function exista, ser eliminada e substituda pela nova verso
criada. O parmetro OR REPLACE tambm muito utilizado
para alterar uma funo;

NOME_DA_FUNO - indica o nome da funo;


Parmetros

PARAMETER - Indica o nome da varivel PL/SQL que


passada na chamada da function.

DATETYPE - Indica o tipo de dado do parmetro. Pode ser


qualquer tipo de dado do SQL ou do PL/SQL. Pode usar
referncias como %TYPE, %ROWTYPE ou qualquer tipo de dado
escalar ou composto.
Parmetros

RETURN - Indica o retorno da function, ou seja, o que a


function dever retornar ao local de chamada da mesma;

datetype_return - Indica o tipo de dado que ser retornado


pela function. Podem ser tipos SQL ou PL/SQL;
Parmetros

IS|AS - A sintaxe do comando aceita tanto IS como AS. Por


conveno usamos IS na criao de function/procedures e AS
quando estivermos criando packages;

Bloco PL/SQL - Indica as aes que sero executadas pela


function.

Exemplos Functions
Exemplo 1 - Descrio

Cria uma funo que retorna o novo salrio de um


funcionrio;
A funo receber o valor atual e a projeo de aumento
em valor decimal.
Exemplo 1 - Declarao

CREATE OR REPLACE FUNCTION


projecao_novo_salario(valor IN NUMBER,
porcentagem IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (valor * (1 + porcentagem));
END projecao_novo_salario;
Exemplo 1 - Utilizao

SELECT nome_func, id_dpto, salario,


projecao_novo_salario ( salario, 0.6 )
FROM funcionarios
WHERE nome_func = Richardson William;
Exemplo 2 - Descrio

Altera a funo inicial para que verifique se a


porcentagem recebida por parmetro alterar o salario
corrente (valor diferente de 0);
Caso seja um valor vlido, retorna o novo salrio;
Caso contrrio, exibe o salrio atual.
Exemplo 2 - Declarao

CREATE OR REPLACE FUNCTION projecao_novo_salario(valor IN


NUMBER, porcentagem IN NUMBER)
RETURN NUMBER IS
BEGIN
IF porcentagem != 0 THEN
RETURN (valor * (1 + porcentagem));
ELSE
RETURN valor;
END IF;
END projecao_novo_salario;
Exemplo 2 - Utilizao

SELECT nome_func,
id_dpto, salario,
projecao_novo_salario ( salario, 0 )
FROM funcionarios
WHERE nome_func = 'Wagner Almeida';
Retornando mais de um valor na Function

Para retornar mais de um valor existem duas formas:


Retornando as linhas utilizando RECORD e %
ROWTYPE;
Definir um tipo de dado (objeto) que ter os atributos
(valores) que desejamos retornar.

Obs.: Ser exemplificada apenas a segunda forma, pois a


primeira j foi vista utilizando PostgreSQL e a forma de
utilizao anloga no Oracle Database.
Exemplo 3 - Criando tipo da dados

Para retornar mais de um valor utilizando a segunda


forma, so necessrios 3 passos. Primeiro preciso criar
um tipo objeto com os atributos referentes aos dados
que se deseja armazenar.
Exemplo 3 - Definio de um objeto

CREATE OR REPLACE TYPE dados_funcionario


AS OBJECT ( codigo NUMBER,
nome VARCHAR2(80),
salario VARCHAR2(80) );
Exemplo 3 - Criao do tipo Table

Tambm necessrio criar um tipo table do objeto criado


anteriormente, para que se possa retornar um grupo
destes objetos.
Exemplo 3 - Definio do tipo Table

CREATE OR REPLACE TYPE dados_funcionario_table


AS TABLE OF dados_funcionario;
Exemplo 3 - Testando o objeto e o tipo criados

CREATE OR REPLACE FUNCTION teste_f


RETURN dados_funcionario_table PIPELINED IS
BEGIN
PIPE ROW (dados_funcionario( 1, 'Fernanda',
1300));
END;

SELECT * FROM TABLE(teste_f());


Exemplo 3 - Parmetros adicionais utilizados

PIPELINED - Keyword utilizada para que uma function


possa trabalhar como uma tabela;

PIPE ROW - Retorna uma linha da tabela. Pode ser usado


apenas em functions criadas como PIPELINED.
Exemplo 4 - Descrio

Cria uma funo que retorna todos os funcionrios que


recebem um valor igual ou maior ao salrio recebido por
parmetro.
Exemplo 4 - Declarao

CREATE OR REPLACE FUNCTION funcionarios_salario_base(valor


IN NUMBER) RETURN dados_funcionario_table PIPELINED IS
BEGIN
FOR linha IN (SELECT id_func, nome_func, salario FROM
funcionarios WHERE salario >= valor)
LOOP
PIPE ROW (dados_funcionario(linha.id_func,
linha.nome_func, linha.salario));
END LOOP;
END;
Exemplo 4 - Utilizao

Lista todos os funcionrios que tem o salrio maior ou


igual a R$ 7000:

SELECT * FROM TABLE(funcionarios_salario_base(7000));


Para saber mais - PIPELINED

Toda vez que se utiliza uma function como PIPELINED os


resultados so retornados em subsets;

No necessrio aguardar todo o processamento pois os


resultados so retornados em tempo de execuo;

Isso faz com que a obteno dos dados seja mais rpida
do que functions convencionais.
Alterar Functions

Da mesma forma que ocorre com views, alterar functions


no Oracle Database no to trivial;
Para facilitar este processo, a forma mais usual
sobrescrever function que se deseja alterar (utilizando o
parmetro OR REPLACE na criao da function).
Apagar Function

Para apagar uma function basta apenas utilizar o


comando:

DROP FUNCTION nome_da_funo;



Triggers
Triggers

um gatilho de tipo especial de Procedimento


Armazenado (Stored Procedure);
Contm um bloco PL/SQL que associado a uma
operao DML;
Executado antes ou depois de ocorre uma Operao DML.
Porque usar Triggers?

Gerao automtica de valores de colunas derivados;


Preveno de transaes invlidas;
Reforar regras de negcio complexas;
Prover auditoria;
Gerar estatsticas sobre acesso s tabelas;
Prover log de transaes.
Tipos de Triggers

Trigger Row Level


Trigger Statement
Column Trigger
Table Trigger
Trigger Row Level

A trigger disparada sempre que ocorrer uma transao


sobre uma tabela.
So Utilizadas em Operaes como:
Gravao de LOGS de auditoria;
Verificao de dados (Consistncia);
Implementao de integridade referencial.
Trigger Statement

Est trigger trata execues de aes que ocorre na


tabela independentemente de quantas linhas foram
afetadas;
Recomenda para a execuo de comandos INSERT,
UPDATE e DELETE;
Column Trigger

Trigger associada a uma coluna da tabela;


Trigger disparada quando a coluna que ela est
associada sofre uma operao DML;
Caso for outra coluna sofre a operao a trigger no e
disparada.
Table Trigger

Trigger associada a uma tabela;


A trigger e dispara sempre que alguma coluna da tabela
associada sofrer operao DML;
Sintaxe - Trigger

CREATE [OR REPLACE] TRIGGER [schema.] NOME_TRIGGER


[BEFORE|AFTER|INSTEAD OF]
[DELETE|OR INSERT|OR UPDATE[OF coluna]]
ON [schema.] nome_tabela_ou_view
[REFERENCING [OLD [AS] OLD] [NEW [AS] NEW]
[FOR EACH ROW]
[WHEN [condio]] BLOCO PL/SQL
Sintaxe - Trigger

OR REPLACE - Sobrescreve a trigger caso ela j exista;


NOME_TRIGGER - Indica nome da trigger;
schema. - Especifique o esquema para conter o gatilho.
Se voc omitir o esquema , ento Oracle Database cria o
gatilho no seu prprio esquema
Sintaxe - Trigger

BEFORE - Indica que a trigger ser disparada antes da


ao ocorrer;
AFTER - Indica que a trigger ser disparada aps a
ocorrncia da ao;
INSTEAD OF - indica que a trigger ir ser executada no
lugar da instruo que disparou a trigger.
Sintaxe - Trigger

INSERT - Define que a trigger e diparada sempre que


ocorre uma ao de INSERT;
DELETE - Define que a trigger e diparada sempre que
ocorre uma ao de DELETE;
UPDATE -Define que a trigger e diparada sempre que
ocorre uma ao de UPDATE;
Sintaxe - Trigger

nome_tabela_ou_view: Indica o nome da tabela ou da


view que a trigger est associada;
REFERENCING: Ir indicar ser utilizara OLD ou NEW;
OLD e NEW: So referenciadores de valores sendo OLD
valores antigos e NEW valores novos estando presentes
apenas nas Trigger Row Level;
Sintaxe - Trigger

FOR EACH ROW: Quantas vezes o corpo da trigger ser


executado;
WHEN: Nas Trigger Row Level, podemos restringir a ao
da trigger segundo uma condio, onde a mesma ser
disparada apenas para as linhas que satisfaam a
condio prevista;
Sintaxe - Trigger

BLOCO PL/SQL: Quais aes sero executadas na trigger,


sendo o corpo da trigger.

Exemplos de Triggers
Criando uma Trigger

create or replace TRIGGER log_func_dml AFTER INSERT OR


DELETE OR UPDATE ON funcionarios
REFERENCING OLD as velho NEW as novo FOR EACH ROW
--Bloco SQL--
DECLARE
Operacao CHAR(1);
Instancia varchar2 (60);
Cliente varchar2 (60);
Usuario varchar2 (60);
BEGIN
Criando uma Trigger

SELECT SYS_CONTEXT('USERENV', 'INSTANCE_NAME') "Instncia",


SYS_CONTEXT('USERENV', 'HOST')"CLIENTE",
SYS_CONTEXT('USERENV', 'SESSION_USER')"Usurio BD" into instancia,
cliente, usuario FROM DUAL;

IF INSERTING THEN
Operacao := 'I';
ELSIF UPDATING THEN
Operacao := 'U';
ELSE /* H Deleo */
Operacao := 'D';
END IF;
Criando uma Trigger

INSERT INTO log_funcionarios (ID_LOG,COD_FUNC,NOME_FUNC_OLD,


NOME_FUNC_NEW,
SALARIO_OLD,SALARIO_NEW,EMAIL_OLD,EMAIL_NEW,
ID_DPTO_OLD,ID_DPTO_NEW,DATA_ALTERACAO,OPERACAO,
INSTANCIA,CLIENTE,USUARIO)
VALUES (log_funcionarios_seq.NEXTVAL,:velho.id_func,
:velho.nome_func,:novo.nome_func,:velho.salario,:novo.salario,
:velho.email,:novo.email,:velho.id_dpto, :novo.id_dpto,
SYSDATE, Operacao,Instancia,Cliente,Usuario);
END;
Criando uma Trigger

SELECT * FROM log_funcionarios;

INSERT INTO FUNCIONARIOS VALUES(30,'Pedro


Henrique',5000.00,'pedroh@gmail.com',4);

SELECT * FROM log_funcionarios;


Ativando e Desativando Trigger

Ao criar uma trigger ela e ativada


automaticamente, para poder desativar ela s
utilizar o seguinte comando:
Desativar:
ALTER TRIGGER nome_trigger DISABLE;
Ativar:
ALTER TRIGGER nome_trigger ENABLE;
Alterando a Trigger

ALTER TRIGGER log_func_dml DISABLE;

INSERT INTO FUNCIONARIOS VALUES(30,'Ilma


Barbosa',3200.00,'ilma.ilma@ilma.com',2);

SELECT * FROM log_funcionarios;


Alterando a Trigger

ALTER TRIGGER log_func_dml ENABLE;

UPDATE FUNCIONARIOS SET salario= 8000.00,


email = 'ilma_ilma@ilma.com', id_dpto = 4
WHERE id_func = 30;

SELECT * FROM log_funcionarios;


Apagando uma Trigger

O comando para apagar a Trigger :

DROP TRIGGER [schema.] nome_trigger;


Restries do uso de Triggers

No podemos realizar os comandos COMMIT, ROLLBACK e


SAVEPOINT em um Trigger, mesmo que seja uma
procedure executada em um Trigger.
No podemos fazer select na mesma tabela que sofre a
ao de um Trigger , pois isso pode provocar um erro
chamado MUTANT TABLE.
Referncias

oracle-base.com
docs.oracle.com
www.devmedia.com.br
aprendaplsql.com

Potrebbero piacerti anche