Vous êtes sur la page 1sur 13

24/5/2010

Como criar stored procedures e funçõe…

24/5/2010 Como criar stored procedures e funçõe… Página Inicial Geral javascript mysql Soluções que facilitam a
24/5/2010 Como criar stored procedures e funçõe… Página Inicial Geral javascript mysql Soluções que facilitam a

Página Inicial

Geral javascript mysql Soluções que facilitam a sua vida php

javascript mysql Soluções que facilitam a sua vida php projetos servidores wordpress Type text to search
javascript mysql Soluções que facilitam a sua vida php projetos servidores wordpress Type text to search
javascript mysql Soluções que facilitam a sua vida php projetos servidores wordpress Type text to search
projetos

projetos

servidores

servidores

wordpress

wordpress

projetos servidores wordpress

Type text to search here

servidores wordpress Type text to search here Página Inicial > mysql , php > Como criar

Página Inicial > mysql, php > Como criar stored procedures e funções no MySQL

Como criar stored procedures e funções no MySQL

11, outubro, 2009 Wellington Ribeiro Deixar um comentário Ir para os comentários

Ribeiro Deixar um comentário Ir para os comentários Olá! Hoje vou mostrar como se faz para

Olá!

Hoje vou mostrar como se faz para criar stored procedures e funções no MySQL. Stored procedures e funções são processos que você cria e ficam armazenados noMySQL, onde você pode executá-los depois. A vantagem é que o tempo de execução para consultar dados e mostrar na tela do usuário, ou executar comandos mais complexos, ficam muito mais rápidos 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 então imagine que você tenha que fazer uma consulta e executar alguns cálculos 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 instrução 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 são ótimas para se executar scripts mais complexos no banco de dados.

Com uma função, em uma única consulta você já traz os resultados prontinhos para o php somente mostrar na tela. é como se o resultado da função fosse um dado já armazenado mo MySQL.

24/5/2010

Como criar stored procedures e funçõe…

Diferença entre stored procedures e funções

Stored procedures não retornam dados. Elas executam scripts no MySQL, que podem ser desde alterações da estrutura de tabelas, até migração de dados de uma tabela para outra, ou executar ações de acordo com os resultados de uma consulta.

Funções obrigatoriamente devem retornar dados, sejam INT, CHAR, VARCHAR, BOOLEAN etc. São ótimas para fazer comparação de dados e retornar valores, executar cálculos, consultar outras tabelas diferentes de acordo com os parâmetros passados etc.

Enfim, dá para fazer muita coisa com o MySQL através de Stored procedures e funções, que otimizam o código e o torna muito mais profissional.

Bom, vamos aos exemplos.

Criando uma Stored Procedure

Vamos supor que você queira uma tabela para armazenar quais sessões 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 exercícios de cada aula.

Então temos as tabelas aula_sessao e aula_nota (além das tabelas aluno e aula, claro)

Você precisa atualizar a tabela de sessão dos exercícios para cada aula que o usuário fez, dizendo o número de vezes que o usuário fez os exercícios daquela aula.

Claro que você pode criar um Trigger para executar isso automaticamente, mas imagina se você começou a monitorar os dados de sessão 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 não começar do zero. E para agravar ainda mais a situação, você resolveu atualizar estes dados depois que o sistema de monitoramento já estava no ar, ou seja, já possuia dados gravados. Então você tem que inserir novos registros se ainda não existirem, ou atualizar os registros se já existirem.

01

delimiter ;

02

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

03

drop procedure if exists insereDados;

04

05

delimiter |

06

-- Na linha abaixo eu crio a procedure

07

create procedure insereDados()

08

begin

09

10

-- Abaixo eu declaro as variáveis.

11

DECLARE done INT DEFAULT 0;

12

declare aulaId INT;

13

declare alunoId INT;

14

declare vezes INT;

15

declare existe CHAR(1);

16

17

-- Abaixo, eu declaro um cursor que será a minha consulta de referência 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 exercícios para cada aula,

24/5/2010

Como criar stored procedures e funçõe…

19

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

20

21

DECLARE curs CURSOR FOR (

22

23

select

24

a.idaula,

25

a.idaluno,

26

count(*),

27

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

28

from

29

aula_nota a

30

group by

31

a.idaluno,a.idaula

32

33

);

34

35

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

36

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

37

38

-- Ativo o cursor

39

OPEN curs;

40

41

-- Começo o loop para cada resultado encontrado no cursor

42

REPEAT

43

44

-- Atribuo os dados de cada campo, na ordem do select do cursor, dentro das variáveis abaixo

45

