Problema Stored Procedure
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?
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
Curtidas 0
Respostas
Emerson Nascimento
25/07/2020
a sintaxe é diferente entre os bancos de dados.
segue exemplo para ser usado no MS SQL Server:
pode ser feita usando transação:
para usar:
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