none
Procedure #Dúvida RRS feed

  • Pergunta

  • Olá amigos do Fórum... Me desculpem se a dúvida é 'boba', mas sou iniciante e estou fazendo uma procedure de exclusão de um país que em tese deve funcionar da seguinte maneira:

    Registros cujo campo SISTEMA estiverem com a opção 'S' não poderão ser excluídos (São arquivos do sistema). 

    Gostaria de saber se esta procedure está correta assim ou se precisa de melhorias... é que tenho dúvidas de como se faz o controle de transação e dos retornos para a aplicação... enfim, ela está certa assim ou precisa de melhorias nos aspectos trat. de exceções, transição, RAIERROR, etc?

    Abraço a todos!

    ======================================================================

    CREATE PROCEDURE uspPaisExcluir

    @IDPais INT,
    @Sistema VARCHAR(1)

    AS
    BEGIN

    IF @Sistema = 'N'
    BEGIN
    BEGIN TRY
    BEGIN TRAN

    DELETE FROM 
    tbPais
    WHERE IDPais = @IDPais;

    SELECT @IDPais AS Retorno;
    COMMIT

    END TRY
    BEGIN CATCH
    ROLLBACK TRAN
    SELECT ERROR_MESSAGE() AS Retorno;
    END CATCH
    END
    ELSE
    RAISERROR('Não é permitida a exclusão de arquivos do sistema.', 14, 1);



    END



    • Editado JR-Master sexta-feira, 3 de julho de 2015 13:33
    sexta-feira, 3 de julho de 2015 13:26

Respostas

  • Jalber,

    Estas funções:

              ERROR_NUMBER(),
              ERROR_SEVERITY(),
              ERROR_STATE(),
              ERROR_PROCEDURE(),
              ERROR_MESSAGE(),
              ERROR_LINE()   

    São novas funcionalidades que foram introduzidos no Microsoft SQL Server a partir da versão 2005, que permitem justamente fazer um tratamento de erros ou exceções de forma mais inteligente e elegante, estes links podem te ajudar:

    TRY...CATCH (Transact-SQL)                           
    sys.messages (Transact-SQL)                           
    ERROR_NUMBER (Transact-SQL)                           
    ERROR_MESSAGE (Transact-SQL)                           
    ERROR_PROCEDURE (Transact-SQL)                           
    ERROR_SEVERITY (Transact-SQL)                           
    ERROR_STATE (Transact-SQL)                           


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta JR-Master quinta-feira, 9 de julho de 2015 21:28
    terça-feira, 7 de julho de 2015 19:01

