Firebird, fazendo valer o lado do servidor
O Firebird traz dezenas de recursos que podem deixar as aplicações cliente-servidor muito mais rápidas, de forma que a maior parte do processamento se concentre realmente no lado do servidor, melhorando o tráfego de dados na rede e não exigindo muito da plataforma onde está o cliente.
Parte 2: Stored Procedures
Primeiro criaremos algumas tabelas de exemplo:
Popularemos a tabela FUNCIONARIOS:
Provavelmente você enviaria uma Query com o comando update para o Firebird para fazer essa atualização, não é verdade?
E como ficaria se criássemos uma Stored Procedure para isso?
Então vamos escrever a nossa Stored Procedure:
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:
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!
E agora atualizaremos nossa Procedure:
Pronto! Sempre que não existir o funcionário seremos avisados.
Comando:
Saída:
EXP_DAR_AUMENTO.
Funcionário não existe.
At procedure 'DAR_AUMENTO'
Você poderia tratar essa exceção na sua aplicação.
CREATE TABLE FUNCIONARIOS (
ID INTEGER,
NOME VARCHAR(100),
SALARIO FLOAT
);
CREATE TABLE HISTORICO (
ID_FUNCIONARIO INTEGER,
DATA DATE,
SALARIO_ANTERIOR FLOAT,
NOVO_SALARIO FLOAT
);
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
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
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.
Parabéns pelo artigo.
Eu utilizo o Interbase com delphi 7 há alguns anos e sempre me atendeu bem.
A única deficiência que encontrei no banco é que ele utiliza um modo de transferência de dados que o torna muito lento ao rodar pela internet (Ex. Utilizando entre filial X Matriz).
Agora, os recursos citados acima são excelentes, mas devem ser sempre utilizados com cautela.
Quanto mais você se apegar aos recursos de uma ferramenta, mais dependente dela você fica.
Vamos supor que você crie uma aplicação toda baseada em procedimentos armazenados e gatilhos, se você futuramente precisar mudar de banco de dados aí fica muito complicado, pois cada banco de dados utiliza uma linguagem diferente (apenas em procedimentos armazenados e gatilhos, os comandos SQL comuns são padronizados!).
Abraços,
Renato