Top Banner
Unidade 2 Linguagem Procedural - Stored Procedures - Triggers 1 Stored Procedures - Triggers
58
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 424928

Unidade 2 Linguagem Procedural -

Stored Procedures - Triggers

1

Stored Procedures - Triggers

Page 2: 424928

Unidade 2

Linguagem Procedural - Procedures - Triggers

� Linguagem Procedural para Manipulação de BD Relacional – PL/SQL

� Stored Procedures

2

� Stored Functions

� Triggers

� Exercícios

Page 3: 424928

PL/SQL

• PL/SQL

É uma ferramenta manipulação de dados do Oracle que pode ser usada internamente (dentro do próprio Oracle) ou externamente (nos aplicativos) de diversas maneiras.

• Tópicos de PL/SQL

3

- Trata-se de uma linguagem procedural (Procedural Language/SQL) associada ao SQL.

- Associa as vantagens das linguagens de Terceira Geração (Linguagens Procedurais como a linguagem C) com as de Quarta Geração como o SQL.

- É uma linguagem estruturada bastante poderosa e de fácil interação com a Base de Dados.

Page 4: 424928

Sintaxe e Estrutura

• Sintaxe e Estrutura de PL/SQL

- Todos os scripts PL/SQL são compostos de comandos procedurais ou comandos SQL.

- Blocos procedurais incluem declarações de variáveis, chamada de procedimentos e construção de loops.

4

- Comandos SQL são usados para acessar a base de dados.

- A unidade básica de qualquer programa PL/SQL é chamada de bloco.

Page 5: 424928

BLOCOS PL/SQL

• Estrutura Básica de um Bloco PL/SQL

DECLARESeção de Declaração onde estão declarados:

- Variáveis PL/SQL- Cursores- Subprogramas Locais

5

BEGINContém o conjunto de comandos que formam a seção

executável.

EXCEPTIONÁrea que contém os comandos de identificação de

erros e tratamento dos mesmos

END;

Page 6: 424928

BLOCOS PL/SQL

• NOTAS:

- Somente a Área executável é essencial. As demais são opcionais.

- O uso da Área de DECLARE é válida somente na composição de triggers que serão vistos mais adiante.

- Nos Procedimentos, Funções e Packages palavra DECLARE

6

- Nos Procedimentos, Funções e Packages palavra DECLARE é substituída por AS ou IS.

- A área de Exception é utilizada para responder em tempo real aos erros ocorridos na interação com a base de dados.

Page 7: 424928

Identificadores PL/SQL

• Identificadores

São usados para nomear objetos como variáveis, cursores e subprogramas.

• Regras- No máximo pode ser composto por 30 caracteres.- Não podem possuir espaços em branco.

7

- Devem iniciar sempre com uma letra.- Caracteres especiais não podem ser usados.

Page 8: 424928

Declaração de Variáveis

• Variáveis e Tipos

- As informações são transmitidas entre o PLSQL e a Base de Dados através de variáveis.

- Uma variável é uma área de memória alocada que pode ser lida pelo programa.

- Toda variável possui um tipo associado a ela.

8

- Toda variável possui um tipo associado a ela.

- O tipo de variável definirá a gama de informações que ela poderá armazenar.

Sintaxe de Declaração

nome_da_variável tipo [CONSTANT] [NOT NULL] [DEFAULT] [:=valor]

Page 9: 424928

Declaração de Variáveis

• Exemplos:

DECLAREv_curso1 NUMBER NOT NULL;v_curso2 NUMBER NOT NULL := 1;v_curso3 NUMBER DEFAULT :=1;

9

• Tipos de Variáveis PL/SQL

- Os tipos de variáveis existentes no PL/SQL são semelhantes aos existentes no ORACLE na declaração das colunas das Tabelas.

- Existem algumas diferenças que podem causar problemas na hora da programação.

- O PL/SQL permite a declaração de variáveis a partir dos campos existentes numa tabela.

