triggers ti

Upload: gerson-de-cristo

Post on 14-Jan-2016

34 views

Category:

Documents


0 download

DESCRIPTION

Triggers Ti sql

TRANSCRIPT

18

vou mostrar como se faz para criar stored procedures e funes no MySQL. Stored procedures e funes so processos que voc cria e ficam armazenados noMySQL, onde voc pode execut-los depois. A vantagem que o tempo de execuo para consultar dados e mostrar na tela do usurio, ou executar comandos mais complexos, ficam muito mais rpidos do que se voc fosse fazer via PHP, por exemplo.Imagina se voc tem que fazer uma consulta, e de acordo com cada resultado desta consulta voc tem que inserir ou atualizar uma outra tabela. Ou ento imagine que voc tenha que fazer uma consulta e executar alguns clculos com os dados de alguns campos. Isso d para fazer com PHP, mas voc torna o processo muito mais lento, pois para cada resultado, o php abre uma nova consulta para executar a instruo devida. No exemplo que mostrarei, vou comparar uma stored procedure com um script php, que fazem exatamente a mesma coisa.Com uma stored procedure, voc faz uma chamada s ao servidor MySQL e ele se encarrega de fazer sozinho. Stored Procedure so timas para se executar scripts mais complexos no banco de dados.Com uma funo, em uma nica consulta voc j traz os resultados prontinhos para o php somente mostrar na tela. como se o resultado da funo fosse um dado j armazenado mo MySQL.Diferena entre stored procedures e funesStored procedures no retornam dados. Elas executam scripts no MySQL, que podem ser desde alteraes da estrutura de tabelas, at migrao de dados de uma tabela para outra, ou executar aes de acordo com os resultados de uma consulta.Funes obrigatoriamente devem retornar dados, sejam INT, CHAR, VARCHAR, BOOLEAN etc. So timas para fazer comparao de dados e retornar valores, executar clculos, consultar outras tabelas diferentes de acordo com os parmetros passados etc.Enfim, d para fazer muita coisa com o MySQL atravs de Stored procedures e funes, que otimizam o cdigo e o torna muito mais profissional.Bom, vamos aos exemplos.Criando uma Stored ProcedureVamos supor que voc queira uma tabela para armazenar quais sesses de uma aula e quantas vezes um aluno as acessou. Voc armazena em uma tabela a nota do aluno para cada vez que ele faz os exerccios de cada aula.Ento temos as tabelas aula_sessao e aula_nota (alm das tabelas aluno e aula, claro)Voc precisa atualizar a tabela de sesso dos exerccios para cada aula que o usurio fez, dizendo o nmero de vezes que o usurio fez os exerccios daquela aula.Claro que voc pode criar um Trigger para executar isso automaticamente, mas imagina se voc comeou a monitorar os dados de sesso da aula um tempo depois que o site j estava no ar. Voc vai ter que recuperar os dados de algum lugar para a contagem no comear do zero. E para agravar ainda mais a situao, voc resolveu atualizar estes dados depois que o sistema de monitoramento j estava no ar, ou seja, j possuia dados gravados. Ento voc tem que inserir novos registros se ainda no existirem, ou atualizar os registros se j existirem.view source

print?01delimiter ;

02-- Na linha abaixo eu apago a procedure caso ela exista

03drop procedure if exists insereDados;

04

05delimiter |

06-- Na linha abaixo eu crio a procedure

07create procedure insereDados()

08begin

09

10-- Abaixo eu declaro as variveis.

11DECLARE done INT DEFAULT 0;

12declare aulaId INT;

13declare alunoId INT;

14declare vezes INT;

15declare existe CHAR(1);

16

17-- Abaixo, eu declaro um cursor que ser a minha consulta de referncia que atualizar a tabela aula_sessao

18-- Nela eu pego o id da aula, o id do aluno, a quantidade de vezes que o aluno fez os exerccios para cada aula,

19-- e verifico em uma subquery se o aluno j possui o registro daquela aula em aula_sessao

20

21DECLARE curs CURSOR FOR (

22

23select

24a.idaula,

25a.idaluno,

26count(*),

27(select if(count(*)=0,'N','S') from aula_sessao where idaluno = a.idaluno and idaula = a.idaula)

28from

29aula_nota a

30group by

31a.idaluno,a.idaula

32

33);

34

35-- Na linha abaixo, altero o valor da varivel done para um, caso nenhum resultado seja encontrado no cursor;

36DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

37

38-- Ativo o cursor

39OPEN curs;

40

41-- Comeo o loop para cada resultado encontrado no cursor

42REPEAT

43

44-- Atribuo os dados de cada campo, na ordem do select do cursor, dentro das variveis abaixo

45FETCH curs INTO aulaId, alunoId, vezes, existe;

46

47-- se done falso (done = 0) executa o que est dentro do if

48if not done then

49-- se o resultado do cursor diz que no existe o dado em aula_sessao, vou inserir o registro

50if existe = 'N' then

51insert into aula_sessao (idaula,idaluno,sessao_exercicios) values (aulaId,usuarioId,vezes);

52-- Se j existe um registro relacionando o aluno tabela aula_sessao, vou atualizar o registro

53elseif existe = 'S' then

54update aula_sessao set sessao_exercicios = vezes where idaula = aulaId and idaluno = alunoId;

55end if;

56end if;

57-- at que a variavel done receba o valor TRUE (quando no existirem resultados disponveis)

58UNTIL done END REPEAT;

59-- Fecho o cursor e finalizo a stored procedure

60CLOSE curs;

61

62end

63|

64

65delimiter ;

Para executar a procedure, basta cham-la assim:CALL insereDados();Se voc quiser apag-la depois de executada, bas dar o comando:drop procedure if exists insereDados;A mesma coisa no PHP (porm muito mais lento)O cdigo PHP abaixo faz exatamente a mesma coisa que a Stored Procedure que criamos:view source

print?01