sexta-feira, 26 de janeiro de 2007

O guia de uso do Firebird V2.0 foi atualizado

O guia de uso do Firebird V2.0 foi atualizado

The Firebird V2.0 Quick Start Guide has been updated.
Clique aqui para ver a versão traduzida pelo Google

Documentação de Nulos do Firebird

Documentação de Nulos do Firebird  está liberada.
Notícia original: Firebird Null Guide is available. (Tradução Google aqui)

Liberado o Firebird 2.0.1 RC


Firebird 2.0.1 Release Candidate 1 for Testing
O time do Firebird disponibilizou o instador Windows and Linux kits of a Firebird 2.0.1 release candidate em uma área de pre-release. Mandem um Feedback para o Firebird-devel.

Novidade DB FreeMagazine

Acaba de ser lançada a edição 9 da DB FreeMagazine, dedicada inteiramente ao 3º Firebird Developers Day!

Clique aqui para acessar o site.


Caixa troca InterBase por Firebird

O SEFIP - programa utilizado por milhões de empresas de todo o Brasil e distribuído pela Caixa Econômica Federal - passa a utilizar a partir da versão 8.3 o Firebird no lugar do InterBase, como banco de dados. Com isso, a base de servidores Firebird instalados no Brasil cresce em alguns milhares/milhões.

quarta-feira, 24 de janeiro de 2007

DBTools Software libera versão do DBManager

DBTools Softwareanuncia adisponibilidade do DBManager Professional Enterprise Edition V3.4.2 e DBManagerStandard Edition V3.2.2.

 

Mac News Network menciona Firebird

XpertMart, um ponto de venda e controle de inventário, desenvolvido para Mac agora roda em Mac Intel. A última atualização funciona com Firebird no Mac Intel.

Notícia original: Macnn


terça-feira, 23 de janeiro de 2007

Gatilhos (Triggers) no Firebird

Introdução

  • Triggers são rotinas independentes (Stored Procedures especiais), que são conectadas a tabelas ou views.
  • Uma trigger é automaticamente executada ("disparada") quando um registro é inserido, atualizado ou apagado de uma tabela ou view.
  • Triggers nunca são chamadas diretamente, apenas por meio dos comandos INSERT, UPDATE ou DELETE.
  • Triggers são escritas em Linguagem de Stored Procedures e podem ser usadas Exceções.

Vantagens

  • Redução na manutenção das aplicações cliente.
  • Você pode implementar um relatório de modificações para as tabelas.
  • Generator's podem ser chamados automaticamente e seus valores atribuídos a campos.
  • Notificação automática das aplicações pelo uso de Eventos.

Sintaxe básica

CREATE [OR ALTER] TRIGGER nome FOR nomedatabela 
[ACTIVE | INACTIVE]
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
[OR {INSERT | UPDATE | DELETE}
[OR {INSERT | UPDATE | DELETE}]]
[POSITION numero]
AS <trigger_body>
  • ACTIVE/INACTIVE: Uma trigger pode ser desativada, para desenvolvimento, por exemplo. Pode ser usado com o comando ALTER TRIGGER.
  • BEFORE/AFTER: Indica ao sistema se a trigger deve ser disparada antes ou depois das operações de Insert/Delete/Update.
  • POSITION: Ordem de chamada da Trigger. As Trigger's com menor número são disparadas primeiro. Trigger's com o mesmo numero são disparadas em ordem indefinida. A posição padrão é 0 (zero).
  • trigger_body: Igual ao corpo de uma SP.

Diferenças para Stored Procedures

  • As Varáveis de contexto (OLD.colname and NEW.colname) só podem ser usadas nas trigger's
  • Trigger's não tem parâmetros IN e/ou OUT. Assim como não suportam os comandos SUSPEND e EXIT.
  • NEW.colname: Novo valor da coluna nas operações de INSERT ou UPDATE.
  • OLD.colname: Valor antigo da coluna disponível para as operações UPDATE or DELETE.

Variáveis de contexto

Nome da variável Conteúdo
OLD.field Valor do campo antes de insert/update/delete
NEW.field Novo valor para o campo em operações de INSERT ou UPDATE
INSERTING Verdadeiro se a trigger estiver sendo chamada por uma operação de INSERT
UPDATING Verdadeiro se a trigger estiver sendo chamada por uma operação de UPDATE
DELETING Verdadeiro se a trigger estiver sendo chamada por uma operação de DELETE