Page 10: 424928

Declaração de Variáveis

• NumberIgual ao tipo NUMBER da Base de Dados.Sintaxe:

NUMBER (P,S),onde P é a precisão e S a escala.

• Varchar2Semelhante ao tipo na Base de Dados, porém seu tamanho

10

máximo é de 32767 bytes. No SQL é de 2000 bytes.

• CharSemelhante ao tipo na Base de Dados, porém seu tamanho

máximo é de 32767 bytes. No SQL é de 255 bytes.

• LongSemelhante ao tipo na Base de Dados, porém seu tamanho

máximo é de 32767 bytes. No SQL é de 2G bytes ou 65535 bytes dependendo da versão.

Page 11: 424928

Declaração de Variáveis

• RawSemelhante ao tipo na Base de Dados, porém seu tamanho

máximo é de 32767 bytes. No SQL é de 255 bytes.

• Long RawSemelhante ao tipo na Base de Dados, porém seu tamanho

máximo é de 32767 bytes. No SQL é de 2G bytes ou 65535 bytes dependendo da versão.

11

dependendo da versão.

• Date

• BooleanPode assumir como valores TRUE ou FALSE

Page 12: 424928

Declaração de Variáveis

• Usando o Comando %TYPEDefine que a variável é do tipo do campo de uma tabela. É usado

quando uma variável recebe a informação de uma tabela. Assim o tipo de variável será idêntica ao da coluna da tabela. Caso haja uma mudança na tabela, não será necessário mudar o programa.

Exemplo:DECLARE

12

DECLAREv_SetorCod curso01.setor.SetorCod%TYPE

Page 13: 424928

Escopo e Visibilidade de Variáveis

• Escopo de uma VariávelEscopo de uma variável é a porção do programa na qual uma

variável pode ser acessada.A figura a seguir ilustra o escopo de uma variável

{DECLARE

v_Number NUMBER (3);

BEGIN

}

13

• Temos indicado o escopo das variáveis v_Number e v_string. O escopo é sempre finalizado por um END que termina o bloco básico.

{BEGIN

DECLARE

v_String VARCHAR2(10);

BEGIN

...

END;

END;

}V_StringV_Number

Page 14: 424928

Escopo e Visibilidade de Variáveis• Visibilidade de uma Variável

É a porção do programa onde a variável pode ser acessada de forma única sem ser sobreposta por outra variável de mesmo nome.

DECLARE

v_Number NUMBER (3);

v_String VARCHAR2 (40);

BEGIN

(1)DECLARE

v_String VARCHAR2(10);

14

• A variável v_Number é visível e esta dentro do escopo em todo o programa (nas regiões 1, 2 e 3). Já a variável v_String varchar(40) está dentro do escopo nas regiões 1, 2 e 3, porém só é visível na região 1 e 3. Na região 2 passa a existir a variável v_String varchar2(10).

v_String VARCHAR2(10);

BEGIN

(2)...

END;

(3)END;

Page 15: 424928

Conversão Entre Tipos de Dados• Conversão entre tipos de dados

É possível convertermos todos os tipos de dados sem restrições. A não ser pelas restrições de tamanho de dados. Não pode-se, por exemplo, converter um CHAR(10) em um VARCHAR(5).

Existem basicamente dois tipos de conversão:a implícita e a explícita.

15

• Conversão ImplícitaPL/SQL automaticamente, realiza a conversão entre tipos de

dados diferentes quando isso é possível.

Page 16: 424928

Exemplo

• Exemplo:DECLARE

V_String VARCHAR2(5);BEGIN

SELECT campo_numberINTO V_stringFROM nome_da_tabelaWHERE codigo=1;

16

WHERE codigo=1;END;

• Conversão ExplícitaSerá vista adiante com as funções de conversão de dados.

Page 17: 424928

Estruturas de Controle

• Estruturas de controle são as mais importantes extensões de SQL do PL/SQL.

