Linguagem PL/SQL e Triggers



Documentos relacionados
TECNOLOGIA DE BASES DE DADOS Linguagem PL/SQL e Triggers

Oracle PL/SQL Overview

PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL

SQL Procedural. Josino Rodrigues Neto

Tratamento de Exceções

Oracle 10g: SQL e PL/SQL

Bases de Dados 2007/2008. Aula 8

Bancos de Dados I. Integridade semântica

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

FERRAMENTA DE APOIO A REESTRUTURAÇÃO DE CÓDIGO FONTE EM LINGUAGEM PL/SQL BASEADO EM PADRÕES DE LEGIBILIDADE

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Monitoria GDI Aula Prática. DML + PL/SQL parte 1

Sistemas de Informação

Logado no OracleXE vamos acessar a opção:

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

PL/pgSQL. Introdução. Introdução. Introdução

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve


Introdução ao PL/SQL

Laboratório de Banco de Dados II AULA 06 Linguagem SQL (Continuação) Prof. Érick de Souza Carvalho

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

SQL Gatilhos (Triggers)

Tarefa Orientada 18 Procedimentos armazenados

PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

PL/pgSQL por Diversão e Lucro

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Create Sequence Cria uma sequence. Uma sequence é um objeto que permite vários usuários gerarem valores inteiros sem repetição.

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

Triggers no PostgreSQL

2. Criar um bloco PL/SQL anônimo para imprimir as tabuadas abaixo: 5 X 10 = 50 5 X 2 = X 10 = X 2 = 2...

DESENVOLVIMENTO DE SOFTWARE

Bases de Dados 2007/2008. Aula 9

INTRODUÇÃO AO PL/SQL

BD Oracle. Licenciatura em Engenharia Informática e Computação. Bases de Dados 2003/04

Consultoria e Treinamento em Bancos de Dados Relacionais

SQL Pacotes. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados Pacotes


trigger insert, delete, update

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

Treinamento. Sumário

MANUAL INSTALAÇÃO WEB SERVICE

Banco de Dados Avançados Banco de Dados Ativo

António Rocha Nuno Melo e Castro

Regras de Negócios é com o Elefante!

Integridade dos Dados

Laboratório de Banco de Dados II Aula 1. Stored Procedures

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

Oracle 10g Dicas de PL/SQL. Conteúdo

Tarefa Orientada 19 Triggers

Hugo Pedro Proença, 2007

Informática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015. Visual Basic VBA

Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade.

PROCEDURES, FUNÇÕES, PL/SQL, CURSORES, VIEW, ÍNDICE e SEQUÊNCIA. Stored procedure PL/SQL. Procedimentos e Funções. Procedimento (procedure) Procedure

São 182 videoaulas de Oracle pl/sql procedures functions triggers Forms Reports

1.6. Tratamento de Exceções

Projeto de Banco de Dados

Restrições de Integridade Complexas

Curso PHP Aula 08. Bruno Falcão

Linguagem de Consulta - SQL

Comandos de Manipulação

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

Acadêmica: Giselle Mafra Schlosser Orientador: Everaldo Artur Grahl

Bases de Dados. DML Data Manipulation Language Parte 1

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

21/03/2012 PL/SQL. Variáveis

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Sumário Introdução Breve História da Linguagem SQL l 0.3 Características da Linguagem SQL A Composição deste Livro 3

PROGRAMA. Aquisição dos conceitos teóricos mais importantes sobre bases de dados contextualizados à luz de exemplos da sua aplicação no mundo real.

A linguagem SQL

Relatório. Projecto de Base de Dados Parte 2. Turno: quinta-feira, 11:30 Grupo 25: André Gonçalves Rui Barradas Hélton Miranda 68477

UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

14/9/2009. Banco de Dados

Programação SQL. Introdução

Gatilhos (Triggers) Prof. Márcio Bueno Elaborado por Maria Lígia B. Perkusich

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

SQL: Definição de tabelas, Modificações à Base de Dados

4 Usando funções simples Usando funções de uma única linha Funções de caractere Funções numéricas Funções de conversão Funções de expressão regular

Banco de Dados II. PL/SQL - Procedures -Cursor - Funções. Segurança: Introdução; Controle de Acesso; Criptografia; Recursos de SQL.

PostgreSQL. André Luiz Fortunato da Silva Analista de Sistemas CIRP / USP alf@cirp.usp.br

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

Desenvolvimento OO com Java Orientação a objetos básica