FETCH curs INTO aulaId, alunoId, vezes, existe;

46

47

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

48

if not done then

49

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

50

if existe = 'N' then

51

insert 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

53

elseif existe = 'S' then

54

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

55

end if;

56

end if;

57

-- até que a variavel done receba o valor TRUE (quando não existirem resultados disponíveis)

58

UNTIL done END REPEAT;

59

-- Fecho o cursor e finalizo a stored procedure

60

CLOSE curs;

61

62

end

63

|

64

65

delimiter ;

24/5/2010

Como criar stored procedures e funçõe…

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 (porém muito mais lento)

O código PHP abaixo faz exatamente a mesma coisa que a Stored Procedure que criamos:

01

<?php

02

03

$sql = "

04

select

05

a.idaula,

06

a.idaluno,

07

count(*) as vezes,

08

if(s.id is null,'N','S') as existe

09

from

10

aula_nota a

11

left join aula_sessao s on s.idaula = a.idaula and s.idaluno = a.idaluno

12

group by

13

a.idaluno,a.idaula

14

";

15

$res = mysql_query( $sql );

16

17

while( $r = mysql_fetch_array( $res ) )

18

{

19

if($r['existe']=="S")

20

{

21

$sql = "update aula_sessao set sessao_exercicios = ".$r['vezes']." where idaula = ".$r['idaula']." and idusuario = ".$r['idaluno'];

22

}

23

else

24

{

25

$sql = "insert into aula_sessao (idaula,idaluno,sessao_exercicios) values (".$r['idaula'].",".$r['idaluno'].",".$r['vezes'].")";

26

}

27

mysql_query( $sql );

28

}

29

30

?>

A desvantagem é que a cada vez que você dá o comando mysql_query(), uma nova conexão é aberta com o

banco. Então, se o resultado da primeira query tem muitas linhas, o tempo de execução será muito grande, o

uso de processador será absurdo, você poderá perder dados durante o tempo de execução do script, além de poder derrubar o servidor MySQL (acontece muito na plataforma windows ou de acordo com as configurações do servidor).

Usando a Stored Procedure, além da velocidade de execução ser absurdamente maior, você mantém a consistência de dados, pois o MySQL sabe se algum dado foi inserido durante a execução do script e o atualiza também, se for o caso.

24/5/2010

Criando uma função no MySQL

Como criar stored procedures e funçõe…

Vou mostrar um exemplo simples para ilustrar.

Vamos supor que você tem uma tabela de usuários que te traz o nivel de acesso de cada um deles. Vamos supor que temos os seguintes níveis de acessos:

0: comum

1: colaborador

2: moderador

3: administrador

Você quer apresentar esta informação para o usuário. Para fazer isso somente uma vez, basta na sql você fazer:

01

select

02

idusuario,

03

nome,

04

email,

05

(case nivel

06

when 0 then 'comum'

07

when 1 then 'colaborador'

08

when 2 then 'moderador'

09

when 3 the 'administrador'

10

end) as nivelString

11

from

12

usuario

13

where idusuario = 1

Você pode simplesmente criar uma função para pegar a string que diz o nivel de acesso do usuário, com a vantagem de poder usá-la em várias sqls, sem ter a necessidade de fazer o CASE toda vez que você precisar obter esse dado. Além disso, a manutenção fica muito mais simples se você quiser, por exemplo, acrescentar mais um nível de acesso. Basta alterar a função.

Então vamos criar:

01

delimiter ;

02

03

drop function if exists getNivelString;

04

05

delimiter |

06

07

create function getNivelString(nivel INT)

08

returns varchar(45)

09

begin

10

declare nivelString varchar(45);

11

case nivel

12

when 0 then nivelString = 'comum'

13

when 1 then nivelString = 'colaborador'

14

when 2 then nivelString = 'moderador'

15

when 3 then nivelString = 'administrador'

16

else nivelString = 'comum'

17

end;

18

return nivelString;

24/5/2010

Como criar stored procedures e funçõe…

19

end

20

|

21

22

delimiter ;

Agora, a consulta pode ficar assim:

1

select

2

idusuario,

3

nome,

4

email,

5

getNivelString(idnivel) as nivelString

6

from

7

usuario

8

where idusuario = 1

Lembrando que este é um exemplo bem simples diante da infinidade de coisas que se pode fazer.

Agora, o php para mostar os dados fica bem simples:

01

$sql = "

02

select

03

idusuario,

04

nome,

05

email,

06

getNivelString(idnivel) as nivelString

07

from

08

usuario

09

where idusuario = 1

10

";

11