• Permite processar dados utilizado comando condicionais, iterativos e com controle de fluxo.– IF ... THEN ... ELSE ...– FOR ... LOOP

– WHILE ... LOOP

17

– WHILE ... LOOP

– EXIT WHEN

Page 18: 424928

Controle CondicionalIF ... THEN ...

• Forma mais simples de desvio condicional.IF Condição THEN

seqüência de comandos;

ELSE

seqüência de comandos;

END IF;

18

• Exemplo 1:IF salario < 1000 THEN

UPDATE funcionario SET salario = salario * 1,20;

ELSE

UPDATE funcionario SET salario = salario * 1,10;

END IF;

• Forma mais simplificada:IF x > y THEN maior := x; END IF;

Page 19: 424928

IF-THEN-ELSIF

• Desvio condicional para selecionar alternativas mutuamente exclusivas.IF condição1 THEN

seqüência de comandos 1;

ELSIF condição2 THEN

seqüência de comandos 2;

ELSE

seqüência de comandos 3;

END IF;

• Exemplo:

19

• Exemplo:BEGIN

...

IF vendas > 50000 THEN

bonus := 1500;

ELSIF vendas > 35000 THEN

bonus := 500;

ELSE

bonus := 100;

END IF;

INSERT INTO pagamento VALUES (matricula, bonus, ...);

END;

Page 20: 424928

Controle Interativo

LOOP

-- sequência de comandos

END LOOP;

Executa um laço infinito.

Ex.:

20

LOOP...IF Qtde_Produto > 10 THEN

...EXIT; -- abandona o laço *

END IF;END LOOP;

* Este comando pode ser utilizado somente para abandonar um laço

Page 21: 424928

EXIT WHEN

• Este comando permite abandonar um laço se um processamento for impossível ou indesejável.

• Quando se encontra o comando EXIT a cláusula WHEN é avaliada.• Se o resultado for verdadeiro o laço é abandonado.

Exemplo:

LOOP

21

LOOP

...

total := total + salario;

EXIT WHEN total > 25000; -- sai do laço se esta

-- condição for satisfeita

END LOOP;

Page 22: 424928

WHILE ... LOOP

• Associa uma condição com um seqüência de comandos. Antes de cada iteração do laço a condição é avaliada.

• Se a condição resultar em verdadeiro o conjunto de comandos do laço é executado e novamente avaliada a condição.

• Se a condição for FALSA ou NULA o laço é ignorado e o controle

22

• Se a condição for FALSA ou NULA o laço é ignorado e o controle passa para o próximo comando.

• No exemplo a seguir, pode-se encontrar o primeiro empregado que possui um salário maior que 4000 e possui posição superior de comando que o empregado 7902.

Page 23: 424928

WHILE ... LOOPExemplo

DECLAREsalario emp.sal%TYPE;matricula emp.mat%TYPE;nome emp.nome%TYPE;mat_inicial CONSTANT NUMBER(4) := 7902;

BEGINSELECT sal, mat

INTO salario, matricula FROM emp

23

FROM empWHERE matricula = mat_inicial;

WHILE salario < 4000 LOOPSELECT sal, mat, nome

INTO salario, matricula, nomeFROM emp WHERE mat = matricula;

END LOOP;INSERT INTO historico VALUES

(NULL, salario, nome);COMMIT;

END;

Page 24: 424928

Laço FOR

FOR counter IN [REVERSE] min..máx LOOP

comandos;

END LOOP;

Dentro de um laço FOR, o valor do contador pode ser utilizado para as operações necessárias mas não pode receber atribuições.

FOR ctr IN 1..10 LOOP

24

FOR ctr IN 1..10 LOOP

...

IF NOT finished THEN

INSERT INTO ... VALUES (ctr, ...); -- certo

factor := ctr * 2; -- certo

ELSE

ctr := 10; -- ERRADO

END IF;

END LOOP;

Page 25: 424928

CURSORES - PL/SQL