Alterando e apagando triggers

  • ALTER TRIGGER nome ACTIVE | INACTIVE: ativa/desativa uma trigger.
  • ALTER TRIGGER name ...: Muda a definição da trigger.
  • DROP TRIGGER name: Apaga a trigger. Não podem ser executado enquando a trigger estiver sendo executada.
  • CREATE OR ALTER TRIGGER name ...: Cria a trigger se não existir e altera se existir.

Triggers e transações

  • Trigger's rodam no contexto da sua transação, elas são tratadas como parte da operação atual.
  • As ações que são disparadas pela trigger são desfeitas quando ocorre um ROLLBACK.

Exemplos

Insere um valor de Generator para um registro recentemente adicionado

CREATE TRIGGER Create_Log_ID FOR Logs
BEFORE INSERT
AS
BEGIN
NEW.ID = GEN_ID (LogIdGenerator, 1);
END;

Log Changes to the PRICE field
CREATE TRIGGER Log_Price_Upd FOR Articles
AFTER INSERT OR UPDATE
AS
BEGIN
IF INSERTING THEN
INSERT INTO PRICE_LOGS (ART_ID, ACTION, DATETIME, NEW_PRICE)
VALUES (NEW.ART_ID, 'I', 'NOW', NEW.PRICE);
ELSE
INSERT INTO PRICE_LOGS (ART_ID, ACTION, DATETIME, NEW_PRICE)
VALUES (NEW.ART_ID, 'U', 'NOW', NEW.PRICE);
END;

Pesquisa sem considerar maiúsculas e minúsculas

Suponha que você tenha uma tabela de empregados e queira habilitar uma pesquisa pelo último nome, independente de maiúscula e minúscula:

CREATE TABLE EMPLOYEES (
  EMPNO INTEGER NOT NULL PRIMARY KEY,
  LASTNAME VARCHAR (50),

  FIRSTNAME VARCHAR (50));

Agora inclua um novo campo LASTNAME_UPPER que conterá o LASTNAME em maiúscula. Você precisa informar o COLLATION para que o UPPER() funcione corretamente.
CREATE TABLE EMPLOYEES (
 EMPNO INTEGER NOT NULL PRIMARY KEY,
 LASTNAME VARCHAR (50) COLLATE DE_DE,LASTNAME_UPPER VARCHAR (50) COLLATE DE_DE,
 FIRSTNAME VARCHAR (50) COLLATE DE_DE);

Now you need a trigger which will fill the LASTNAME_UPPER field at every INSERT or UPDATE operation. There is no need for your application to fill LASTNAME_UPPER.

CREATE OR ALTER TRIGGER BIU_EMPLOYEES FOR EMPLOYEES
BEFORE INSERT OR UPDATE
AS
BEGIN
NEW.LASTNAME_UPPER = UPPER (NEW.LASTNAME);
END;

Depois, você precisa de um índice para LASTNAME_UPPER para fazer que a pesquisa fique mais rápida:

CREATE INDEX IDX_EMPL_LASTNAME ON EMPLOYEES (LASTNAME_UPPER);

Agora você pode procurar por empregados usando um SELECT normal usando LASTNAME_UPPER ao invés de LASTNAME. Lembre-se de usar UPPER() no termo que será pesquisado:


SELECT EMPNO FROM EMPLOYEES WHERE LASTNAME_UPPER = 'HEYMANN';

segunda-feira, 22 de janeiro de 2007

Stored Procedures em Firebird

Introdução

  • "Stored Procedures", ou SP, são rotinas que rodam no servidor e podem ser chamadas pela aplicação cliente.
  • Stored Procedures são pre-compiladas. Portanto, não é necessário mandar o comando pela rede para ser validado e executado. Elas são simplesmente executadas.
  • Procedures podem possuir parâmetros e, assim como o SELECT, retornar dados de uma tabela.

Vantagens

  • A aplicação cliente conterá apenas parte do código. Assim sua manutenção será simples e rápida.
  • Fácil manutenção. Aplicações cliente não precisam ser recompiladas ou redistribuídas caso alguma alteração nas SP's seja feita.
  • Ganho de performance pela diminuição do tráfego na rede.

Chamando Stored Procedures

  • Stored Procedures podem executar uma ação e não retornar nenhum dado
  • Procedures selecionáveis podem retornar tabelas, assim como o SELECT, ou Views. Pode ser usado como uma tabela em um comando SELECT:
    • SELECT a, b FROM procedurename (params) ...
  • Para habilitar a chamada de procedure o usuário deve antes atribuir direitos a ela:
    • EXECUTE rights (granted by GRANT/REVOKE)

Declarando Stored Procedures