$campo = mysql_fetch_array( mysql_query( $sql ) );

12

13

echo "

14

Olá {$campo['nome']}! Você é um usuário {$campo['nivelString']}.

15

";

A mesma coisa em PHP

01

<?php

02

function getNivelString($idnivel)

03

{

04

switch( $idnivel )

05

{

06

case 0: $string = 'comum'; break;

07

case 1: $string = 'colaborador'; break;

08

case 2: $string = 'moderador'; break;

09

case 3: $string = 'administrador'; break;

10

default $string = 'comum'

11

}

12

return $string;

13

}

14

15

$sql = "select idusuario, nome, email, idnivel from usuario where idusuario = 1";

16

$campo = mysql_fetch_array( mysql_query( $sql ) );

17

24/5/2010

Como criar stored procedures e funçõe…

18

echo "

19

Olá {$campo['nome']}! Você é um usuário " . getNivelString( $campo['idnivel'] ) . ".

20

";

21

?>

Os exemplos dados aqui são apenas para demostrar como criar e usar funções e stored procedures no MySQL. Os exemplos são simples, mas você pode adaptá-los às suas necessidades.

Espero que este artigo tenha sido útil para você. Demorei um bom tempo para escrevê-lo

Deixe um comentário!

Até a próxima!

para escrevê-lo Deixe um comentário! Até a próxima! Categories: mysql , php Tags: criar stored procedures
para escrevê-lo Deixe um comentário! Até a próxima! Categories: mysql , php Tags: criar stored procedures

Categories: mysql, php Tags: criar stored procedures, mysql, mysql stored procedures, php, procedure, store procedures, stored procedure, stored procedures sql, stored procedures tutorial

Deixe seu comentário

Comentários (10) Trackbacks (0) Deixar um comentário Trackback

1.

(10) Trackbacks (0) Deixar um comentário Trackback 1. Alexandre 12, março, 2010 em 16:52 | #1

Alexandre 12, março, 2010 em 16:52 | #1 Resposta | Citação

Sobre: “Como criar stored procedures e funções no MySQL”

Uma dúvida, ao invés de usa um case para gerar as opções de níveis, como seria se esses níveis se a função precisasse desses níveis de uma tabela? +-+—————-+ |id|descricao | +-+—————–+

| 0|comum |

| 1|colaborador |

| 2|moderador |

| 3|administrador|

+-+—————–+

| | 2|moderador | | 3|administrador| +-+—————–+ Wellington Ribeiro 15, março, 2010 em 10:53 | #2

Wellington Ribeiro 15, março, 2010 em 10:53 | #2 Resposta | Citação

Alexandre, desculpe-me, mas não consegui entender o que você quis dizer. Você pode ser mais claro?

24/5/2010

Como criar stored procedures e funçõe…

2.

2.

Alessandro 14, abril, 2010 em 17:24 | #3 Resposta | Citação

Há menos de 1 ano comecei a programar algumas aplicações com php e javascript com banco de dados mySql. Porém, realizo todas as minhas consultas através de instruções sql no próprio código fonte do php. A minha pergunta, apesar de que talvez seja muito tola, é:

Onde e como declaro/amarzeno stored procedures? (isto é, no próprio código php? através de algum script no servidor do bd?)

Obrigado pela ajuda!

de algum script no servidor do bd?) Obrigado pela ajuda!   Wellington Ribeiro 15, abril, 2010
de algum script no servidor do bd?) Obrigado pela ajuda!   Wellington Ribeiro 15, abril, 2010
 

Wellington Ribeiro 15, abril, 2010 em 15:56 | #4 Resposta | Citação

Ao criar uma stored procedure, ela é armazenada no próprio servidor MySQL, asssim como triggers e funções. O MySQL possui um banco padrão onde ele armazena os metadados, chamado information_schema.

Dessa forma, você pode acessar as funções e procedures fazendo a seguinte consulta:

select * from information_schema.routines;

E os triggers com a consulta select * from information_schema.triggers;

ao executar o script deste tutorial, automaticamente a procedure/função fica armazenada, e para executar basta executar a sql call procedure_name(); ou select function_name();

Stored procedures e funções são muito mais rápidas de serem executadas do que scripts SQL/PHP, poupando memória e processamento do servidor, otimizando o site. Obviamente, para dar saída na tela, você precisa de usar um script server side, como o php. Repare também que as procedures não retornam dados, enquanto que as funções sim.

Espero ter ajudado.

Att,

3.

3.

Wellington Ribeiro 15, abril, 2010 em 16:03 | #5 Resposta | Citação