• O Oracle usa áreas de trabalho para executar comandos SQL e armazenar a informação processada.

• Um cursor é uma área de trabalho nomeada.• Cursor implícito declara uma área de trabalho para todos os comandos

SQL de manipulação de dados, inclusive para as consultas que retornam somente uma linha.

• Para consultas que retornam mais de uma linha, pode-se

25

• Para consultas que retornam mais de uma linha, pode-se explicitamente declarar um cursor para processar cada linha individualmente.

DECLARE

CURSOR c1 IS

SELECT mat, nome, cargo FROM emp

WHERE nu_depto = 20;

Page 26: 424928

Manipulando Cursores

• Um programa PL/SQL abre um cursor, processa as linhas resultantes de uma consulta e finalmente o fecha.

• Como um ponteiro de arquivo, um cursor marca a posição corrente em um arquivo aberto.

• O comando OPEN executa a consulta associada a um cursor, identifica o resultado e posiciona o ponteiro para o primeiro registro.

• O comando FETCH retorna o registro corrente e avança o ponteiro para o próximo registro.

26

para o próximo registro.

• Quando o último registro for processando, o comando CLOSEdesabilita o cursor.

Page 27: 424928

Abrindo uma Variável Cursor

• OPEN-FOR associa uma variável cursor com uma consulta.

OPEN (cursor_variable_name ) FOR select_statement;

Ex.IF NOT emp_cv%ISOPEN THEN

/* Abre uma variável cursor */

27

/* Abre uma variável cursor */OPEN emp_cv FOR SELECT * FROM emp;

END IF;

• Atributos que possuem uma variável do tipo cursor.%FOUND,

%NOTFOUND

%ISOPEN

%ROWCOUNT

• Para abrir a mesma variável para uma outra consulta deve-se primeiro fechar a variável.

Page 28: 424928

Percorrendo uma Variável Cursor

• O comando FETCH retorna uma linha de cada vez e atualiza o ponteiro para o próximo registro.

FETCH (cursor_variable_name)

INTO (variable_name[, variable_name]... | record_name);

LOOP

28

LOOP

/* Percorrendo o cursor */

FETCH emp_cv INTO emp_rec;

-- Abandona o laço no último registro da consulta.

EXIT WHEN emp_cv%NOTFOUND;

....

END LOOP;

• Para cada coluna da variável cursor deve existir uma variável compatível correspondente na cláusula INTO.

• O número de colunas deve ser igual ao número de variáveis.

Page 29: 424928

Fechando uma Variável Cursor

• O comando CLOSE desabilita a variável.

CLOSE ( cursor_variable_name );

LOOP

FETCH emp_cv INTO emp_rec;

EXIT WHEN emp_cv%NOTFOUND;

29

EXIT WHEN emp_cv%NOTFOUND;

...

END LOOP;

/* Fechando a variável */

CLOSE emp_cv;

Page 30: 424928

Programas PL/SQL

• Objetos de Blocos PL/SQL

- Um Bloco PL/SQL pode ser criado como um objeto ORACLE.

- Sendo o bloco PL/SQL um objeto, ele estará armazenado na Base de Dados e poderá ser chamado

30

armazenado na Base de Dados e poderá ser chamado por outros programas.

- Os Blocos PL/SQL podem ser criados como procedures, funções, packages e triggers.

Page 31: 424928

Procedures

• Procedimentos

- Procedimentos e funções PLSQL podem ser definidos como subprogramas se compararmos com as linguagens de terceira geração.

- Quando um procedimento é criado, este fica armazenado na Base de Dados na sua forma executável, para que possa ser usado, eventualmente, por outro bloco PL/SQL.

31

- Quando um procedimento é chamado pode receber parâmetros do bloco PL/SQL que o chamou.

- Um procedimento não pode ser chamado como parte de uma expressão. Quando um procedimento é chamado o controle passa a primeira linha de comando executável do mesmo. Ele retornará ao bloco PLSQL de origem ao terminar sua execução.

