A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

© 2013 IST Bases de Dados 2012/2013 Triggers e funções/procedimentos e em MySQL Helena Galhardas.

Apresentações semelhantes


Apresentação em tema: "© 2013 IST Bases de Dados 2012/2013 Triggers e funções/procedimentos e em MySQL Helena Galhardas."— Transcrição da apresentação:

1 © 2013 IST Bases de Dados 2012/2013 Triggers e funções/procedimentos e em MySQL Helena Galhardas

2 © 2013 IST Bibliografia Manual referência MySQL –http://dev.mysql.com/doc/refman/5.1/en/create -trigger.htmlhttp://dev.mysql.com/doc/refman/5.1/en/create -trigger.html –http://dev.mysql.com/doc/refman/5.1/en/trigge rs.htmlhttp://dev.mysql.com/doc/refman/5.1/en/trigge rs.html –http://dev.mysql.com/doc/refman/5.1/en/stored -programs-views.htmlhttp://dev.mysql.com/doc/refman/5.1/en/stored -programs-views.html 1

3 © 2013 IST Sumário Funções e procedimentos (stored programs/routines) em MySQL Triggers em MySQL 2

4 © 2013 IST Funções e Procedimentos SQL suporta funções e procedimentos –com ciclos, if-then-else, declaração de variáveis, atribuição de valores a variáveis, etc. Alguns SGBD suportam ainda –funções que devolvem relações (SQL:2003) –outras funcionalidades proprietárias 3

5 © 2013 IST Linguagens para Extensões Procedimentais para SGBD SQL/PSM – Standard SQL (e MySQL) Transact-SQL – MS SQL Server + Sybase PL/SQL - Oracle PL/pgSQL – Postgres (=PL/SQL) … 4

6 © 2013 IST Stored Routine Conjunto de instruções (tal como um sub- programa em qualquer linguagem de programação) que é guardado na BD Pode ser invocado por: –triggers –stored procedures –Aplicações em Java, C++, etc Corresponde a rotina que pode ser de dois tipos: –Stored procedures que chamamos –Funções que devolvem um valor 5

7 © 2013 IST Vantagens Permitem que as aplicações sejam mais eficientes –Compilados e mantidos na BD Permitem reduzir o tráfego de informação na rede entre aplicação e servidor de BD São reutilizáveis e transparentes para a aplicação –Útil quando aplicações codificadas em diferentes linguagens executam as mesmas operações na BD Suportam acesso restrito à informação guardada na BD –Operações são encapsuladas em stored programs; aplicações só as executam e não acedem às tabelas base directamente 6

8 © 2013 IST Inconvenientes Difícil de fazer debugging Não é fácil desenvolver e manter stored procedures Difícil de desenvolver se a lógica de negócio a implementar for complexa Depende do SGBD utilizado 7

9 © 2013 IST Exemplo da sintaxe (stored procedure) CREATE PROCEDURE procedure1 (IN parameter1 INTEGER) /* nome e parâmetros */ BEGIN /* início de bloco */ DECLARE variable1 CHAR(10); /* variáveis */ IF parameter1 = 17 /* início de IF */ THEN SET variable1 = 'birds'; /* atribuição */ ELSE SET variable1 = 'beasts'; END IF; /* fim de IF */ INSERT INTO table1 VALUES (variable1); /* instrução SQL */ END /* fim de bloco */ 8

10 © 2013 IST Corpo de um stored program Corpo de uma rotina pode conter instruções SQL ou outras instruções (declarações, ciclos e outras estruturas de controlo) delimitadas por BEGIN/END Por omissão, MySQL reconhece um “;” como um separador de instruções, logo é preciso redefini-lo temporariamente para que a definição do bloco seja passada ao servidor de BD delimiter // CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END // delimiter ; CALL dorepeat(1000); SELECT @x; 9

