none
BEGIN CATCH de procedure para procedure RRS feed

  • Pergunta

  • Bom dia pessoal eu tenho uma procedure que tem um BEGN CATH ja estruturado , mas vou chamar ela dentro de outra... como faço para que essa outra .. retorne o erro da primeira ..


    CREATE OR ALTER  PROCEDURE [dbo].[STP_INT_EXEC_IMPORTACAO_ATIVIDADE] -- EXEC STP_INT_EXEC_IMPORTACAO_ATIVIDADE  10,1000,1000
    (
        @LACO INT = 10,
        @QTD_OS INT =50000,
        @LACO_REPROCESSA INT = 25000
    )
    AS

    BEGIN TRY  
        /*****************************************************************************************************
        Procedure para

          #3954 - Douglas Fernandes - 22/05/2019 - SIGOS - INTERFACE - Reprocessar atividade e ajustar regras
        *******************************************************************************************************/    
        /*
        update INT_FTP_ORDEM_SERVICO set FLAG_PROCESSADO = 0, FLAG_REPROCESSA =  0 ,DESCRICAO_ERRO = null , FLAG_ERRO = 0
        where ID_ORDEM_SERVICO in (SELECT TOP 5000 ID_ORDEM_SERVICO FROM INT_FTP_ORDEM_SERVICO)
        */
        
            DECLARE @COUNT INT = 0;
            DECLARE @CONT_1EM1 INT = 0;

            WHILE (@COUNT < @LACO)
            BEGIN
        
              EXEC MXL01_INTERFACE..STP_INT_ATIVIDADE_COPASA @QTD_OS;
              
              SET @COUNT = @COUNT +1;
            END
            
            WHILE ((@CONT_1EM1 < @LACO_REPROCESSA) AND  (EXISTS(SELECT COUNT(1) FROM INT_FTP_ORDEM_SERVICO WITH(NOLOCK) WHERE ISNULL(FLAG_REPROCESSA,0)=1 AND ISNULL(NUM_TENTATIVAS,0) <= 2  )))
            BEGIN

              EXEC MXL01_INTERFACE..STP_INT_ATIVIDADE_COPASA 1;
              
              SET @CONT_1EM1 = @CONT_1EM1 +1;
            END
            
    END TRY
    BEGIN CATCH  
        SELECT   
             ERROR_NUMBER() AS ErrorNumber  
            ,ERROR_SEVERITY() AS ErrorSeverity  
            ,ERROR_STATE() AS ErrorState  
            ,ERROR_PROCEDURE() AS ErrorProcedure  
            ,ERROR_LINE() AS ErrorLine  
            ,ERROR_MESSAGE() AS ErrorMessage;  
    END CATCH

    quarta-feira, 29 de maio de 2019 11:50

Respostas

  • Ddev13,

    O que pode ser feito então, é você armazenar o erro apresentado pelas funções de captura e tratamento de erros, armazenar estes valores em uma tabela e não aplicar alguma condição na stored procedure que faz a chamada.

    O que você acha?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Ddev13 quarta-feira, 29 de maio de 2019 16:16
    quarta-feira, 29 de maio de 2019 14:29

Todas as Respostas

  • Ddev13,

    Vamos lá, inicialmente adicione o bloco Begin...End no corpo da sua Stored Procedure para delimitarmos a estrutura de Código.

    Você já declarou esta Stored Procedure dentro do Bloco Begin Try...Catch, por padrão ao ocorrer um erro o SQL Server vai obter o retorno do erro e apresentar no Catch.

    Veja o meu exemplo abaixo:

    -- Criando a Stored Procedure P_HelloWorld --
    Create Procedure P_HelloWorld @NomeUsuario Varchar(20)  
    As  
    Set NoCount On  
      
    Begin  
      
     Select 'Hello World...'+@NomeUsuario
      
    End
    
    -- Criando a Stored Procedure P_Calcular --
    Create Procedure P_Calculadora @Valor1 Int = Null, @Valor2 Int = Null, 
                                   @Operador Char(1)
    As
    Begin
     If (@Valor1 Is Not Null And @Valor2 Is Not Null)
      Begin
      -- Bloco Begin Try --
       Begin Try
        
        Declare @Resultado Int=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'
    
    	Execute P_HelloWorld 
    
        Select 'O Resultado da Operação de'+
                Case @Operador
    		     When '+' Then Concat(' Adição é: ',@Resultado)
    		     When '-' Then Concat(' Subtração é: ',@Resultado)
    		     When '*' Then Concat(' Multiplicação é: ',@Resultado)
    		     When '/' Then Concat(' Divisão é:',@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_Calculadora 10,2,'/'
    Go

    Note que existem duas Stored Procedures: P_HelloWord e P_Calculadora, dentro da P_Calculadora estou chamando a P_HelloWord sem passar o valor no parâmetro de entrada, por padrão as funções de captura e tratamento de erro serão envolvidas e disparadas.

    Deixe que todo tratamento de erro seja feito inicialmente na Stored Procedure principal.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 29 de maio de 2019 12:21
  • Deleted
    quarta-feira, 29 de maio de 2019 12:21
  • Tem e é o dela que eu quero "manter", mais eu presico chamar de outra
    quarta-feira, 29 de maio de 2019 13:08
  • é tipo isso que vc fez, so que preciso chamar a pcalcula dentro da helloword
    quarta-feira, 29 de maio de 2019 13:10
  • Ddev13,

    Mas o controle para tratamento de erros ficaria em qual stored procedure?

    Se eu entendi bem seria na procedure que estaria sendo chamada e não na quem chama. É isso?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 29 de maio de 2019 13:14
  • Isso, mais eu gostaria que o erro.. tratado aparecesse
    quarta-feira, 29 de maio de 2019 14:03
  • Ddev13,

    O que pode ser feito então, é você armazenar o erro apresentado pelas funções de captura e tratamento de erros, armazenar estes valores em uma tabela e não aplicar alguma condição na stored procedure que faz a chamada.

    O que você acha?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Ddev13 quarta-feira, 29 de maio de 2019 16:16
    quarta-feira, 29 de maio de 2019 14:29
  • Deleted
    quarta-feira, 29 de maio de 2019 14:56
  • Obrigado José, mas vou usar a resposta do Junior Galvão
    quarta-feira, 29 de maio de 2019 16:17