Page 32: 424928

Procedures

• Sintaxe.CREATE [OR REPLACE] PROCEDURE procedure_name[(argument [{IN | OUT | IN OUT}] type,...argument [{IN | OUT | IN OUT}] type)] {IS | AS}

procedure body

• Cláusulasprocedure_name - nome do procedimento a ser criado.

32

procedure_name - nome do procedimento a ser criado.

or replace - se já existir um procedimento com esse nome este será derrubado para que o novo procedimento possa ser criado. Caso seja omitida esta cláusula o Oracle não permitirá a criação do procedimento se o se ele já existir com o mesmo nome.

argument - São os parâmetros de entrada e saída que podem ser usados pelo procedimento.

Page 33: 424928

Procedures• Exemplo:

CREATE OR REPLACE PROCEDURE PcInsereSetor(p_SetorCodNr IN Setor.SetorCodNr%TYPE,p_SetorNomeVc IN Setor.SetorNomeVc%TYPE)AS BEGIN

INSERT INTO Setor (SetorCodNr ,SetorNomeVc)VALUES(p_SetorCodNr ,p_SetorNomeVc);

33

(p_SetorCodNr ,p_SetorNomeVc);COMMIT;

END;

O procedimento acima pode ser executado da seguinte maneira:

BEGINPcInsereSetor( ‘3’, ‘Departamento de Vendas’);

END;ou,SQL> EXEC PcInsereSetor( ‘3’, ‘Departamento de Vendas’);

Page 34: 424928

Procedures

• Argumentos do ProcedimentoOs argumentos de um procedimento podem ser classificados como parâmetros de entrada, saída ou entrada e saída.

Exemplo:CREATE OR REPLACE PROCEDURE PcTesteParametros( p_InParametro IN number,p_OutParametro OUT number,p_InOutParametro IN OUT number) AS

BEGIN

34

BEGIN...END;

• Argumentos do Tipo IN

O parâmetro é recebido pelo procedimento dentro do argumento do tipo IN. Este parâmetro não poderá ser modificado, pois ele pode ser usado apenas para a leitura.

Page 35: 424928

Procedures

• Argumentos do Tipo OUT

Qualquer valor passado na chamada do procedimento para argumentos do tipo OUT é ignorado. Este parâmetro é somente de escrita, ou seja, não é possível atribuir valor a outras variáveis a partir deste parâmetro. Quando o procedimento termina, este retorna ao bloco PL/SQL que o chamou atualizando a variável do bloco com o valor passado pelo procedimento.

35

• Argumentos do Tipo IN OUT

Como o próprio nome diz é uma combinação dos argumentos do tipo IN, OUT, ou seja, o parâmetro recebido servirá para escrita ou leitura. Ao retornar ao bloco PL/SQL que o chamou, atualiza a variável do bloco com o valor passado pelo procedimento.

Page 36: 424928

Procedures

• Exemplos:CREATE OR REPLACE PROCEDURE PcTesteParametros( p_InParametro IN number,p_OutParametro OUT number,p_InOutParametro IN OUT number) AS

v_VariávelLocal NUMBER;

BEGIN

v_VariávelLocal := p_InParametro; --Legal

36

v_VariávelLocal := p_InParametro; --Legal p_InParametro := 7; -- Ilegalv_VariávelLocal := p_OutParametro; -- Ilegalp_OutParametro := 7; -- Legal v_VariávelLocal := p_InOutParametro; -- Legalp_InOutParametro := 7; -- LegalEND;

Page 37: 424928

Notas

- Parâmetros IN sempre do lado esquerdo- Parâmetros OUT sempre do lado direito- Parâmetros IN OUT e OUT deverão sempre ter uma variável

correspondente no bloco PL/SQL que chamou o procedimento.Exemplo:DECLARE

v_variavel1 NUMBER;

37

v_variavel1 NUMBER;v_variavel2 NUMBER; BEGIN