Representação de Algoritmos - Linguagens de Programação

Material Teórico. Procedures, Functions, Exceptions e Triggers. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

DESENVOLVIMENTO DE SOFTWARE

COMANDO DA AERONÁUTICA ESCOLA DE ESPECIALISTAS DE AERONÁUTICA SUBDIVISÃO DE ADMISSÃO E DE SELEÇÃO

AULA 1: PARADIGMAS DE PROGRAMAÇÃO

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

Introdução ao SQL. O que é SQL?

Transcrição:

TECNOLOGIA DE BASES DE DADOS Linguagem PL/SQL e Triggers António Manuel Silva Ferreira UNIVERSIDADE DE LISBOA FACULDADE DE CIÊNCIAS DEPARTAMENTO DE INFORMÁTICA asfe@di.fc.ul.pt

Sumário Linguagem PL/SQL Tipos de dados e declaração de variáveis Execução condicional e ciclos Tratamento de erros baseado em exceções Desenvolvimento de código modular Integração com a linguagem SQL Funções predefinidas Vantagens e desvantagens Triggers Conceito e utlização de triggers Estrutura de um trigger Tipos de triggers Exemplo para autorização especial 2

Síntese da Linguagem PL/SQL 1 PL/SQL = Procedural Language extensions to SQL Grande gama de Tpos de dados Predefinidos ou definidos pelo programador MúlTplas alternatvas para controlar o fluxo de execução Tratamento erros baseado em exceções Exceções predefinidas ou declaradas pelo programador Desenvolvimento de código modular Integração com a linguagem SQL Comandos SQL no código PL/SQL Chamada a funções PL/SQL em comandos SQL Biblioteca de funções predefinidas data_entrega DATE; vencimento NUMBER; nome VARCHAR2(80); IF (c1) THEN... END IF; WHILE (c2) LOOP... END LOOP; EXCEPTION WHEN ZERO_DIVIDE THEN... FUNCTION dobro(n IN NUMBER) RETURN NUMBER; UPDATE empregado SET vencimento = dobro(vencimento); minúsculas := LOWER(maiúsculas); 3

Síntese da Linguagem PL/SQL 2 CREATE OR REPLACE PACKAGE BODY funções_simples IS FUNCTION fatorial(n IN NUMBER) RETURN NUMBER IS resultado NUMBER := 1; IF (n < 0) THEN RAISE VALUE_ERROR; END IF; WHILE (n > 1) LOOP resultado := resultado * n; n := n - 1; END LOOP; RETURN resultado; EXCEPTION WHEN VALUE_ERROR THEN RETURN 0; END fatorial; END funções_simples; 4

Tipos de Dados e Declaração de Variáveis 1 Tipos de dados predefinidos nome VARCHAR2(255) := NULL; letra CHAR := A ; agora DATE := SYSDATE; PI CONSTANT NUMBER(6,5) := 3.14159; Declaração de uma constante Tipos de dados definidos pelo programador SUBTYPE tipo_data_contrato IS DATE; TYPE registo_cliente IS RECORD ( número NUMBER(5), nome VARCHAR2(80)); data_contrato tipo_data_contrato; cliente registo_cliente; cliente.número := 1502; cliente.nome := Sofia ; Nota: Tpos de dados definidos pelo programador podem ser incompa^veis com a JDBC! Algumas conversões são automátcas: NUMBER VARCHAR2 ou CHAR DATE VARCHAR2 ou CHAR 5

Tipos de Dados e Declaração de Variáveis 2 Tipos de dados ancorados em tabelas SQL e em atributos de tabelas TYPE registo_emp1 IS RECORD ( número NUMBER(5), nome VARCHAR2(80)); TYPE registo_emp2 IS RECORD ( número emp.número%type, nome emp.nome%type); emp1 registo_emp1; emp2 registo_emp2; emp3 emp%rowtype; - - Tabela de exemplo. CREATE TABLE emp ( número NUMBER(5), nome VARCHAR2(80) ); Tipos de dados estão dependentes da definição dos atributos da tabela emp emp%rowtype é um Tpo RECORD que segue a definição da tabela emp %TYPE e %ROWTYPE facilitam a manutenção de código Ex. mudança de NUMBER(5) para NUMBER(6) no atributo número da tabela emp seria automatcamente refletda no código PL/SQL 6

