No primeiro artigo //www.devmedia.com.br/articles/viewcomp.asp?comp=4442&hl, foram apresentados os conceitos, vantagens, sintaxe básica e um exemplo de aplicação das stored procedures. Nesse próximo será apresentado mais conceitos e aplicações além de exemplos na linguagem vb.net. As stored procedures permitem que processos (condicionais, repetições , funções e etc) antes feitos dentro do código fonte do programa sejam agora todos incorporados dentro dos seus procedimentos armazenados no banco de dados, possibilitando assim códigos fontes de programas cada vez menores e mais leves no lado do cliente, mas em compensação do outro lado o servidor será mais exigido em termos de processamento do SGBD .
Estrutura IF|ELSE
Sintaxe: IF <condição> THEN <comandos sql caso verdadeiro> ELSE <comandos sql caso falso> END IF
Para exemplificar os conceitos acima, considere o seguinte problema:
Tem-se um cadastro de clientes (código, nome e sexo) e precisa-se de uma interface que liste na tela do usuário o(s) cliente(s) de sexo feminino, masculino ou ambos, conforme desejado por ele:
Resolução:
Nome Tabela: Tbl_clientes
Atributos: Código, Nome, Sexo.
Passo 1) Criando tabela Tbl_clientes:
create table tbl_clientes (
codigo int not null primary key auto_increment,
nome varchar(40) not null,
sexo char(1) not null)
Passo 2) Inserindo registros:
insert into tbl_clientes(nome,sexo) values(Humberto,M)
insert into tbl_clientes(nome,sexo) values(Ayrton Sena,M)
insert into tbl_clientes(nome,sexo) values(Xuxa,F)
Passo 3) Verificando registros:
Select * from tbl_clientes
codigo |
Nome |
Sexo |
1 |
Humberto Melo |
M |
2 |
Ayrton Senna |
M |
3 |
Xuxa |
F |
Agora o proximo passo é o foco do artigo a criação da procedure utilizando a estrutura condicional:
Passo 4) Criar uma procedure que liste os clientes masculino ou feminino ou ambos e demonstre o resultado num data grid usando VB.NET, considerando a tabela clientes acima.
Passo 4.1) Criar a procedure: (OBS: Usar o query browser para escrever a procedure).
Procedure : sp_lista_clientes
delimiter $$ create procedure sp_lista_clientes(in opcao integer) begin if opcao = 0 then select * from tbl_clientes where sexo = F; else if opcao = 1 then select * from tbl_clientes where sexo = M; else select * from tbl_clientes; end if; end if; end $$ delimiter ; |
Conclusões e Resultados:
A procedure acima utiliza os conceitos de da estrutura IF/ELSE, o resultado é uma lista dos clientes de acordo com a opção desejada.
Chamando a procedure:
Lista sexo Feminino: CALL sp_lista_clientes(0);
Lista sexo Masculino: CALL sp_lista_clientes(1);
Lista todos: CALL sp_lista_clientes(2);
OBS: na ultima chamada CALL sp_lista_clientes(2), foi escolhido a opção 2, sendo que poderá ser escolhida qualquer opção desde que seja diferente de 0 ou 1.
4.2) Interface no VB.net
Abra o visual studio 2003 , inicie um projeto windows application com a seguinte interface:
OBS:
nome dos objetos: data grid = dgclientes
radiobutton1 = rbdtodos
radiobutton2 = rbdpersonalizada
comboBox1 = cmbsexo (adicionar os items Masculino e feminino)
Variavel global: dim flag as integer variavel que servira de parametro para procedure
nos eventos checked dp radiobutton1 tratar a seguinte situacao:
Private
Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbdtodos.CheckedChangedflag = 2
cmbsexo.Enabled =
False End SubO evento acima quando "acionado" atribui a variavel flag o valor 2, que significa na procedure todos os sexos conforme visto anteriormente na criação da procedure. Além disso o cmbsexo e desabilitado pois nao faz sentido o usuario escolher o sexo se o mesmo que listar ambos.
Private
Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbdpersonalizada.CheckedChangedcmbsexo.Enabled =
True End SubO evento acima quando "acionado" habilita o comboBox cmbsexo para que o usuario possa escolher o sexo.
Private
Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbsexo.SelectedIndexChanged If cmbsexo.SelectedIndex = 0 Thenflag = 1
Elseflag = 0
End If End Sub O evento acima quando "acionado"(é acionado quando é escolhido a opcao no combo), atribui a variavel flag o valor 1, que significa na procedure sexo masculino e 0 caso seja feminino ,conforme visto anteriormente na criação da procedure.
Abaixo tem-se o evento do objeto button (pesquisar):
If
cmbsexo.Text = "Clique aqui para escolher" And rbdpersonalizada.Checked ThenMessageBox.Show("Opção invalida,favor escolher o sexo Feminino ou masculino", "Observacão", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else ##### DECLARAÇÃO DE VARIAVEIS ####################### Dim conexao As MySqlConnection Definindo variavel conexao com o BD Dim Da As MySqlDataAdapter Dim clientes As DataTable Dim tableStyle As New DataGridTableStyle Dim colunas As New DataGridTextBoxColumn coluna do grid Dim cmdsql As MySqlCommand variavel que recebera nome procedure Dim parametro As New MySqlParameter varivel parametro procedure ########## FIM DA DECLARACAO DE VARIAVEISconexao =
New MySqlConnection("server=localhost;user id=root;password=1234;database=testes")parametro.ParameterName = "opcao" declaracao do parametro da procedure
parametro.Value = flag artibuicao do valor da flag ao parametro
cmdsql =
New MySqlCommand("sp_lista_clientes", conexao)cmdsql.CommandType = CommandType.StoredProcedure definindo o tipo de comando sql
cmdsql.Parameters.Add(parametro) adiciona parametro
Da =
New MySqlDataAdapter(cmdsql) chama procedureclientes =
New DataTableDa.Fill(clientes)
tableStyle.MappingName = clientes.TableName.ToString
colunas.MappingName = "nome"
colunas.HeaderText = "nome"
colunas.Width = 150
tableStyle.GridColumnStyles.Add(colunas)
colunas =
New DataGridTextBoxColumntableStyle.MappingName = clientes.TableName.ToString
colunas.MappingName = "codigo"
colunas.HeaderText = "codigo"
colunas.Width = 80
tableStyle.GridColumnStyles.Add(colunas)
dgclientes.TableStyles.Add(tableStyle)
dgclientes.DataSource = clientes
End IfPrimeiro é testado caso a pesquisa seja personalizada se algum sexo foi escolhido, senao ele apresenta uma mengagem de erro ao usuario. A declaracao da procedure esta comentada no codigo acima. No final é apenas a configuracao das colunas do grid.
Conclusões:
- Atraves de stored procedure pode-se tratar os eventos condicionais, o que ajuda os dbas no controle de processos no banco de dados, inclusive para validar dados;
- Uma desvantagem seria mais processamento do lado do servidor.
Nota-se que com as stored procedures pode-se fazer aplicações bastantes interessantes usando estruturas IF|ELSE e em breve será demonstrada outras estruturas por exemplo: WHILE. Então pessoal mão à obra e até o próximo artigo aqui com mais coisas interessantes sobre stored procedures.
Qualquer dúvida ou sugestao: humberto@kamelmagazine.com.br