11 © 2013 IST Instruções dentro do corpo de um Stored Program Podem conter instruções SQL/DDL como CREATE e DROP Stored procedures podem conter a instrução COMMIT (mas não as funções) Instruções que devolvem um conjunto de resultados podem ser usadas dentro de um stored procedure mas não dentro de uma função (exemplo: SELECT …. INTO) Instrução USE não é permitida dentro de um stored procedure nem dentro de uma função 10

12 © 2013 IST Elementos Procedimentais Básicos (1) Declaração de variáveis DECLARE var_name [, var_name...] type [DEFAULT value] –o âmbito da variável local está restrito ao bloco onde foi declarada IST ▪ DEI ▪ Bases de Dados 11

13 © 2013 IST Elementos Procedimentais Básicos (2) Atribuição de valores SET var_name = value O comando SELECT … INTO SELECT col_name, … INTO var_nameFROM … 12

14 © 2013 IST Condições e Ciclos IF condicao THEN lista_instrucoes1 ELSE lista_instrucoes2 END IF; WHILE condicao DO lista_instrucoes END WHILE; REPEAT lista_instrucoes UNTILcondicao END REPEAT; LOOP lista_instrucoes END LOOP 13 IST ▪ DEI ▪ Bases de Dados

15 © 2013 IST Exemplo de função CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!'); SELECT hello('world'); 14