Execução Condicional e Ciclos IF THEN ELSIF ELSE END IF IF (está_na_hora) THEN soa_alarme; END IF; IF (está_na_hora) THEN soa_alarme; ELSE está_atento; END IF; IF (hora > 20) THEN cumprimento := Boa noite ; ELSIF (hora > 12) THEN cumprimento := Boa tarde ; ELSE cumprimento := Bom dia ; END IF; LOOP EXIT WHEN END LOOP x NUMBER := 1; LOOP EXIT WHEN (x > 2); x := x + 1; END LOOP; WHILE LOOP END LOOP x NUMBER := 1; WHILE (x <= 2) LOOP x := x + 1; END LOOP; FOR IN LOOP END LOOP FOR x IN 1.. 2 LOOP NULL; END LOOP; Variável x só visível dentro do ciclo FOR 7

Tratamento de Erros Baseado em Exceções 1 Exceções interrompem o fluxo normal de execução de código Execução transferida para bloco de tratamento de exceções FUNCTION divisão(dividendo IN NUMBER, divisor IN NUMBER) IS RETURN NUMBER; resultado NUMBER := 0; resultado := dividendo / divisor; RETURN resultado; Se divisor for zero, é gerada a exceção ZERO_DIVIDE, que faz o fluxo de execução saltar para o bloco de tratamento de exceções EXCEPTION WHEN ZERO_DIVIDE THEN... WHEN OTHERS THEN RAISE; Bloco de tratamento de exceções END divisão; 8

Tratamento de Erros Baseado em Exceções 2 Exceções não tratadas são propagadas para o bloco de código imediatamente mais abrangente IF (erro_grave) THEN RAISE exceção_a; ELSIF (erro_muito_grave) THEN RAISE exceção_b; END IF; EXCEPTION WHEN exceção_b THEN NULL; END;... EXCEPTION WHEN exceção_a THEN RAISE; END; Se uma exceção não for tratada em algum bloco de código, será propagada para o terminal do utlizador e a execução do código termina Forma de ignorar ou anular uma exceção exceção_a é tratada no bloco de código mais abrangente RAISE propaga explicitamente uma exceção 9

Tratamento de Erros Baseado em Exceções 3 Exceções definidas pelo programador PROCEDURE teste IS IF (erro_grave) THEN RAISE_APPLICATION_ERROR(- 20001, Erro grave! ); END IF;... END teste; Código da exceção Mensagem da exceção Códigos 20999 a 20000 podem ser usados livremente pelo programador Código e mensagem da exceção mais recente podem ser obtdos invocando as funções SQLCODE e SQLERRM Exceções predefinidas CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR STORAGE_ERROR TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE OTHERS 10

Desenvolvimento de Código Modular 1 Blocos anónimos Sem nome, sem parâmetros, e sem Tpo de retorno Execução num ponto fixo do código Variáveis locais + comandos + tratamento de exceções Procedimentos Bloco anónimo + nome + parâmetros Podem ser invocados explicitamente no código Funções Procedimentos + Tpo de retorno Pacotes Coleções de funções e procedimentos inter- relacionados 11

Desenvolvimento de Código Modular 2 Procedimentos e funções FUNCTION somaf(x IN NUMBER, y IN NUMBER) IS RETURN NUMBER; r NUMBER := 0; r := x + y; RETURN r; END somaf; Tipo de retorno da função No modo IN o valor do parâmetro só pode ser consultado No modo OUT o valor do parâmetro só pode ser alterado (mas não consultado) PROCEDURE somap(x IN NUMBER, y IN NUMBER, r OUT NUMBER) IS r := x + y; END somap; - - Os dois comandos seguintes são equivalentes. r := somaf(1, 1); somap(1, 1, r); Modo IN OUT permite a consulta e alteração do valor do parâmetro 12

Desenvolvimento de Código Modular 3 Notações posicional e nomeada DECLARE r NUMBER := 0; r := somaf(1, 1); somap(1, 1, r); r := somaf(x => 1, y => 1); r := somaf(y => 1, x => 1); END; Notação posicional: posição do argumento determina o parâmetro Notação nomeada: argumentos identficados pelo nome do parâmetro Notação nomeada torna o código mais extenso, mas também mais legível id := regista_cliente(nome => Sofia, telefone => 217217217, morada => Rua da Avenida, 1 ); 13

