You are on page 1of 7

http://imasters.uol.com.

br/artigo/7556/mysql/stored_procedures_no_mysql/

Stored Procedures no MySQL


Ol pessoal!
Gostaria, antes de mais nada, agradecer ao pessoal do iMasters pelo
convite e salientar aqui que me sinto muito feliz com mais esse advento.
Neste artigo (usarei um servidor SUPERION da SunSix, rodando Ubuntu
6.06 LTS com MySQL 5.0.37 Community Version), iniciaremos uma
viagem interessante sobre todo o mundo dos procedimentos
armazenados ou stored routines, cujo conceito principal que so
"programas armazenados no servidor, pr-compilados, chamados de
forma explcita para executar alguma lgica de manipulao de dados,
podendo retornar ou no algum valor".
Mal comeamos e j temos o conceito de stored procedure ou stored
routines. No caso do MySQL, os procedimentos armazenados esto
disponveis exatamente desde a verso 5.0, que foi um marco na
evoluo do SGBD OpenSource mais utilizado no mundo.
Necessariamente, voc precisar ter instalado na sua mquina o MySQL
5++ e o MySQL Client (este disponibilizado no momento da instalao
do server) . Utilizarei tambm o MySQL Query Browser para tornar nossa
experincia mais interessante com o MySQL e sair um pouco da linha de
comando, mas anda grade parte ser utilizando o mysql client.
Antes de entrarmos na sintaxe, ainda temos que registrar aqui que os
procedimentos armazenados, quando criados e compilados, so
inseridos em uma tabela chamada ROUTINES no banco de dados
INFORMATION_SCHEMA, que o dicionrio de dados do MySQL. Para
listarmos todos os stored routines (Stored Procedure e Functions), basta
emitirmos o seguinte comando no mysql client:
mysql> SELECT * FROM INFORMATION_SCHEMA.ROUTINES;
Perceba que listamos todos os procedimentos armazenados (Stored
Procedure e Functions), de todos os bancos de dados. Saliento que
estamos listando somente Stored Procedure e Functions, pois, somente
estas rotinas so gravadas na tabela ROUTINES do bancos de dados
INFORMATION_SCHEMA. Triggers tambm so um tipo de procedimento
armazenado, mas esto separadas em outra tabela do dicionrio,
chamada TRIGGERS.
mysql> SELECT * FROM INFORMATION_SCHEMA.TRIGGERS;
A sintaxe geral para criao de Stored Procedure a seguinte:
CREATE PROCEDURE proc_name([parameters, ...])
[characteristics]
[BEGIN]

corpo_da_rotina;

[END]
Explicando...
proc_name: seu procedimento armazenado deve ter um nome, para
quando for chamado, podermos ento us-lo;
tipo_param: existem 3 tipos de parmetros em uma Stored Procedure no
MySQL:
IN => este um parmetro de entrada, ou seja, um parmetro cujo seu valor ser
utilizado no interior do procedimento para produzir algum resultado;
OUT => est parmetro retorna algo de dentro do procedimento para o lado externo,
colocando os valores manipulados disponveis na memria ou no conjunto de
resultados;
INOUT => faz os dois trabalhos ao mesmo tempo!

parameters: nessa parte do procedimento, informaremos os parmetros


da seguinte forma: [IN | OUT | INOUT] nome_parametro tipo_dado.
characteristics: as caractersticas do procedimento pode apresentar.
Como no utilizaremos inicialmente tais caractersticas, vamos nos ater
a sintaxe principal. Questes de segurana, se determinstica ou no,
qual a linguagem que estamos utilizando e se nosso procedimento
modificar dados na banco de dados, so algumas das caractersticas
que poderemos definir neste item que abordaremos com mais detalhe
na parte dois do artigo.
corpo_da_rotina: onde so definidos os comandos SQL que faro alguma
manipulao e/ou defendero alguma lgica, podendo retornar ou no
algum resultado.
PRIMEIRO EXEMPLO:
Nesse primeiro exemplo, implementaremos um Stored Procedure bem
simples, que nos devolver um "OL"! Abra um terminal do seu Linux ou
mesmo um prompt do seu Windows e entre no mysql client digitando:
shell> mysql -u nome_usuario -psenha,
Usarei neste artigo o banco de dados chamado test, que j vem criado
desde a instalao do MySQL. Caso no conste no seu, use um banco de
dados de sua preferncia.
Caso prefira, podemos usar tambm o MySQL Query Browser (voc
poder baix-lo em http://dev.mysql... dentro de um pacote chamado
GUI Tools). No Windows basta instalar e no Linux basta descompactar o
pacote TAR e executar.
Se voc optou pelo MySQL Client, nesse momento estamos nesse ponto:
MySQL Client
Se voc tiver optado por trabalhar com o MySQL Query Browser,
estamos nesse ponto:

MySQL Query Browser


Pronto! O Query Browser j nos deu quase tudo pronto para escrevermos
somente os parmetros que teremos no nosso procedimento e o corpo
da rotina. Notem que utilizado o operador DELIMITER para mudar o
delimitador de comandos, que por padro o ";". Mudamos o
DELIMITADOR para podermos usar o ";" no meio do procedimento. Caso
no efetuemos essa troca, o procedimento ser enviado pela metade e
um erro ser enviado ao terminal, por erro na sintaxe.
DELIMITADOR no MySQL, em outras situaes, por padro tambm
chamado de terminador. Para verificar qual o delimitador da sesso
corrente emita o comando \s, que a forma curta do comando STATUS.

Delimiter
Bem, procedimento compilado basta executarmos o procedimento com o
seguinte comando:
CALL OLA();
OBS.: Aps a verso 5.1.18, no mais necessrio os parnteses caso o
procedimento no receba parmetros.
A resposta do procedimento ser "OL!" como definimos.

Resposta
Bom, agora que j temos uma noo bsica de como implementado
um procedimento armazenado no MySQL, j podemos partir para
aplicaes do mundo real, tais como, manipular inseres de dados,
excluses de registros e atualizaes de linhas de uma ou mais tabelas.
Tudo isso nos levar a aportar l na frente no conceito de transaes,
onde desenvolveremos um procedimento para simulao de
transferncia de valor entre contas bancrias de mesma agncia.
Como seria ento, um procedimento para inserir dados em uma tabela
do banco de dados?
Bom, antes de prosseguirmos, criaremos uma tabela, de nome
tbl_correntista, que ter os campos correntista_id do tipo INT,
correntista_nome do tipo VARCHAR(60) e correntista_cpf do tipo
VARCHAR(20).
CREATE TABLE tbl_correntista (
correntista_id int auto_increment primary key,
correntista_nome varchar(60) not null unique,
correntista_cpf varchar(20) not null,
dt_cadastro timestamp default current_timestamp,
) Engine =InnoDB;
Pronto! Aps executarmos o script acima nossa tabela estar criada e j
poderemos dar carga atravs de um procedimento armazenado, onde
tambm utilizaremos em meio a este, estruturas condicionais, IF-THEN-
ELSE!
Com a nossa tabela criada, criaremos nosso procedimento para efetuar
o INSERT dos dados, ou seja, um procedimento para dar carga na tabela.
DELIMITER //
CREATE PROCEDURE mySp_correntistaInsert(v_nome VARCHAR(60), v_cpf
VARCHAR(20))
BEGIN
IF ((v_nome != '') && (v_cpf != '')) THEN
INSERT INTO tbl_correntista (correntista_nome, correntista_cpf)
VALUES (v_nome, v_cpf);
ELSE
SELECT 'NOME e CPF devem ser fornecidos para o cadastro!' AS Msg;
END IF;
END;
//
Aps compilarmos o procedimento, j poderemos cham-lo atravs da
declarao CALL, como se segue:
CALL mySp_correntistaInsert('Wagner Bianchi', '023.456.789-10');
...notem que utilizamos em meio ao nosso procedimento de insero, a
estrutura condicional para consistir o valor das variveis. Caso os
valores de ambas sejam vazios, a mensagem ser disparada, como
segue abaixo:

Mensagem
Aps executarmos a linha de insero com os valores, teremos um
registro na tabela, da seguinte forma:

TabelaTabela
Temos mais dois procedimentos, fceis, para complementar essa
primeira parte do artigo. Faremos a seguir, um procedimento, com o
mesmo formato para atualizarmos o registro da nossa tabela
"tbl_correntista", que at o momento encontra-se com um registro.
Sero trs agora, o identificador do registro - v_id - , o novo nome do
correntista - v_nome - e o novo cpf - v_cpf -.
Vamos l!
DELIMITER //
CREATE PROCEDURE mySp_correntistaUpdate(v_id INT, v_nome VARCHAR(60), v_cpf
VARCHAR(20))
BEGIN
IF (((v_id > 0) && (v_id != '') ) && (v_nome != '') && (v_cpf != '')) THEN
UPDATE tbl_correntista SET correntista_nome =v_nome,
correntista_cpf =v_cpf
WHERE correntista_id =v_id;
ELSE
SELECT 'O novos NOME e CPF devem ser informados!' AS Msg;
END IF;
END;
//
J podemos, aps compilarmos o procedimento de UPDATE, atualizarmos
nosso registro na tabela de correntistas. Depois de compilado com
sucesso, j podemos chamar nosso procedimento de atualizao e
passar os parmetros para atualizar o registro que temos na tabela.
CALL mySp_correntistaUpdate(1, 'Wagner MySQL Bianchi', '123.123.111-
11');

TabelaTabela
Note que este procedimento poder facilmente ser adaptado em
qualquer sistema que receba o identificador do registro a ser atualizado
em uma tabela qualquer de um banco de dados. Sistemas web passam
parmetros com facilidade vi POST ou GET, de forma que podero ser
entregues como parmetro ao procedimento.
Para finalizarmos, faremos um procedimento para excluir registros, que
o mais trivial de todos, basta mais uma vez enviarmos o identificador
do registro como parmetro e efetuarmos a excluso aps a conferncia
como estamos fazendo nos outros procedimentos.
Note que, em um sistema, voc poder implementar um nico
procedimento para excluso de registros, que receber alguns
parmetros como o identificador, o nome da tabela e o nome da coluna,
mas, nesse momento, nos atentaremos para o simples, nos prximos
artigos sofisticaremos um pouco mais nossos procedimentos.
DELIMITER //
CREATE PROCEDURE mySp_correntistaDelete(v_id INT)
BEGIN
IF ((v_id > 0) && (v_id != '')) THEN
DELETE FROM tbl_correntista WHERE correntista_id =v_id;
ELSE
SELECT 'O identifiador do registro no foi informado!' AS Msg;
END IF;
END;
//
Agora j podemos excluir o registro que inserimos e atualizamos! Segue
a sintaxe para isso:
CALL mySp_correntistaDelete(1);
Bom, espero que este artigo, ainda na primeria fase, com aplicaes de
procedimentos muito bsicos, possam trazer uma iniciao em stored
procedure no MySQL a todos que buscam aprender a manejar este
recurso que de grande proveito, principalmente para sistemas que
necessitam de modularidade e otimizao quanto performance.
Por outro lado, voc poder ficar preso ao MySQL (que no mal
negcio) ou qualquer outro SGBD que voc v usar para ser back-end,
utilizando os procedimentos armazenados.
Na parte 02, continuao deste artigo, avanaremos bem nos conceitos
e j falaremos de transaes com vrios comandos dentro de uma
Stored Procedures ou Stored Routines, trabalhando com criao de
variveis, iteraes e savepoints, iniciando nossa aplicao de
transferncia de valores entre contas bancrias de mesma agncia, que
tambm necessitar uma pequena introduo nos conceitos de commit
e rollback. Ou seja, transao.
Em breve os artigos sero escritos utilizando o MySQL 6.0. Muitos
outros recursos, aguardem!

You might also like