Primeiro criaremos algumas tabelas de exemplo:
CREATE TABLE FUNCIONARIOS (
ID INTEGER,
NOME VARCHAR(100),
SALARIO FLOAT
);
CREATE TABLE HISTORICO (
ID_FUNCIONARIO INTEGER,
DATA DATE,
SALARIO_ANTERIOR FLOAT,
NOVO_SALARIO FLOAT
);
Popularemos a tabela FUNCIONARIOS:
INSERT INTO FUNCIONARIOS (ID, NOME, SALARIO) VALUES (1, 'José', 20);
INSERT INTO FUNCIONARIOS (ID, NOME, SALARIO) VALUES (2, 'Maria', 50);
INSERT INTO FUNCIONARIOS (ID, NOME, SALARIO) VALUES (3, 'Marta', 100);
COMMIT WORK
A stored procedure
Supondo que queremos dar aumento de x% para um de nossos empregados, se fosse realizar essa rotina na sua aplicação, como seria?
Provavelmente você enviaria uma
Query com o comando
update para o
Firebird para fazer essa atualização, não é verdade?
UPDATE FUNCIONARIOS SET SALARIO= SALARIO +( (:PERCENT*100) / SALARIO ) WHERE ID = :ID
E como ficaria se criássemos uma
Stored Procedure para isso?
Então vamos escrever a nossa Stored Procedure:
CREATE PROCEDURE DAR_AUMENTO (
ID INTEGER,
PERCENT SMALLINT)
AS
BEGIN
UPDATE FUNCIONARIOS SET SALARIO= SALARIO +( (:PERCENT*100) / SALARIO ) WHERE ID = :ID ;
suspend;
END
As variáveis ID e PERCENT serão passadas para a Procedure quando as executarmos. E aplicaremos os ":" para usar as variáveis dentro da Procedure. Vamos a um exemplo: precisamos dar um aumento de 30% para a Marta (lembre se o id da Marta é 3).
Comando:
EXECUTE PROCEDURE DAR_AUMENTO(3,30);
Saída: sucesss....
Ok, tudo certo! Com o aumento Marta agora recebe 130.
Mas e se tentarmos dar aumento para um funcionário que não existe? O que fazer?
Então criaremos uma
Exception!
CREATE EXCEPTION EXP_FUNC_NOT_EXIST 'Funcionário não existe';
E agora atualizaremos nossa Procedure:
ALTER PROCEDURE DAR_AUMENTO (
ID INTEGER,
PERCENT SMALLINT)
AS
DECLARE VARIABLE FUNC INTEGER;
BEGIN
SELECT ID FROM FUNCIONARIOS WHERE ID = :ID INTO :FUNC;
IF (FUNC IS NULL ) THEN
EXCEPTION EXP_DAR_AUMENTO ;
ELSE
uPDATE FUNCIONARIOS SET SALARIO= SALARIO +( (:PERCENT*100) / SALARIO ) WHERE ID = :ID ;
END
Pronto! Sempre que não existir o funcionário seremos avisados.
Comando:
EXECUTE PROCEDURE DAR_AUMENTO(8,30);
Saída:
EXP_DAR_AUMENTO.
Funcionário não existe.
At procedure 'DAR_AUMENTO'
Você poderia tratar essa exceção na sua aplicação.