Todas as Respostas

  • Jalber,

    Recomando acrescentar a diretiva Set NoCount On na sua procedure, esta diretiva indica para o SQL Server que não é necessário realizar a contagem e apresentação de linhas afetadas no processamento da Stored Procedure.

    Além disso, se você esta utilizando o Begin Try...Catch, recomando substituir a função RaiseError pelas funções mais novas para obtenção de informações de erro. A função RaiseError foi introduzida no SQL Server desde a versão 2000 e mantida até hoje por questões de compatibilidade, mas não é mais recomendável.

    Veja abaixo um exemplo de como fazer tratamento de erros em Stored Procedure:

    -- Criando a Stored Procedure P_Calcular --
    
    Create Procedure P_Calcular @Valor1 Int = Null, @Valor2 Int = Null, 
                               @Operador Char(1)
    As
    Begin
    
    Set NoCount On
    
    
     If (@Valor1 Is Not Null And @Valor2 Is Not Null)
      Begin
    
      -- Bloco Begin Try --
       Begin Try
        
        Declare @Resultado Int
        Set @Resultado=0
    
        If @Operador = '+'
         Set @Resultado = (@Valor1 + @Valor2)
        Else
        If @Operador = '-'
         Set @Resultado = (@Valor1 - @Valor2)
        Else
        If @Operador = '*'
         Set @Resultado = (@Valor1 * @Valor2)
        Else
        If @Operador = '/'
         Set @Resultado = (@Valor1 / @Valor2)
        Else
         Select 'Operador inválido'
    
        Select 'O Resultado da Operação'+
                Case @Operador
    		     When '+' Then ' Adição é: '+CONVERT(Varchar(5),@Resultado)
    		     When '-' Then ' Subtração' +CONVERT(Varchar(5),@Resultado)
    		     When '*' Then ' Multiplicação é: '+CONVERT(Varchar(5),@Resultado)
    		     When '/' Then ' Divisão' +CONVERT(Varchar(5),@Resultado)
    		    End As Operacao
      End Try -- Encerrando o Begin Try --
    
      -- Bloco Begin Catch --
      Begin Catch
     
       SELECT ERROR_NUMBER() AS ErrorNumber,
              ERROR_SEVERITY() AS ErrorSeverity,
              ERROR_STATE() AS ErrorState,
              ERROR_PROCEDURE() AS ErrorProcedure,
              ERROR_MESSAGE() AS ErrorMessage,
              ERROR_LINE() AS ErrorLine;         
      End Catch -- Encerrando o Begin Catch --   
      End
      Else
       Select 'Informe os Valores para realizar a Operação' As 'Mensagem de Alerta'  
    End
    
    -- Executando a Stored Procedure P_Calcular --
    Execute P_Calcular 10,0,'/'

    -- Criando a Tabela ProdutosProduzidos --
    Create Table ProdutosProduzidos
     (OrdemProducao Varchar(20) Not Null Primary Key Clustered,
     DataProducao DateTime Not Null,
     Quantidade Int Not Null)
    On [Primary]
    Go
    
    -- Criando a Stored Procedure P_FindProduction --
    Create Procedure P_FindProduction @OrdemProducao VarChar(20), @DataProducao DateTime
    As
    Begin
    Set NoCount On;
    
    Begin Try
    
     Merge ProdutosProduzidos As Target
      Using (Select @OrdemProducao, @DataProducao) As Source (OrdemProducao, DataProducao)
       On (Target.OrdemProducao = Source.OrdemProducao 
           And Target.DataProducao = Source.DataProducao)
      When Matched Then
       Update Set Quantidade = Quantidade + 1, DataProducao = GetDate()
      When Not Matched Then
       Insert (OrdemProducao, DataProducao, Quantidade)
       Values(Source.OrdemProducao, Source.DataProducao, 1);
    
    End Try
    
    Begin Catch
      
       SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_MESSAGE() AS ErrorMessage,
            ERROR_LINE() AS ErrorLine;
             
    End Catch
    End
    Go
    
    Select * from ProdutosProduzidos
    
    Insert Into ProdutosProduzidos (OrdemProducao, DataProducao, Quantidade)
    Values (1,GetDate(),1), 
           (2,GetDate(),1),
    	   (3,GetDate(),1)
    
    
    Exec P_FindProduction 3, '2014-07-08 10:26:25.250'


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 3 de julho de 2015 22:51
  • Obrigado por ter respondido Junior Galvão.

    Tenho uma dúvida sobre o select com as funções ERROR_...  deste bloco:

     SELECT ERROR_NUMBER() AS ErrorNumber,
              ERROR_SEVERITY() AS ErrorSeverity,
              ERROR_STATE() AS ErrorState,
              ERROR_PROCEDURE() AS ErrorProcedure,
              ERROR_MESSAGE() AS ErrorMessage,
              ERROR_LINE() AS ErrorLine;         
      End Catch -- Encerrando o Begin Catch --   
      End
      Else
       Select 'Informe os Valores para realizar a Operação' As 'Mensagem de Alerta'  
    End

    Vc disse que eu poderia substituir o RAISERROR por funções mais novas... Esses ERROR_... do bloco acima, eu nw entendi como que eles irão retornar isso para minha aplicação... Pensei em usar apenas o PRINT e pegar a mensagem na aplicação, mas se eu usar essas funções ERROR_... , conforme o bloco acima, como a minha aplicação receberá esse erro? vou poder jogar para um MessageBox? Tenho dúvidas se deveria usar o PRINT, Os ERROR_..., etc...

    Me desculpe, é que sou iniciante e dá um nós na cabeça da gente... rssrsrs


    sexta-feira, 3 de julho de 2015 23:21
  • Jalber,

    Estas funções:

              ERROR_NUMBER(),
              ERROR_SEVERITY(),
              ERROR_STATE(),
              ERROR_PROCEDURE(),
              ERROR_MESSAGE(),
              ERROR_LINE()   

    São novas funcionalidades que foram introduzidos no Microsoft SQL Server a partir da versão 2005, que permitem justamente fazer um tratamento de erros ou exceções de forma mais inteligente e elegante, estes links podem te ajudar:

    TRY...CATCH (Transact-SQL)                           
    sys.messages (Transact-SQL)                           
    ERROR_NUMBER (Transact-SQL)                           
    ERROR_MESSAGE (Transact-SQL)                           
    ERROR_PROCEDURE (Transact-SQL)                           
    ERROR_SEVERITY (Transact-SQL)                           
    ERROR_STATE (Transact-SQL)                           


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta JR-Master quinta-feira, 9 de julho de 2015 21:28
    terça-feira, 7 de julho de 2015 19:01