@Alexandre Se o que você quer é trazer dados de uma outra tabela, basta dar um join com esta tabela onde está

24/5/2010

Como criar stored procedures e funçõe…

armazenado o dado. E a sql ficaria assim:

select u.idusuario, u.nome, u.email, n.nivel_str from usuario u inner join nivel n on n.id = u.idnivel where u.idusuario = 1

Lembrando que eu usei um caso simples para exemplificar o uso de uma função. Obviamente, esta solução é melhor para manutenção do que o uso de uma função.

Att,

4.

4.

roberta 14, maio, 2010 em 11:54 | #6 Resposta | Citação

Bom dia Wellington! Eu conseguir fazer a procedure usando o MySQL Query Browser, porém preciso faze -lá usando phpmyadmin. No phpmyadmin aparece que mensagem que o comando foi executado com sucesso, mas não constrói. Vc sabe o que pode está acontecendo.

mas não constrói. Vc sabe o que pode está acontecendo.   Wellington Ribeiro 15, maio, 2010
mas não constrói. Vc sabe o que pode está acontecendo.   Wellington Ribeiro 15, maio, 2010
 

Wellington Ribeiro 15, maio, 2010 em 14:05 | #7 Resposta | Citação

Olá Roberta! me desculpe pela demora em responder.

bom, para saber se a stored procedure foi criada, execute o seguinte comando:

select * from information_schema.ROUTINES;

A procedure deve estar lá. Depois, para executar, execute

call nome_da_procedure();

Apaguei seus outros comentários, a seu pedido.

Att,

5.

5.

roberta 17, maio, 2010 em 09:31 | #8

24/5/2010

Resposta | Citação

Como criar stored procedures e funçõe…

Olá Wellington! Obrigada pela resposta. Eu executei os comandos, que vc ensinou. Aparece a procedure criada, mas quando eu executo o comando call nome_da_procedure(); Aparece a seguinte mensagem: #1312 – PROCEDURE bdoc2010.sp_prob_setor_mun can’t return a result set in the given context. Porém usando o comando no MySQL Query Browser , ele retorna o resultado.