Desenvolvimento de Código Modular 4 Parâmetros com valor por omissão FUNCTION dias_que_passaram(data1 IN DATE, data2 IN DATE := SYSDATE) RETURN NUMBER RETURN (data2 - data1); END dias_que_passaram; Por omissão de argumento em data2 é assumida a data atual (fornecida pela função SYSDATE) DECLARE dias NUMBER := 0; - - O resultado é idêntico nos dois casos. dias := dias_que_passaram(to_date( 28.09.99, DD.MM.YY ), SYSDATE); dias := dias_que_passaram(to_date( 28.09.99, DD.MM.YY )); END; Comentários em PL/SQL começam com - - 14

Desenvolvimento de Código Modular 5 Pacotes Coleções de funções e procedimentos inter- relacionados Reforçam conceitos de encapsulamento e de reutlização Construídos em duas etapas: especificação + codificação Especificação Declarações de constantes e Tpos de dados públicos Especificações de procedimentos e funções públicas Guardada em ficheiro com extensão SPS (ex. ALUNO.SPS) Codificação Declaração de constantes e Tpos de dados privados Codificação de procedimentos e funções públicas e privadas Guardada em ficheiro com extensão SPB (ex. ALUNO.SPB) 15

Desenvolvimento de Código Modular 6 Especificação: ALUNO.SPS PACKAGE aluno IS - - Documentação da função1. FUNCTION função1(x IN NUMBER) RETURN NUMBER; - - Documentação da função2. FUNCTION função2(p IN NUMBER) RETURN NUMBER; END aluno; função_aux só é visível dentro do pacote aluno Codificação: ALUNO.SPB PACKAGE BODY aluno IS PI CONSTANT NUMBER := 3.14159; FUNCTION função1(x IN NUMBER) RETURN NUMBER IS - - Código da função1 END função1; FUNCTION função2(p IN NUMBER) RETURN NUMBER IS - - Código da função2 END função2; FUNCTION função_aux(x IN NUMBER) RETURN NUMBER IS - - Código da função_aux END função_aux; END aluno; 16

Integração com a Linguagem SQL 1 Comandos SQL no código PL/SQL PROCEDURE gere_empregado(operação IN VARCHAR2, número_emp IN empregado.número%type, nome_emp IN empregado.nome%type) IS IF (operação = DELETE ) THEN DELETE FROM empregado WHERE (número = número_emp); ELSIF (operação = INSERT ) THEN INSERT INTO empregado(número, nome) VALUES (número_emp, nome_emp); END IF; END gere_empregado; Chamada a funções PL/SQL em comandos SQL SELECT número_encomenda, dias_que_passaram(data_encomenda) FROM encomenda; UPDATE empregado SET vencimento = dobro(vencimento); Evitar nomes de parâmetros iguais aos de atributos de tabelas 17

Integração com a Linguagem SQL 2 Interrogações que retornam uma ocorrência DECLARE nome_empregado1 VARCHAR2(80); nome_empregado2 empregado.nome%type; - - Alternativa melhor. - - Nomes dos dois empregados são guardados em variáveis locais. SELECT nome INTO nome_empregado1 FROM empregado WHERE número = 1001; SELECT nome INTO nome_empregado2 FROM empregado WHERE número = 1002; END; Estas interrogações geram a exceção NO_DATA_FOUND DECLARE caso a ocorrência não exista empregado1 empregado%rowtype; - - Todos os dados do empregado são guardados na variável local. SELECT * INTO empregado1 FROM empregado WHERE número = 1001; END; 18

Integração com a Linguagem SQL 3 Interrogações que retornam múlqplas ocorrências SELECT...INTO pode devolver no máximo uma ocorrência Exceção TOO_MANY_ROWS se interrogação devolver várias ocorrências SELECT * INTO emp1 FROM empregado - - Lança exceção TOO_MANY_ROWS Para ler várias ocorrências de uma interrogação são usados cursores Resultado lido de forma iteratva, uma ocorrência de cada vez Leitura de ocorrências pode parar antes de atngido o fim do resultado Ciclo de vida de um cursor: 1. Declaração do cursor 2. Abertura do cursor 3. Leitura de ocorrências 4. Fecho do cursor 19

Integração com a Linguagem SQL 4 Exemplo de utlização de cursor DECLARE CURSOR c_emp IS SELECT * FROM empregado; emp empregado%rowtype; OPEN c_emp; LOOP FETCH c_emp INTO emp; EXIT WHEN c_emp%notfound;... END LOOP; CLOSE c_emp; END; 1. Declaração do cursor emp vai guardar, uma de cada vez, as ocorrências retornadas pela interrogação 2. Abertura do cursor 3. Ciclo que percorre as ocorrências do resultado da interrogação 4. Fecho do cursor 20