16 © 2013 IST BD exemplo (banco) Account (account-number, branch-name, balance Loan (loan-number, branch-name, amount) Borrower (customer-name, loan-number) loan-number: FK(Loan) Depositor (customer-name, account-number) account-number: FK(Account) Credit-info (customer-name, limit, credit-balance) Employee (employee-name, street, city) Works (employee-name, branch-name, salary) employee-name: FK(Employee) 15

17 © 2013 IST Outro exemplo de função Definir uma função que, dado o nome de um cliente, devolve o número de contas desse cliente 16 Delimiter // create function account_count (c_name varchar(255)) returns integer begin declare a_count integer; select count(*) into a_count from depositor where customer_name = c_name; return a_count; End // Delimiter ;

18 © 2013 IST IST ▪ DEI ▪ Bases de Dados Utilização Nome, rua e cidade dos clientes com mais de uma conta SELECT customer_name, customer_street, customer_city FROM customer WHERE account_count (customer_name) > 1 17

19 © 2013 IST Sintaxe das funções A instrução RETURNS pode ser especificada apenas numa função, na qual é obrigatória –Indica o tipo de dados devolvido pela função O corpo da função tem que conter uma instrução RETURN valor Uma função é considerada “determinística” se produzir sempre os mesmos resultados para os mesmos parâmetros de entrada. –Por omissão é não determinística (especificar DETERMINISTIC caso contrário) –Exemplo de uma função não determinística: invoca a função NOW() ou RAND() 18

20 © 2013 IST Parâmetros Lista de parâmetros entre () tem que estar sempre presente –Se não existirem parâmetros, colocar () Cada parâmetro é IN por omissão –Se não for o caso, colocar OUT ou INOUT antes do nome do parâmetro Parâmetros IN, OUT, INOUT só são válidos para procedimentos; funções só têm parâmetros IN Procedimento pode mudar o valor do parâmetro IN mas o novo valor não é visível fora do procedimento depois de RETURN Um parâmetro OUT tem o seu valor inicial igual a NULL Um parâmetro INOUT tem o seu valor inicial dado por quem invoca o procedimento, pode ser modificado pelo procedimento e o seu valor novo é visivel depois do procedimento retornar 19

21 © 2013 IST Exemplo de parâmetro OUT delimiter // CREATE PROCEDURE simpleproc (OUT param1 INT) BEGIN SELECT COUNT(*) INTO param1 FROM account; END// delimiter ; CALL simpleproc(@a); SELECT @a; 20

22 © 2013 IST Resumo sintaxe stored programs CREATE PROCEDURE/FUNCTION DROP PROCEDURE/FUNCTION CALL nome_procedimento [(param1, param2,…)] nome_função [(param1, param2,…)] 21

23 © 2013 IST Cursores Abstração para ler tabela a partir de um programa como se fosse um ficheiro –OPEN / FETCH / CLOSE Podem ser usados dentro de stored programs/routines 22

24 © 2013 IST Cursores delimiter // create function average_balance() returns real begin declare done int default false; declare balance_var real default 0.0; declare sum_balance real default 0.0; declare count_balance integer default 0; declare cursor_account cursor for select balance from account; declare continue handler for not found set done = true; open cursor_account; read_loop: loop fetch cursor_account into balance_var; if done then leave read_loop; end if; set sum_balance = sum_balance + balance_var; set count_balance = count_balance + 1; end loop; close cursor_account; return sum_balance / count_balance; end// delimiter ; 23 IST ▪ DEI ▪ Bases de Dados

25 © 2013 IST IST ▪ DEI ▪ Bases de Dados Triggers Um trigger é uma instrução executada em reacção a uma modificação na BD Para especificar um trigger é necessário saber: –as condições em que o trigger é disparado –as acções a fazer quando o trigger é executado Trigger é um conceito antigo, mas só apareceu na norma SQL:1999 24

26 © 2013 IST IST ▪ DEI ▪ Bases de Dados Necessidade dos triggers Cenário: o cliente levanta uma quantia superior ao saldo Em vez de resultar num saldo negativo, o banco: –cria um empréstimo igual à quantia em falta –dá ao empréstimo o mesmo número que a conta –coloca o saldo da conta a zero Condição de disparo: um update que resulte em saldo negativo na conta 25

27 © 2013 IST Exemplo Levantamento de 500 € da conta A-102 IST ▪ DEI ▪ Bases de Dados account -100 26

28 © 2013 IST Exemplo Levantamento de 500 € da conta A-102 IST ▪ DEI ▪ Bases de Dados 27 account depositor loan borrower 0 A-102Perryridge 100 Hayes A-102

29 © 2013 IST Sintaxe MySQL CREATE [DEFINER={ user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } trigger_body: [begin_label:] BEGIN [statement_list] END [end_label] DROP TRIGGER trigger_name 28

30 © 2013 IST Exemplo CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.balance; SET @sum = 0; INSERT INTO account VALUES ('137', 'Perryridge', 14.98),('141', 'Perryridge', 1937.50),('97', 'Perryridge', -100.00); SELECT @sum AS 'Total amount inserted'; 29

31 © 2013 IST Outro exemplo delimiter // CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROW BEGIN IF NEW.balance < 0 THEN SET NEW.balance = 0; ELSEIF NEW.balance > 100 THEN SET NEW.balance = 100; END IF; END; delimiter ; UPDATE account SET balance = balance - 500 WHERE account_number = 'A-101'; 30

32 © 2013 IST Tratamento de erros Se um trigger BEFORE falha, a operação sobre a linha correspondente não é executada Um trigger AFTER só é executado se quaisquer triggers BEFORE sobre a mesma tabela e relativos à mesma operação forem executados com sucesso Um erro durante um trigger AFTER ou BEFORE resulta na falha da instrução completa que desencadeou o trigger 31

33 © 2013 IST Quando não usar triggers Actualizar um total quando se insere/actualiza um registo –usar vistas em vez de triggers Replicação de BDs –usar mecanismos próprios do SGBD (só funciona se SGBDs forem do mesmo fabricante) Execuções não intencionadas –p.ex. quando a BD está a ser reposta a partir de backup Ocorrência de erros –se o trigger falha, toda a operação falha Efeitos imprevistos –cadeias de eventos imprevisíveis ou intermináveis 32

34 © 2013 IST Sumário Triggers e stored procedures em MySQL Próxima aula: Desenvolvimento de Aplicações de BD 33


Carregar ppt "© 2013 IST Bases de Dados 2012/2013 Triggers e funções/procedimentos e em MySQL Helena Galhardas."

Apresentações semelhantes


Anúncios Google