PcTesteParametros(3, v_variavel1, v_variavel2);END;

Page 38: 424928

Procedures

• Restrições nos Argumentos dos Procedimentos.

Na declaração dos argumentos não podemos especificar o tamanho dos parâmetros.

Exemplo:CREATE OR REPLACE PROCEDURE PcTesteParametros( p_InParametro IN NUMBER (12), -- Ilegal

38

( p_InParametro IN NUMBER (12), -- Ilegalp_OutParametro OUT NUMBER) ...

Page 39: 424928

Procedures

• O tamanho do parâmetro de entrada é referenciado com o tamanho da variável correspondente no bloco PL/SQL que chamou o procedimento.

Exemplo:CREATE OR REPLACE PROCEDURE PcTesteParametros( p_InParametro IN OUT VARCHAR2) ASBEGIN...END;

39

Executando o procedimento:

DECLAREv_variavel1 VARCHAR2(10);

BEGINPcTesteParametros(v_variavel1);

END;

p_InParametro será um

VACHAR2 (10)

Page 40: 424928

Funções

• Funções

- Funções são muito similares a procedimentos.

- Possuem os mesmos tipos de argumentos e restrições.

- Uma função deve retornar um valor

40

• Sintaxe.

CREATE [OR REPLACE] FUNCTION function_name[(argument [{IN}] type,...argument [{IN}] type)]RETURN return_type {IS | AS}function_body

Page 41: 424928

Funções

• Cláusulas

function_name - nome da função a ser criada.

OR REPLACE - se já existir uma função com esse nome esta será derrubada para que a nova função possa ser criada.

argument e type - similares aos dos procedimentos

41

RETURN - O tipo do valor que a função irá retornar. Dentro do corpo da função, o comando RETURN é usado para retornar o controle para o bloco PL/SQL que chamou a função.

Page 42: 424928

Exemplo

CREATE OR REPLACE FUNCTION RetornaCodigo RETURN NUMBER AS

v_FuncCod NUMBER;BEGINSELECT sequencia.NEXTVAL into v_FuncCod from DUALRETURN v_FuncCod;END;

42

Page 43: 424928

Funções

CREATE OR REPLACE FUNCTION RetornaTipoSalario (p_FuncCod IN NUMBER) RETURN VARCHAR2

ASv_FuncSalario NUMBER;BEGIN

SELECT FuncSalarioNr INTO v_FuncSalario FROM Funcionario WHERE FuncCodNr = p_FuncCod ;

IF v_FuncSalario <= 100 THENRETURN ‘Salário Muito Baixo’;

43

RETURN ‘Salário Muito Baixo’;

ELSIF v_FuncSalario <= 500 THENRETURN ‘Salário Baixo’;

ELSIF v_FuncSalario <= 1000 THENRETURN ‘Salário um Pouco Baixo’;

ELSERETURN ‘Salário Razoável’;

END IF;

END RetornaTipoSalario;

Page 44: 424928

Triggers

• Triggers (Gatilhos)- Triggers são similares a procedimentos, onde possuem áreas de declaração, execução e tratamento de erros.- Procedimentos são executados explicitamente por outro bloco. Um trigger é executado implicitamente sempre que um evento de disparo ocorre. - Os eventos de disparo que podem chamar um trigger são: INSERT, UPDATE ou DELETE

44

INSERT, UPDATE ou DELETE

• Uso de Triggers- Para elaborar restrições de integridade complexas impossíveis de serem geradas na criação das tabelas.- Para registrar informações diversas sobre modificações de tabelas.- Para sinalizar outros programas sobre as modificações ocorridas.

Page 45: 424928

Triggers

• Sintaxe

CREATE OR REPLACE TRIGGER trigger_name {BEFORE | AFTER} triggering_event ON nome_tabela[FOR EACH ROW [WHEN trigger_condition]]trigger_body;

• Cláusulas

45

trigger_name - nome do trigger.

triggering_event - especifica quando o trigger será disparado.

nome_tabela - nome da tabela na qual será usado o gatilho.

trigger_condition - se estiver presente será validada primeiro. O trigger só é executado se a condição retornar TRUE.

Page 46: 424928

Triggers

• Exemplo: Um trigger que garante que o nome do funcionário e o seu endereço sempre serão inseridos em letras maiúsculas.

CREATE TRIGGER trgcursoBEFORE

INSERT OR UPDATE

ON funcionario

46

FOR EACH ROW

BEGIN

:new.FuncNome:=upper(:new. FuncNome);

:new.FuncEnder:=upper(:new. FuncEnder);

END;

Page 47: 424928

Triggers

Cláusula BEFORE/AFTER

• São cláusulas obrigatórias que especificam quando deve ser disparado o gatilho.

• Deve ser declarado antes do corpo do código.

• No exemplo anterior, o código do gatilho deve ser disparado

47

• No exemplo anterior, o código do gatilho deve ser disparado antes das operações especificadas.

Page 48: 424928

Triggers

Comandos de gatilho: DELETE, INSERT e UPDATE.

• Um, dois ou todos os três comandos podem ser incluídos na especificação do gatilho.

• Deve ser definida uma única tabela associada com um gatilho. Não pode ser uma visão (VIEW).

• Para o exemplo anterior, qualquer um dos comandos abaixo ativará o gatilho.

DELETE FROM funcionario;

48

DELETE FROM funcionario;INSERT INTO funcionario VALUES ( . . . );INSERT INTO funcionario SELECT . . . FROM . . . ;UPDATE funcionario SET . . . ;• Se um gatilho especifica a atualização de uma lista de colunas, então o

gatilho será disparado somente se alguma coluna desta lista for alterada.

... BEFORE DELETE OR INSERT OR UPDATE OF funcnome ON funcionario ...

Page 49: 424928

Cláusula FOR EACH ROW

• Determina se o gatilho é de linha ou um gatilho de comando.

• Se for especificado FOR EACH ROW, o gatilho é ativado sempre para cada linha da tabela que é afetada pela definição do gatilho.

• A ausência desta cláusula significa que um gatilho é ativado somente uma vez para cada comando aplicável, mas não separadamente para linha afetada pelo comando.

Triggers

49

linha afetada pelo comando.

CREATE TRIGGER log_salary_increaseAFTER UPDATE ON empFOR EACH ROWWHEN (:new.sal > 1000)BEGIN

INSERT INTO emp_log (emp_id, log_date, new_salary, action)VALUES (:new.empno, SYSDATE, :new.sal, 'NEW SAL');

END;

Page 50: 424928

Com o comando abaixo:• UPDATE emp SET sal = sal + 1000.0

WHERE deptno = 20;

• Se existirem 5 funcionários no departamento 20, o gatilho será disparado 5 vezes, pois 5 linhas serão afetadas.

• O gatilho abaixo será disparado uma única vez, para cada atualização

Exemplo

50

• O gatilho abaixo será disparado uma única vez, para cada atualização na tabela EMP.

CREATE TRIGGER log_emp_update

AFTER UPDATE ON emp

BEGIN

INSERT INTO emp_log (log_date, action)

VALUES (SYSDATE, 'EMP COMMISSIONS CHANGED');

END;

Page 51: 424928

Cláusula: WHEN

• Pode-se definir um gatilho restrito a uma definição especificada para uma expressão booleana SQL na cláusula WHEN.

• Quando definida esta cláusula, a expressão é avaliada para cada linha afetada pelo gatilho.

Triggers

51

• Se a expressão retornar VERDADEIRA (true) para uma linha, o gatilho será ativado para a linha.

• Se a expressão retornar FALSA (false) ou Não VERDADEIRA (null) para a linha, o gatilho não será ativado para a linha

Page 52: 424928

Corpo do Gatilho

• O corpo do gatilho é um bloco PL/SQL que pode conter comandos SQL e/ou PL/SQL.

• Serão executados sempre que os comandos forem disparados e as restrições, desde que especificadas, forem satisfeitas.

• Para gatilhos de linha existem alguns predicados especiais.

INSERTING, DELETING e UPDATING.

Triggers

52

• No corpo de um gatilho de linha, o comando PL/SQL pode acessar os valores novos e antigos do registro corrente afetados pelo gatilho.

• Duas palavras chaves são utilizadas para cada coluna que esta sendo modificada.

OLD para o valor antigo

NEW para o novo valor

• Dependendo do tipo de comando de gatilho, certos nomes não tem significado.

Page 53: 424928

• Um gatilho ativado com um comando INSERT pode acessar somente a coluna NEW, pois não existe valor antigo.

• Um gatilho para o comando UPDATE pode acessar o valor NEW e OLD

tanto para a cláusula BEFORE e AFTER de cada linha.

• Um gatilho ativado com um comando DELETE pode acessar somente a coluna.

• Ex.

Triggers

53

• Ex.

IF :new.sal > 10000 . . .

IF :new.sal < :old.sal . . .

• O valor NEW pode ser mudado quando utilizado com a cláusula BEFORE.

• Se uma cláusula BEFORE muda o valor de NEW.COLUNA um gatilho associado à cláusula AFTER é disparado no mesmo comando.

Page 54: 424928

Exercícios

1) Criar as tabelas:

Relatório Relcodnr Numérico 8 dígitos Chave primária

Funcionario Matricula Numérico 5 dígitos Chave primária Nome Varchar2 30 dígitos DataNasc Date DataAdm Date Salario Numérico 8 dígitos

inteiros e 2 dígitos decimais

54

Relcodnr Numérico 8 dígitos Chave primária Matricula Numérico 5 dígitos Chave estrangeira da

tabela Funcionário (Matricula)

Reldescrvc Caracter 100 dígitos Relobsvc Caracter 50 dígitos Reldatadt data

Page 55: 424928

Exercícios

2) Crie um procedimento que acrescente 30% ao salário de todos os funcionários que foram admitidos após 01-01-2007.

3) Crie um procedimento que recebe a matrícula do funcionário e retorne o nome e o seu respectivo salário. Faça um programa chamador para este procedimento.

55

este procedimento.

Page 56: 424928

Exercícios

4) Crie uma função onde o parâmetro de entrada é o código do funcionário, e que retorne como parâmetro (de saída) as seguintes mensagens:

mensagens condição Tem salário menor que $200 Funcionário nessa faixa salarial Tem salário maior que $300 Funcionário nessa faixa salarial Tem salário entre $200 e $300 Funcionário nessa faixa salarial

56

Tem salário entre $200 e $300 Funcionário nessa faixa salarial

Page 57: 424928

Exercícios

5) Crie uma função onde o parâmetro de entrada é o código do funcionário, e que retorne como parâmetro (de saída) as seguintes mensagens:

6) Crie um procedimento (usando as funções anteriores) e que insira os seguintes dados na tabela relatório:

mensagens condição Tem menos de 20 anos Funcionário com menos de 20 anos Tem mais de 40 anos Funcionário com mais de 40 anos Tem entre 20 e 40 anos Funcionários entre 20 e 40 anos

57

Onde:mensagem_1= mensagem retornada pela função do exercício 2mensagem_2=mensagem retornada pela função do exercício 3

Relcodnr Numérico sequencial

Matricula Código do funcionário

Reldescrvc O funcionário “nome_do_funcionário”

“mensagem_1” e “mensagem_2”

Reldatadt Data do sistema

Page 58: 424928

Exercícios

7) Crie um procedimento que seja ativado automaticamente quando uma operação de delete ocorrer na tabela Funcionario. Esse procedimento deverá registrar em uma tabela Hist_Funcionario o usuário que está executando a operação e a data.

58