Integração com a Linguagem SQL 5 Exemplo anterior pode ser escrito de forma abreviada DECLARE CURSOR c_emp IS SELECT * FROM empregado; FOR emp IN c_emp LOOP... END LOOP; END; Gestão facilitada do cursor FOR emp IN (SELECT * FROM empregado) LOOP... END LOOP; END; OPEN, FETCH, e CLOSE executados implicitamente Forma ainda mais abreviada do mesmo ciclo FOR emp, de Tpo empregado %ROWTYPE, só é visível dentro do ciclo FOR Este Tpo de ciclo FOR só deve ser usado para percorrer todas as ocorrências do resultado da interrogação 21

Integração com a Linguagem SQL 6 Atributos de cursores DECLARE CURSOR c_emp IS SELECT * FROM empregado; emp empregado%rowtype; OPEN c_emp; LOOP FETCH c_emp INTO emp; IF (c_emp%found) THEN... END IF; END LOOP; CLOSE c_emp; EXCEPTION WHEN OTHERS THEN IF (c_emp%isopen) THEN CLOSE c_emp; END IF; END; Devolve TRUE se o últmo FETCH devolveu uma ocorrência TRUE se o cursor ainda estver aberto Mais atributos de cursores: %NOTFOUND e %ROWCOUNT (número de FETCHs efetuados) 22

Integração com a Linguagem SQL 7 Escritas na ocorrência atual de um cursor FUNCTION altera_departamento(número_emp IN empregado.número%type, novo_dep IN empregado.departamento%type) RETURN NUMBER IS CURSOR c_emp IS SELECT * FROM empregado WHERE (número = número_emp) FOR UPDATE OF departamento; aux_emp empregado%rowtype; retorno NUMBER := NULL; OPEN c_emp; FETCH c_emp INTO aux_emp; IF (c_emp%found) THEN UPDATE empregado SET departamento = novo_dep WHERE CURRENT OF c_emp; retorno := 0; ELSE retorno := - 1; END IF; CLOSE c_emp; RETURN retorno; END altera_departamento; Coluna de departamento do resultado da interrogação é para ficar reservada para escrita UPDATE afeta a ocorrência atual do cursor c_emp 23

Integração com a Linguagem SQL 8 Transporte de cursores CREATE OR REPLACE PACKAGE p_empregado IS TYPE ref_cursor_emp IS REF CURSOR RETURN empregado%rowtype; FUNCTION lista_empregados_com_inicial(letra CHAR) RETURN ref_cursor_emp; END p_empregado; CREATE OR REPLACE PACKAGE BODY p_empregado IS FUNCTION lista_empregados_com_inicial(letra CHAR) RETURN ref_cursor_emp IS lista_emp ref_cursor_emp; OPEN lista_emp FOR SELECT * FROM empregado WHERE nome LIKE letra % ; RETURN lista_emp; END lista_empregados_com_inicial; END p_empregado; Tipo ref_cursor_emp pode ser omitdo e substtuído pelo cursor genérico SYS_REFCURSOR Função devolve resultado da interrogação do cursor Ocorrências do resultado são lidas por quem invoca a função (ex. Java) 24

Integração com a Linguagem SQL 9 Funções PL/SQL podem ser usadas em comandos SQL Regras a observar Parâmetros das funções têm de ter o modo IN Tipos de dados dos parâmetros têm de ser básicos NUMBER, VARCHAR2, CHAR, (os mesmos usados em atributos de tabelas) Funções não podem alterar o conteúdo da base de dados Exemplo FUNCTION dias_que_passaram(data1 IN DATE, data2 IN DATE := SYSDATE) RETURN NUMBER RETURN (data2 - data1); END dias_que_passaram; SELECT número_encomenda, dias_que_passaram(data_encomenda) FROM encomenda; 25

Funções Predefinidas Escrita no ecrã DBMS_OUTPUT.PUT_LINE( Mensagem de depuração ); Sobre sequências de caracteres LOWER( ABC ) => abc LENGTH( ABC ) => 3 INSTR( ABC, B ) => 2; Sobre datas LAST_DAY( 12- JAN- 2001 ) => 31- JAN- 2001 NEXT_DAY( 24- SEP- 2001, Friday ) => 28- SEP- 2001 SYSDATE => <data_actual> Sobre números MOD(10, 3) => 1 SQRT(4) => 2 TRUNC(1.2345, 2) => 1.23 Conversões Para ver a mensagem de depuração no SQL*Plus, executar previamente SET SERVEROUTPUT ON TO_CHAR(SYSDATE, DD.MM.YYYY HH24:MI:SS ) => 02.10.2000 13:00:00 TO_DATE( 28.09.1999, DD.MM.YYYY ) => <data_de_tipo_date> Existem muitas mais funções disponíveis em cada categoria 26