Estou usando a seguinte estrutura para criar a procedure :

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_teste` $$ CREATE PROCEDURE `sp_teste` () BEGIN

END $$

DELIMITER ;

Vc sabe o que pode está acontecendo?

Muito obrigada pela ajuda!!

o que pode está acontecendo? Muito obrigada pela ajuda!! Wellington Ribeiro 17, maio, 2010 em 23:39

Wellington Ribeiro 17, maio, 2010 em 23:39 | #9 Resposta | Citação

Oi Roberta.

Bom, parece que a procedure está retornando dados… Uma procedure não deve retornar dados, a não ser para fins de debug da mesma, e via linha de comando. Uma procedure deve ser executada somente para fazer operações no banco, sem retornar nada. Se você pretende retornar dados, crie uma função.

De qualquer forma, me envie a sql utilizada para criação da procedure, de preferência por email, para eu dar uma olhada…

6.

de preferência por email, para eu dar uma olhada… 6. roberta 18, maio, 2010 em 09:11

roberta 18, maio, 2010 em 09:11 | #10 Resposta | Citação

Oi Wellington! Qual é o seu email? obrigada!!

24/5/2010

1. Nenhum trackback ainda.

Como criar stored procedures e funçõe…

trackback ainda. Como criar stored procedures e funçõe… Nome (obrigatório) E-Mail (não será publicado)
trackback ainda. Como criar stored procedures e funçõe… Nome (obrigatório) E-Mail (não será publicado)
trackback ainda. Como criar stored procedures e funçõe… Nome (obrigatório) E-Mail (não será publicado)

Nome (obrigatório)

E-Mail (não será publicado) (obrigatório)

Website

E-Mail (não será publicado) (obrigatório) Website Inscrever no feed de comentários Enviar comentário

Inscrever no feed de comentários

Enviar comentário (Ctrl+Enter)
Enviar comentário (Ctrl+Enter)

Ferramenta do Orkut – os usuários podem anunciar de graça Salvar como em php – download de arquivos RSS

Twitter

Recent Posts

fixPng Jquery Plugin ie6em php – download de arquivos RSS Twitter Recent Posts Como criar um disco virtual Simple

Como criar um disco virtualarquivos RSS Twitter Recent Posts fixPng Jquery Plugin ie6 Simple AutoComplete JQuery Plugin Inteligência Artificial

Simple AutoComplete JQuery PluginPosts fixPng Jquery Plugin ie6 Como criar um disco virtual Inteligência Artificial Google anuncia contratações no

Inteligência Artificialcriar um disco virtual Simple AutoComplete JQuery Plugin Google anuncia contratações no Brasil

Google anuncia contratações no Brasilvirtual Simple AutoComplete JQuery Plugin Inteligência Artificial …idealmind.com.br/…/como-criar-store… 11/13

24/5/2010

Como criar stored procedures e funçõe…

Apresentando o CSS 3 e o HTML 524/5/2010 Como criar stored procedures e funçõe… Aulas de conversação de inglês grátis 544 dicas para

Aulas de conversação de inglês grátisprocedures e funçõe… Apresentando o CSS 3 e o HTML 5 544 dicas para otimização da

544 dicas para otimização da taxa de conversão de usuárioso CSS 3 e o HTML 5 Aulas de conversação de inglês grátis Arte digital –

Arte digital – crie seu som – inspiraçãodicas para otimização da taxa de conversão de usuários Post into twitter using SMS from your

Post into twitter using SMS from your cell phonede usuários Arte digital – crie seu som – inspiração Tag Cloud .htaccess amazon S3 apache

Tag Cloud

.htaccess amazon S3 apache autocompletar autocomplete ajax autocomplete html autocomplete javascript autocomplete php background png ie6 bat cmd code highlight code markup code syntax combobox autocomplete criar banco

de dados css css menu download executar arquivos sql fix png ie6 httpd.conf importar dados input autocomplete javascript linha de comando mod_proxy mod_rewrite mysql parâmetros do php para javascript passar parâmetros php png ie6 css png no

ie6 png transparente ie6 png transparent ie6 prompt salvar como save as variáveis do php para js wordpress wordpress

plugin wordpress plugin code markup wp-syntax wp plugin code highlight

Categorias

Geralcode markup wp-syntax wp plugin code highlight Categorias javascript mysql php projetos servidores wordpress Páginas

javascriptmarkup wp-syntax wp plugin code highlight Categorias Geral mysql php projetos servidores wordpress Páginas Sobre

mysqlwp plugin code highlight Categorias Geral javascript php projetos servidores wordpress Páginas Sobre Archives

phpwp plugin code highlight Categorias Geral javascript mysql projetos servidores wordpress Páginas Sobre Archives abril

projetosplugin code highlight Categorias Geral javascript mysql php servidores wordpress Páginas Sobre Archives abril 2010

servidoreshighlight Categorias Geral javascript mysql php projetos wordpress Páginas Sobre Archives abril 2010 março 2010

wordpressCategorias Geral javascript mysql php projetos servidores Páginas Sobre Archives abril 2010 março 2010 fevereiro

Páginas

Sobrejavascript mysql php projetos servidores wordpress Páginas Archives abril 2010 março 2010 fevereiro 2010 janeiro 2010

Archives

abril 2010php projetos servidores wordpress Páginas Sobre Archives março 2010 fevereiro 2010 janeiro 2010 dezembro 2009

março 2010servidores wordpress Páginas Sobre Archives abril 2010 fevereiro 2010 janeiro 2010 dezembro 2009 novembro 2009

fevereiro 2010wordpress Páginas Sobre Archives abril 2010 março 2010 janeiro 2010 dezembro 2009 novembro 2009 outubro 2009

janeiro 2010Sobre Archives abril 2010 março 2010 fevereiro 2010 dezembro 2009 novembro 2009 outubro 2009 setembro 2009

dezembro 2009Archives abril 2010 março 2010 fevereiro 2010 janeiro 2010 novembro 2009 outubro 2009 setembro 2009 Meta

novembro 20092010 março 2010 fevereiro 2010 janeiro 2010 dezembro 2009 outubro 2009 setembro 2009 Meta Registrar-se Login

outubro 20092010 fevereiro 2010 janeiro 2010 dezembro 2009 novembro 2009 setembro 2009 Meta Registrar-se Login Topo WordPress

setembro 20092010 janeiro 2010 dezembro 2009 novembro 2009 outubro 2009 Meta Registrar-se Login Topo WordPress Direitos reservados

Meta

Registrar-sedezembro 2009 novembro 2009 outubro 2009 setembro 2009 Meta Login Topo WordPress Direitos reservados © 2009-2010

Loginnovembro 2009 outubro 2009 setembro 2009 Meta Registrar-se Topo WordPress Direitos reservados © 2009-2010 idealMind

Topo WordPress Direitos reservados © 2009-2010 idealMind Tema criado por NeoEase. Validar XHTML 1.1 e CSS 3.

SEO Powered by Platinum SEO from Techblissonline

24/5/2010

Como criar stored procedures e funçõe…