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:

imagem.jpg

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.CheckedChanged

flag = 2

cmbsexo.Enabled = False

End Sub

O 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.CheckedChanged

cmbsexo.Enabled = True

End Sub

O 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 Then

flag = 1

Else

flag = 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 Then

MessageBox.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 VARIAVEIS

conexao = 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 procedure

clientes = New DataTable

Da.Fill(clientes)

tableStyle.MappingName = clientes.TableName.ToString

colunas.MappingName = "nome"

colunas.HeaderText = "nome"

colunas.Width = 150

tableStyle.GridColumnStyles.Add(colunas)

colunas = New DataGridTextBoxColumn

tableStyle.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 If

Primeiro é 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