Vantagens e Desvantagens da PL/SQL Vantagens ProduTvidade Associação de Tpos de dados Integração com linguagem SQL Desempenho Código próximo dos dados Portabilidade Oracle disponível em diversas plataformas computacionais Comportamento transacional Em caso de exceção não tratada, código executado é anulado automatcamente Desvantagens Linguagem proprietária Só usada em SGBDs Oracle Ainda assim, no 19º lugar de popularidade do índice TIOBE Desempenho Muitos acessos a dados limitam recursos para execução de código Programação procedimental não centrada em objetos Não existe a noção de classe Necessária adaptação de diagramas UML 27

Conceito e UQlização de Triggers Conceito de trigger Bloco de código implicitamente executado aquando de uma operação de escrita sobre uma tabela associada INSERT, UPDATE, ou DELETE Código do trigger pode conter comandos SQL ou PL/SQL Trigger executado como uma unidade UTlização de triggers Regras de negócio complexas Cuidado com a atvação recursiva de triggers! Réplicas síncronas de tabelas Autorizações especiais Registo de eventos Escrita em tabelas Início e fim de sessões de utlizadores 28

Estrutura de um Trigger CREATE TRIGGER verifica_aumento_vencimento BEFORE UPDATE OF vencimento ON empregado FOR EACH ROW WHEN (new.vencimento > old.vencimento) DECLARE vencimento_do_chefe NUMBER := NULL; SELECT vencimento INTO vencimento_do_chefe FROM empregado WHERE (categoria = chefe ); Especificação do trigger Restrição de atvação (opcional) Ação do trigger (código) IF (:new.vencimento > vencimento_do_chefe) THEN RAISE_APPLICATION_ERROR(- 20001, Não pode ganhar mais que o chefe! ) END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(- 20002, A empresa não tem chefe! ); WHEN OTHERS THEN RAISE; END; 29

Tipos de Triggers CREATE TRIGGER verifica_aumento_vencimento BEFORE ou AFTER Qualquer combinação de INSERT OR UPDATE OR DELETE BEFORE UPDATE OF vencimento ON empregado FOR EACH ROW WHEN...... Se omitdo, o trigger é executado uma só vez por comando SQL Cada tabela pode ter 12 Tpos distntos de triggers (2 3 2) Se forem criados vários triggers do mesmo Tpo não há a certeza de qual será atvado primeiro Cláusula WHEN só pode ser usada em triggers com FOR EACH ROW Não pode ter interrogações nem código PL/SQL 30

Trigger para Autorização Especial CREATE TRIGGER em_horário_trabalho BEFORE INSERT OR UPDATE OR DELETE ON empregado DECLARE data_atual DATE := SYSDATE; hora_atual NUMBER(2) := NULL; dia_semana CHAR(3) := NULL; Tabela empregado só pode ser modificada durante o horário normal de trabalho hora_atual := TO_CHAR(data_atual, HH24 ); dia_semana := TO_CHAR(data_atual, DY ); IF (hora_atual NOT BETWEEN 8 AND 24) THEN RAISE_APPLICATION_ERROR(- 20001, Fora de horas! ); ELSIF (dia_semana IN ( SAT, SUN )) THEN RAISE_APPLICATION_ERROR(- 20002, Fim de semana! ); END IF; EXCEPTION WHEN OTHERS THEN RAISE; END; - - Exceção não é tratada e a modificação é anulada 31

Bibliografia Steven Feuerstein e Bill Pribyl, Oracle PL/SQL Programming, O Reilly, 5ª edição, 2009 PL/SQL Language Reference h p://techref.alunos.di.fc.ul.pt/oracle11g/appdev.112/e10472/toc.htm Advanced Applica>on Developer s Guide h p://techref.alunos.di.fc.ul.pt/oracle11g/appdev.112/e10471/toc.htm SQL Language Reference h p://techref.alunos.di.fc.ul.pt/oracle11g/server.112/e10592/toc.htm Error Messages h p://techref.alunos.di.fc.ul.pt/oracle11g/server.112/e10880/toc.htm 32