quinta-feira, 19 de maio de 2011

#10 - Criação de Procedures

A criação de uma Storage Procedure é um coisa bem simples que pode facilitar muito o trabalho quando desejar muito comandos Updates e/ou Insertes.

para criar uma procedure bastar iniciar com o seguinte comando:

CREATE PROCEDURE [PROC_TESTE] 
AS

END

se você precisa que passar algum parâmetro basta colocar na frente o seguinte comando:

CREATE PROCEDURE [PROC_TESTE]  (@var1 datetype, @var2 datetype)
AS

END

essa é a forma mais simples de criar uma storage procedure, mas nesse caso a SP não irá fazer nada porque não tem nenhum comando para realizar, vamos adicionar algumas coisas interessantes. Para fazer uma declaração de variáveis você deve declarar da seguinte forma:

CREATE PROCEDURE [PROC_TESTE]  (@var1 datetype, @var2 datetype)
AS
   declare @vt1 int
   declare @vt2 date
   declare @err_instrucao varchar(255)
BEGIN
END

Você pode colocar N variáveis de acordo a sua necessidade, não tem um limite pra isso mas lembre-se que todas as variáveis devem estar devidamente declaradas e com os tipos certos (varchar, int, date, text, char e outros).

As variáveis colocadas no início da chamada da SP já estão setadas com os devidos valores, mas as variáveis que foram declaradas durante precisam receber os seus valores, para isso existe duas maneiras de fazer isso.
   1-
              SET @vt2 = GETDATE()
   2 -
              SELECT @2 = DT_NASC FROM TB1

Eu costumo usar o Transaction Isolation para isolar as todas as transações quer forem feitas e bloquear que outras transações façam alterações nas linhas. Também uso o Begin Tran para definir uma transação e validar se tudo está sendo feito corretamente fazendo um Commit, caso contrário posso definir que todos os comandos executados possam dar um Rollback.

CREATE PROCEDURE [PROC_TESTE]  (@var1 datetype, @var2 datetype)
AS
   declare @vt1 int
   declare @vt2 date
   declare @err_instrucao varchar(255)
BEGIN
   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   begin transaction

   
       SET @err_instrucao = 'motivo do erro'
          UPDATE TB_TESTE SET [num_cpf] = '00000000000' where [cod_teste] = 2
       if (@@error <> 0 ) goto err_instrucao
   commit transaction
END

A instrução  "if (@@error <> 0 ) goto err_instrucao" serve para validar se o comando anterior foi executado com sucesso, você pode colar esse comando após cada comando de Insert, Update e Delete, se o comando for executado com sucesso retorna 0 caso contrário vai retornar outro código de erro.


CREATE PROCEDURE [PROC_TESTE]  (@var1 datetype, @var2 datetype)
AS
   declare @vt1 int
   declare @vt2 date
   declare @err_instrucao varchar(255)
BEGIN
   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   begin transaction
   
       SET @err_instrucao = 'motivo do erro'
          UPDATE TB_TESTE SET [num_cpf] = '00000000000' where [cod_teste] = 2
       if (@@error <> 0 ) goto err_instrucao
   commit transaction
   return 0
err_instrucao:
raiserror (@err_update,16,1)
      rollback transaction
      return 1
END


Adicionei a função "raiserror (@err_update,16,1)"   essa função serve para apresentar o erro personalizado conforme a sua mensagem que você definir para ficar mais fácil.  Analisando a estrutura você verá que tem um rollback transaciton que irá desfazer a transação se der algum erro.  Gosto de colocar um "return" para o caso de estar trabalhando em conjunto com outras aplicações que precisam saber se deu certo ou não a SP, isso fica mais fácil de controlar.


Particularmente eu gosto de trabalhar desta maneira na criação de SP, para garantir que as transações sejam executadas da melhor forma e prevendo possíveis erros.


Se você tem alguma sugestão ou outro método de fazer compartilhe com os leitores.

Nenhum comentário:

Postar um comentário