Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Eu gostaria de contar com a experiência dos colegas para sanar a seguinte dúvida.
Estou em dúvida se crio procedures específicas para fazer INSERT e outra para fazer UPDATE no banco, ou se utilizo a mesma procedure para realizar as duas operações.
A dúvida é mais em relação a "técnica" ou "metodologia", do que codificação.
Penso que ter apenas 01 procedure que pode realizar as duas operações ajuda a manter certo padrão (já que as variáveis seriam as mesmas para as duas operações) e facilita a manutenção.
Porém, numa situação de UPDATE eu tenho um parâmetro adicional que é o ID do registro que vou querer atualizar. Na operação de INSERT não existe esse parâmetro (pq o registro ainda não existe no bd).
Então seria esse o meu dilema...saber dos colegas, qual abordagem faz mais sentido. Isso é importante porque tenho dezenas de procedures no meu projeto. Não me importo em fazer ajustes em todas, mas queria definir o melhor método (considerando o cenário acima citado) para implementar como padrão.
Grato.Veja um exemplo.
Nesse caso, estou deixando as duas operações na mesma procedure.
Esse é uma procedure das mais simples que tenho. Há algumas com uns 20 campos (e suas respectivas variáveis) para serem gravados.
Creio que entre 85% e 90% das procedures tem essa estrutura: recebe os vados, faz checagem para evitar duplicidade, executa a operação, define variáveis de mensagem ao usuário.
Nesse caso, eu trato a variável @id na aplicação para prever a situação de UPDATE (em que já tenho registro com ID) e a situação de INSERT, nesse caso eu passo o valor 0 (zero).
Como falei, não sei se essa é melhor maneira de reutilizar o código, padronizar e simplificar a manutenção.
USE [meu_bd]
GO
/**** Object: StoredProcedure [dbo].[XPTO_gravar] Script Date: 16/08/2023 12:13:17 ****/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[XPTO_gravar]
@codUsuario Int
, @id Int
, @trilha Varchar(80)
, @flagEnfoque Char(1)
, @cmd Char(9)
, @numIP Varchar(128)
AS
DECLARE @resMsg Varchar(80), @codMsg Int, @countCheck Int;
SET NOCOUNT ON
IF @cmd = 'atualizar'
BEGIN
--verifica se a Trilha existe
SELECT @countCheck = COUNT(*) FROM dbo.tab AS TA WHERE TA.titulo = @trilha AND TA.id <> @id
IF (@countCheck = 0)
BEGIN
UPDATE dbo.tab
SET titulo = @trilha, enfoque = @flagEnfoque
WHERE
id = @id
SET @codMsg= 1
SET @resMsg = 'Trilha atualizada com sucesso.'
END
IF (@countCheck > 0)
BEGIN
SET @codMsg = 2
SET @resMsg = 'Ops. Já existe a trilha ' + @trilha
END
END
ELSE
--***************************************************************************************
IF @cmd = 'adicionar'
BEGIN
--verifica se a NOVA Trilha existe
SELECT @countCheck = COUNT(*) FROM dbo.tab AS TA WHERE TA.titulo = @trilha
IF (@countCheck = 0)
BEGIN
INSERT INTO dbo.tab
(titulo)
VALUES
(@trilha)
SET @id = SCOPE_IDENTITY()
SET @codMsg= 1
SET @resMsg = 'Trilha criada com sucesso.'
END
IF (@countCheck > 0)
BEGIN
SET @codMsg = 2
SET @resMsg = 'Ops. Já existe a trilha ' + @trilha
END
END
SET NOCOUNT OFF
SELECT dbo.fn_retornaRespOperacao(@codMsg, @resMsg, CAST(dbo.lpad(@id) AS Varchar)) AS jsonResp
existe alguns pontos a considerar por exemplo:
-
Separação de Responsabilidades
-
Reutilização de Código
-
Manutenção
-
Desempenho
-
Padronização
-
Flexibilidade
mande o exemplo que voce esta fazendo usando sql server?