CREATE PROCEDURE name [(param1 datatype1, param2 datatype2, ...)] 
[RETURNS (param3 datatype3, param4 datatype4, ...)]
AS BEGIN
 <corpo>
END;

Sintaxe para declaração de uma variável

DECLARE VARIABLE variable datatype 

(Os parâmetros de Entrada e Saída de uma SP são usados como variáveis)

SET TERM

Todo comando dentro da Stored Procedure deve terminar com um ; (Ponto e vírgula), a Procedure também. Para distinguir o ponto-e-vígula dentro da Procedure do ponto-e-vírgula de terminação da Procedure pode ser usado outro terminador. Isso pode ser feito usando o comando SET TERM:

SET TERM !! ; 
CREATE PROCEDURE x AS BEGIN ... END !!
SET TERM ; !!

O primeiro "SET TERM" substitui o terminador padrão (;) pelo terminador (!!). A procedure contém declarações utilizando o terminador padrão (;). A procedure termina a sua própria declaração usando o "novo" terminador (!!). Depois disso, o símbolo de terminação volta a ser o padrão (;).

Criando, alterando e destruindo Stored Procedures

  • Criar: CREATE PROCEDURE nome ...
  • Alterar: ALTER PROCEDURE nome ... (o restante é igual ao comando CREATE PROCEDURE)
  • Criar ou Alterar, dependendo da existência da SP: CREATE OR ALTER ...
  • Apagar: DROP PROCEDURE nome. Só pode ser executada pelo done (owner) da SP.
    Você só pode apagar SP, quando elas não são usadas pode outras SP's, Trigger's ou View's.

Exceções

  • Criar: CREATE EXCEPTION nome “mensagem“
  • Alterar: ALTER EXCEPTION nome “mensagem“
  • Apagar: DROP EXCEPTION nome

Exemplos

/* --- Retornando um valor simples –----------------------------------- */ 
CREATE PROCEDURE Mul (a INTEGER, b INTEGER)
RETURNS (Result INTEGER)
AS BEGIN
Result = a * b;
END

/* --- Retornando uma tabela –--------------------------------- */ 
CREATE PROCEDURE CountTo10
RETURNS (Cnt INTEGER)
AS BEGIN
Cnt = 1;
WHILE (Cnt <= 10) DO BEGIN
SUSPEND; /* Return next line */
Cnt = Cnt + 1;
END;
END

Comandos

Comando Descrição Versão
BEGIN <statements> END
Compound Statement like in PASCAL
variable = expression
Assignment. "variable" can be a local variable, an "in" or an "out" parameter.
compound_statement
A single command or a BEGIN/END block
select_statement
Normal SELECT statement. The INTO clause must be present at the end of the statement. Variable names can be used with a colon preceding them. Example
SELECT PRICE FROM ARTICLES
WHERE ARTNO = :ArticleNo
INTO :EPrice

/* Comment */
Comment, like in C
-- Comment
Single line SQL comment 1.5.0
DECLARE VARIABLE name datatype [= startval]
Variable declaration. After AS, before the first BEGIN. 1.5.0 (startval)
EXCEPTION
Re-fire the current exception. Only makes sense in WHEN clause 1.5.0
EXCEPTION name [message]
Fire the specified exception. Can be handled with WHEN. 1.5.0 (message)
EXECUTE PROCEDURE name arg, arg
RETURNING_VALUES arg, arg
Calling a procedure. arg's must be local variables. Nesting and recursion allowed.
EXIT
Leaves the procedure (like in PASCAL)
FOR select_statement DO
compound_statement
Executes "compound_statement" for every line that is returned by the SELECT statement
IF (condition)
THEN compound_statement
[ELSE compound_statement]
IF statement, like in PASCAL
POST_EVENT name
Posts the specified event
SUSPEND
Only for SELECT procedures which return tables: Waits for the client to request the next line. Returns the next line to the client.
WHILE (condition) DO
compound_statement
WHILE statement. Like in PASCAL.
WHEN {EXCEPTION a | SQLCODE x | ANY} DO 
 compound_statement
Exception handling. WHEN statements must be at the end of the procedure, directly before the final END.
EXECUTE STATEMENT stringvalue
Executes the DML statement in stringvalue 1.5.0
EXECUTE STATEMENT stringvalue 
INTO variable_list
Executes Statement and returns variables (singleton) 1.5.0
FOR EXECUTE STATEMENT stringvalue 
INTO variable_list DO 
 compound_statement
Executes Statement and iterates through the resulting lines 1.5.0

 

Neobux