Escolar Documentos
Profissional Documentos
Cultura Documentos
Procedures
Onde:
BLOCO PL/SQL inicia com uma clusula BEGIN e termina com END
ou END nome_da_procedure;
Exemplo de procedure:
CREATE OR REPLACE PROCEDURE Aumenta_Salario
FUNCIONARIO.Cd_Funcionario%TYPE) IS
BEGIN
UPDATE
FUNCIONARIO
SET
Cd_Salario = Cd_Salario * 1.10
WHERE
Cd_Funcionario = F_Cd_Funcionario;
END Aumenta_Salario;
(F_Cd_Funcionario
IN
SAL
---------- ---------001
10000
002
6000
003
4000
CALL AUMENTA_SAL(001);
Ou
EXECUTE AUMENTA_SAL(001);
SELECT Cd_Funcionario, Cd_Salario from FUNCIONARIO;
EMPNO
SAL
---------- ---------001
11000
002
6000
003
4000
Funes
Sintaxe Bsica:
CREATE [OR REPLACE] FUNCTION nome_da_funo
[( parameter1 [ mode1] datatype1,
parameter2 [ mode2] datatype2,
. . .)]
RETURN tipo_de_dado
IS|AS
Bloco PL/SQL;
OR
REPLACE
FUNCTION
FUNCIONARIO.Cd_Funcionario%TYPE)
Get_Salario(F_Cd_Funcionario
RETURN
FUNCIONARIO.Cd_Salario%TYPE;
BEGIN
SELECT Cd_Salario
INTO valor_salario
FROM FUNCIONARIO
WHERE Cd_Funcionario = F_Cd_Funcionario;
RETURN valor_salario;
END Get_Salario;
Executando
VARIABLE Get_Sal NUMBER;
EXECUTE :Get_Sal := Get_Salario('001');
PRINT Get_Sal;
NUMBER
IS
IN
valor_salario
SQL
Gatilho (Trigger)
Apesar de Trigger SQL serem muito teis, no aconselhvel a utilizao deste
tipo de instruo, pelo fato de prejudicar a performance. A trigger um tipo de
procedure que executada automaticamente aps uma ao especifica que ocorre em
uma tabela ou view (por isso prejudica a performance).
Definio um bloco PL/SQL que disparado de forma automtica e implcita
sempre que ocorrer um evento associado a uma tabela:
INSERT
UPDATE
DELETE
No pode ser chamado explicitamente.
Utilidades
Manuteno de tabelas de auditoria, manuteno de tabelas duplicatas,
implementao de nveis de segurana mais complexos, gerao de valores de
colunas referentes a atributos derivados, validao de restries de integridade mais
complexas que as suportadas diretamente pelo SGBD.
Estrutura
CREATE OR REPLACE TRIGGER nome_gatilho
BEFORE | AFTER
DELETE OR INSERT OR UPDATE OF coluna1, coluna2, ...
ON nome_da_tabela / view
REFERENCING OLD AS nome NEW AS nome
FOR EACH ROW
WHEN condio
DECLARE
rea de declarao
BEGIN
rea de comandos
END;
Clusulas
Tempo
o BEFORE: antes do evento
o AFTER: depois do evento
O gatilho somente ser
Eventos de disparo
disparado se alguma coluna
o INSERT
especificada aps a clusula
o UPDATE
UPDATE OF for alterada
o DELETE
WHEN
o Restringe as tuplas que disparam o gatilho.
COMANDO
o Aciona o gatilho antes ou depois de um comando,
independentemente do nmero de tuplas afetadas
o No requer a clusula FOR EACH ROW
Predicados:
Retornam TRUE se o gatilho foi disparado por:
o INSERT: predicado inserting.
o UPDATE: predicado updating.
o DELETE: predicado deleting.
Exemplo
IF inserting THEN comandos_insero;
ELSIF deleting THEN comandos_remoo;
ELSE comandos_atualizao;
END IF;
Tipos de Gatilhos
Os Triggers podem ser do tipo ROW LEVEL (Linha) ou STATEMENT (Tabela).
Trigger ROW LEVEL:
Os Triggers do tipo ROW LEVEL podem ser usados sempre que
precisarmos que um Trigger trate de valores em uma transao, e por sua
vez so disparados a cada ocorrncia de uma transao sobre uma
tabela. Se um UPDATE atualizar, por exemplo, 1000 linhas em uma
tabela que possua um Trigger de Update do tipo row level, sero
disparadas 1000 vezes.
Os Triggers do tipo row level so utilizadas para operaes como:
o Gravao de LOGS de auditoria de uma aplicao;
o Verificao de dados (Consistncia);
o Implementao de integridade referencial;
Trigger STATEMENT:
Os Triggers do tipo STATEMENT tem a finalidade de tratar a execuo de
aes sobre tabelas independentemente de quantas linhas forem
afetadas. Atravs deste tipo de Trigger podemos registrar a execuo de
comandos INSERT, UPDATE e DELETE contra tabelas que tenham
Triggers contemplando essas aes. Caso um comando UPDATE
atualize 1000 linhas, um Trigger deste tipo apenas dispararia 1 nica vez.
Este tipo de Trigger no pode referenciar qualquer valor contido em uma
coluna da tabela. Isso ocorre porque se o mesmo dispara uma nica vez.
Este tipo de Trigger funciona nos casos de registro de transaes
ocorridas, independentemente do nmero de linhas afetadas.
COLUMN Trigger:
Triggers de Coluna so disparados sempre que a determinada coluna
relacionada no Trigger sofrer a ao ligada ao mesmo. Com isso se a
ao ocorrer em outras colunas que no aquelas associadas ao Trigger, o
Trigger no ser disparado. Isso evita de certa forma que um Trigger seja
disparado se a ao no ocorra, nada ser disparado. Isso pode ser til
em casos de auditoria de mudanas em determinadas colunas, por
exemplo:
o Toda vez que um salrio for alterado na tabela de funcionrio um
Trigger gravar em uma tabela chamada log_funcionrio um
registro contendo o cdigo do empregado e os salrios anteriores e
atuais.
Exemplo
CREATE OR REPLACE TRIGGER Auditoria_Funcionrio AFTER INSERT OR
DELETE OR UPDATE OF Cd_Salario ON FUNCIONARIO REFERENCING OLD AS
Antigo NEW AS Novo FOR EACH ROW
BEGIN
INSERT INTO LOG_FUNCIONARIO (Cd_Funcionario, Cd_Salario_Ant,
Cd_Salario_Atu, Cd_user, Dt_trasac)
VALUES (:Novo.Cd_Funcionario, :Antigo.Cd_Salario ,
:Novo.Cd_Salario , user, SYSDATE);
TABLE Trigger:
END;
Clausula WHEN
Caso o Trigger tenha alguma condio para ser executado, podemos incluir uma
clusula chamada WHEN. Nesta colocamos as condies que o Trigger ir disparar.
Caso precisemos tratar o valor de alguma coluna, usamos os modificadores OLD e
NEW, mas nessa clausula no colocaremos os : na frente, pois nesse caso ocorrer
erro.
Exemplo
create or replace TRIGGER Audita_Transacao2 BEFORE UPDATE ON
FUNCIONARIO
REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
WHEN (NEW.Dt_Demis is not null)
BEGIN
raise_application_error(-20001, 'Operao no pode ser
executada. O funcionario ' || :OLD.Cd_Funcionario || ' esta
demitido!');
END;
Habilitar/Desabilitar
ALTER TRIGGER
Habilita/desabilita um ou mais gatilhos
ALTER TRIGGER nome_gatilho
ENABLE | DISABLE;
Exemplo:
nome do gatilho
ALTER TRIGGER Audita_Transacao ENABLE;
ALTER TRIGGER Funcionario ENABLE ALL TRIGGERS;
nome da tabela
Compilar
ALTER TRIGGER
Compila novamente um gatilho
ALTER TRIGGER nome_gatilho
COMPILE;
Exemplo:
ALTER TRIGGER Audita_Transacao COMPILE;
Remover
DROP TRIGGER
Remove um gatilho do banco de dados
DROP TRIGGER nome_gatilho;
Exemplo:
DROP TRIGGER Audita_Transacao;