Problema Stored Procedure

Banco de Dados

Stored Procedures

25/07/2020

01) Crie uma stored procedure que receba como
parâmetro o nome de um departamento, e aumente
em 10% o salário dos empregados desse
departamento, sendo que se a soma dos novos
salários for maior que R$20.000.00, então o processo
deve ser abortado e o BD deve manter os salários
originais. Se a atualização não for feita, o usuário
deve ser informado disso, e se for feita, a soma dos
salários deve ser exibida;

Alguém pode me ajudar respondendo?
Jefferson Ferreira

Jefferson Ferreira

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

25/07/2020

a sintaxe é diferente entre os bancos de dados.
segue exemplo para ser usado no MS SQL Server:
CREATE OR ALTER PROCEDURE AUMENTO_DEPTO
	@NOME_DEPTO varchar(20)
AS
BEGIN
	SET NOCOUNT ON;

	DECLARE @AUMENTO FLOAT = 0.1; -- percentual de aumento (10% / 100)
	DECLARE @SOMA FLOAT; -- receberá o acumulado dos salários com o aumento
	DECLARE @LIMITE FLOAT = 20000; -- teto para permitir o aumento

	SELECT @SOMA = ROUND(SUM(F.SALARIO) * (1.0 + @AUMENTO),2)
	FROM FUNCIONARIOS F
	INNER JOIN DEPARTAMENTOS D ON D.ID = F.ID_DEPARTAMENTO
	WHERE D.NOME = @NOME_DEPTO;

	IF (@SOMA > @LIMITE)
		SELECT 'Aumento negado! Se aplicasse o aumento de '+format(@AUMENTO, 'P2')+', a soma dos salários seria superior a '+format(@LIMITE, 'C2')+'.' MENSAGEM;
	ELSE
	BEGIN
		UPDATE F SET F.SALARIO = ROUND(F.SALARIO * (1.0 + @AUMENTO),2)
		FROM FUNCIONARIOS F
		INNER JOIN DEPARTAMENTOS D ON D.ID = F.ID_DEPARTAMENTO
		WHERE D.NOME = @NOME_DEPTO;
		SELECT 'Aumento aplicado com sucesso. A soma dos salários após o aumento é de '+format(@SOMA, 'C2')+'.' MENSAGEM;
	END
END

pode ser feita usando transação:
CREATE OR ALTER PROCEDURE AUMENTO_DEPTO
	@NOME_DEPTO varchar(20)
AS
BEGIN
	SET NOCOUNT ON;

	DECLARE @AUMENTO FLOAT = 0.1; -- percentual de aumento (10% / 100)
	DECLARE @SOMA FLOAT; -- receberá o acumulado dos salários com o aumento
	DECLARE @LIMITE FLOAT = 20000; -- teto para permitir o aumento

	BEGIN TRANSACTION -- inicia a transação, para proteger a alteração dos registros

	UPDATE F SET F.SALARIO = ROUND(F.SALARIO * (1.0 + @AUMENTO),2)
	FROM FUNCIONARIOS F
	INNER JOIN DEPARTAMENTOS D ON D.ID = F.ID_DEPARTAMENTO
	WHERE D.NOME = @NOME_DEPTO;
	
	SELECT @SOMA = SUM(F.SALARIO)
	FROM FUNCIONARIOS F
	INNER JOIN DEPARTAMENTOS D ON D.ID = F.ID_DEPARTAMENTO
	WHERE D.NOME = @NOME_DEPTO;

	IF (@SOMA > @LIMITE)
	BEGIN
		ROLLBACK; -- desfaz a alteração dos registros (aumento)
		SELECT 'Aumento negado! Se aplicasse o aumento de '+format(@AUMENTO, 'P2')+', a soma dos salários seria superior a '+format(@LIMITE, 'C2')+'.' MENSAGEM;
	END
	ELSE
	BEGIN
		COMMIT TRANSACTION; -- confirma a alteração dos registros (aumento)
		SELECT 'Aumento aplicado com sucesso. A soma dos salários após o aumento é de '+format(@SOMA, 'C2')+'.' MENSAGEM;
	END
END

para usar:
EXEC AUMENTO_DEPTO 'COMPRAS'
GOSTEI 0
POSTAR