0% acharam este documento útil (0 voto)
185 visualizações84 páginas

02 Function, Trigger, Stored Procedure - Oracle Database

O documento discute funções, triggers e stored procedures no Oracle Database. Ele apresenta exemplos de como criar e utilizar esses recursos para encapsular lógica de negócios e garantir a integridade dos dados. Procedimentos armazenados podem receber parâmetros e executar comandos SQL. Funções armazenadas retornam valores e também podem receber parâmetros. Ambos podem ser usados para reutilizar código e aumentar a segurança e desempenho do banco de dados.

Enviado por

Thiago Miranda
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
185 visualizações84 páginas

02 Function, Trigger, Stored Procedure - Oracle Database

O documento discute funções, triggers e stored procedures no Oracle Database. Ele apresenta exemplos de como criar e utilizar esses recursos para encapsular lógica de negócios e garantir a integridade dos dados. Procedimentos armazenados podem receber parâmetros e executar comandos SQL. Funções armazenadas retornam valores e também podem receber parâmetros. Ambos podem ser usados para reutilizar código e aumentar a segurança e desempenho do banco de dados.

Enviado por

Thiago Miranda
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 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

Você também pode gostar

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy