Escolar Documentos
Profissional Documentos
Cultura Documentos
daquela aula.
view source
print?
0
delimiter ;
1
0
2
03
04
Stored procedures no retornam dados. Elas
05
delimiter |
06
07
08
09
10
11
12
13
14
15
etc.
16
1
7
2
1
8
4
9
2
0
21
23
select
24
a.idaula,
25
a.idaluno,
26
count(*),
2
7
a.idaluno,a.idaula
33
);
34
-- Na linha abaixo, altero o valor da
5
8
5
9
62
end
63
64
-- Ativo o cursor
OPEN curs;
65
delimiter ;
encontrado no cursor
o comando:
REPEAT
4
6
61
4
3
4
7
5
4
40
4
5
6
0
39
4
4
-- Se j existe um registro
5
3
37
4
2
(aulaId,usuarioId,vezes);
5
7
32
4
1
(idaula,idaluno,sessao_exercicios) values
56
group by
38
55
from
30
3
6
5
1
aula_nota a
3
5
29
31
5
0
5
2
idaula = a.idaula)
2
8
22
<?php
02
03
$sql = "
04
select
est dentro do if
05
a.idaula,
06
a.idaluno,
3
07
count(*) as vezes,
08
09
from
10
aula_nota a
acessos:
1
1
1
2
3: administrador
a.idaluno,a.idaula
14
";
15
16
fazer:
view source
17
18
19
if($r['existe']=="S")
20
2
2
1: colaborador
2: moderador
group by
13
2
1
0: comum
print?
01
02
idusuario,
03
nome,
04
05
".$r['idaluno'];
06
09
10
11
$r['vezes'].")";
2
6
from
12
usuario
13
where idusuario = 1
29
30
end) as nivelString
27
28
else
(".$r['idaula'].",".$r['idaluno'].",".
(case nivel
08
24
(idaula,idaluno,sessao_exercicios) values
email,
07
23
2
5
select
?>
delimiter ;
02
03
04
05
delimiter |
06
07
08
09
10
4
11
case nivel
12
1
3
1
4
{$campo['nivelString']}.
15
";
1
5
02
'administrador'
1
6
print?
01
<?php
function getNivelString($idnivel)
03
04
17
end;
18
return nivelString;
05
end
20
0
7
delimiter ;
0
8
21
Agora, a consulta pode ficar assim:
view source
06
19
22
switch( $idnivel )
0
9
1
0
print?
1
select
11
idusuario,
12
return $string;
nome,
13
email,
5
6
getNivelString(idnivel) as nivelString
from
7
8
usuario
where idusuario = 1
14
1
5
1
6
$campo =
17
18
1
9
view source
echo "
Ol {$campo['nome']}! Voc um usurio
" . getNivelString( $campo['idnivel'] ) .
".
print?
01
$sql = "
02
select
03
idusuario,
04
nome,
05
email,
06
getNivelString(idnivel) as nivelString
07
from
08
usuario
09
where idusuario = 1
10
";
1
1
$campo =
mysql_fetch_array( mysql_query( $sql ) );
1
2
1
3
1
2
0
";
21
?>
echo "
Ol {$campo['nome']}! Voc um usurio
5
compilados, chamados de forma explcita para executar alguma
tipo_dado.
PRIMEIRO EXEMPLO:
client digitando:
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:
Delimite
MySQL
Client
r
Bem, procedimento compilado basta executarmos o procedimento
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.
Respos
ta
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?
7
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!
T
abelaTabela
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;
BEGIN
END;
IF (((v_id > 0) && (v_id != '') ) && (v_nome != '') && (v_cpf != ''))
THEN
//
Aps compilarmos o procedimento, j poderemos cham-lo atravs
correntista_cpf =v_cpf
ELSE
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
Mensag
em
Aps executarmos a linha de insero com os valores, teremos um
registro na tabela, da seguinte forma:
8
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 backend, utilizando os procedimentos armazenados.
Na parte 02, continuao deste artigo, avanaremos bem nos
TabelaT
abela
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,
Ol pessoal!
//
Agora j podemos excluir o registro que inserimos e atualizamos!
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,
9
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:
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.
10
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-THENELSE!
Com a nossa tabela criada, criaremos nosso procedimento para efetuar o
INSERT dos dados, ou seja, um procedimento para dar carga na tabela.
Delimite
r
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.
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);
Mensage
m
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).
11
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.
T
abelaTabela
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);
12
quantidades atravs destes procedimentos
armazenados.
que o disparou;
- trigger_event: aqui se define qual ser o
13
Ao tentarmos inserir um valor cujo nmero de
- INSERT: o operador NEW.nome_coluna, nos
no est disponvel.
Figura 03.
14
produto_id definidas como NOT NULL), disparar
15
Concluso
Apresentamos neste artigo, os principais conceitos
de implementaes de TRIGGERS, com os
operadores OLD e NEW. No prximo artigo
mostrarei como impedir uma excluso de um dado
baseado em outras tabelas relacionadas e como
construir um log no banco de dados com um
TRIGGER disparado com a instruo UPDATE, onde
temos acesso ao antes e o depois das alteraes.
Figura 08 Os endereos de e-mails de clientes
sendo inseridos automaticamente por meio de
TRIGGERS.
Excluir um TRIGGER
Para excluir um TRIGGER, utilize a sintaxe DROP
TRIGGER trigger_name, como mostra o exemplo da
Figura 09.
16
09.
dt_fim_previsto =
OLD.dt_fim_previsto,
10.
dt_fim_realizado =
OLD.dt_fim_realizado,
11.
dt_replanejamento = NOW(),
12.
observacao = OLD.observacao;
13.
END IF;
14.
END;
Pra quem no est acostumado com a sintaxe das Triggers,
uma "traduo" do comando seria: Crie a trigger
LOG_REPLANEJAMENTO aps atualizaes em TAREFAS.
Para cada linha, se a data de inicio prevista for diferente da
nova data de inicio prevista, OU se a data de fim prevista
for diferente da nova data fim prevista, insira na tabela
REPLANEJAMENTOS.
Estrutura IF|ELSE
Sintaxe:
IF <condio> THEN
http://www.devmedia.com.br/articles/viewcomp.asp?
17
Para exemplificar os conceitos acima, considere o seguinte
Humberto Melo
Ayrton Senna
Xuxa
Resoluo:
problema:
Tem-se um cadastro de clientes (cdigo, nome e sexo) e
precisa-se de uma interface que liste na tela do usurio
o(s) cliente(s) de sexo feminino, masculino ou ambos,
clientes acima.
begin
if opcao = 0 then
Passo 2) Inserindo registros:
select * from tbl_clientes where sexo = F;
else
insert into tbl_clientes(nome,sexo) values(Humberto,M)
if opcao = 1 then
end if;
end $$
codigo
Nome
Sexo delimiter ;
18
Concluses e Resultados:
19
Private Sub RadioButton1_CheckedChanged(ByVal sender
flag = 2
MessageBox.Show("Opo invalida,favor escolher o sexo
cmbsexo.Enabled = False
End Sub
Else
O evento acima quando "acionado" atribui a variavel flag o
valor 2, que significa na procedure todos os sexos conforme
#######################
Dim Da As MySqlDataAdapter
rbdpersonalizada.CheckedChanged
Dim clientes As DataTable
cmbsexo.Enabled = True
Dim tableStyle As New DataGridTableStyle
End Sub
Dim colunas As New DataGridTextBoxColumn coluna do
O evento acima quando "acionado" habilita o comboBox
grid
procedure
If cmbsexo.SelectedIndex = 0 Then
########## FIM DA DECLARACAO DE VARIAVEIS
flag = 1
conexao = New MySqlConnection("server=localhost;user
Else
id=root;password=1234;database=testes")
flag = 0
End If
parametro.Value = flag
End Sub
O evento acima quando "acionado"( acionado quando
escolhido a opcao no combo), atribui a variavel flag o valor
parametro
cmdsql = New MySqlCommand("sp_lista_clientes",
conexao)
cmdsql.CommandType = CommandType.StoredProcedure
procedure.
adiciona parametro
20
Da = New MySqlDataAdapter(cmdsql)
chama procedure
Da.Fill(clientes)
tableStyle.MappingName = clientes.TableName.ToString
colunas.MappingName = "nome"
Criando Stored Procedures no MySQL
colunas.HeaderText = "nome"
A maioria das pessoas no sabe a vantagem de utilizar Stored
colunas.Width = 150
tableStyle.GridColumnStyles.Add(colunas)
------------------------------------------------------------
tableStyle.MappingName = clientes.TableName.ToString
colunas.MappingName = "codigo"
Primeiramente vamos a algumas questes.
colunas.HeaderText = "codigo"
O que uma Stored Procedure?
colunas.Width = 80
tableStyle.GridColumnStyles.Add(colunas)
dgclientes.TableStyles.Add(tableStyle)
dgclientes.DataSource = clientes
As Stored Procedures ajudam a reduzir o trfego na rede, a melhorar o
End If
vamos
ao
banco
exemplo:
21
um banco bem simples, mas s para vermos na prtica o
DELIMITER $$
INT,
VARCHAR(45),
TEXT,
BLOB...)
pela
procedures.
procedure.
BEGIN
IF(_id IS NULL) THEN
IF(_id IS NULL) THEN
SELECT * FROM pais;
ELSE
SELECT * FROM pais where id_pais = _id;
END IF;
END $$
DELIMITER ;
Caso tenha sido passado eu busco um pas com aquele id, em caso
contrrio
sero
retornados
todos
os
registros
da
tabela.
Chamando a procedure.
call listar_paises( null );
Ir trazer todos os registros da tabela
Vamos a explicao.
call listar_paises( 1 );
DELIMITER $$ Serve para marcar onde comea e onde termina a
Ir
trazer
somente
registro
do
pas
com
ID
1;