(Parte 7 de 13)

Exemplo

UPDATE TABLE1 SET FIELD1 = 0 WHERE ID = :ID; IF (ROW_COUNT = 0) THEN INSERT INTO TABLE1 (ID, FIELD1) VALUES (:ID, 0);

Nota: esta funcionalidade não pode ser utilizada para verificar a quantidade de linhas afetadas por uma declaração EXECUTE STATEMENT.

SQLCODE e GDSCODE

Cada variável de contexto devolve um número inteiro que corresponde ao código de erro da exceção ativa. Disponível em PSQL, dentro do contexto de um bloco de tratamento de exceção. Fora do bloco, ambas retornam zero.

A variável GDSCODE devolve uma representação numérica do código de erro GDS (ISC), ie, ‘335544349L’ irá devolver 335544349.

Um bloco de exceção 'WHEN SQLCODE' ou ‘WHEN ANY’ irá receber um valor diferente de zero para a variável SQLCODE e devolver zero para GDSCODE. Apenas um bloco ‘WHEN GDSCODE’ irá receber um valor diferente de zero para a variável GDSCODE (e devolverá zero em SQLCODE). Se uma exceção criada pelo usuário ocorrer, ambas as variáveis SQLCODE e GDSCODE terão valor zero, independentemente do tipo de bloco de exceção.

Sintaxe

EXCEPTION E_EXCEPTION_1;

Exemplo BEGIN WHEN SQLCODE -802 THEN WHEN SQLCODE -803 THEN

EXCEPTION E_EXCEPTION_2;
EXECUTE PROCEDURE P_ANY_EXCEPTION(SQLCODE);

v.1.08 Notas da Versão Firebird 1.5 08 fevereiro 2004 Página 26 WHEN ANY DO END

Veja ainda Melhorias no tratamento de exceções, mais a frente, e o documento README.exception_handling no firebird2/doc/sql.extensions da árvore CVS do Firebird.

Estas três expressões pseudo booleanas podem ser utilizadas para testar ou determinar qual a operação de DML que está ocorrendo. Disponível em PSQL, apenas em triggers. Projetadas para uso no contexto de triggers universais (ver METADATA mais adiante).

Sintaxe

Exemplo IF (INSERTING OR DELETING) THEN NEW.ID = GEN_ID(G_GENERATOR_1, 1);

(1.5) Melhorias no Tratamento de Excepções em PSQL Dmitry Yemanov

A Sintaxe comum para uma declaração EXCEPTION em PSQL é: EXCEPTION {[nome] | [valor]};

As melhorias na versão 1.5 permitem:

1) Definir uma mensagem para uma exceção em tempo de execução. 2) Provocar novamente (“re-raise”) uma exceção dentro do contexto do bloco da exceção. 3) Obter um erro numérico da exceção tratada.

1) Mensagens de Exceção em “Run-time”

Sintaxe EXCEPTION <nome_exceção> <valor_mensagem>;

Exemplos i) EXCEPTION E_EXCEPTION_1 'Erro!'; v.1.08 Notas da Versão Firebird 1.5 08 fevereiro 2004 Página 27

EXCEPTION E_EXCEPTION_2 'Tipo errado para o registro com o ID=' || new.ID;

2) Disparando novamente uma exceção Nota – não tem qualquer efeito fora de um bloco de exceção.

Sintaxe EXCEPTION;

Exemplos

EXCEPTION E_ARITH_EXCEPT;
EXCEPTION E_KEY_VIOLATION;
EXCEPTION;

i) BEGIN WHEN SQLCODE -802 THEN WHEN SQLCODE -802 THEN WHEN ANY THEN END

INSERT INTO ERROR_LOG (...) VALUES (SQLCODE,);

i) WHEN ANY DO BEGIN EXCEPTION; END

3) Códigos de Erro em Tempo de Execução Ver SQLCODE / GDSCODE (acima).

Interrompe o processamento de um loop, transferindo o processamento para a declaração após o END que delimita o loop. Disponível apenas para estruturas WHILE, FOR SELECT e FOR EXECUTE; qualquer outro uso gerará um erro de compilação. O uso da cláusula SQL-9 LEAVE deverá ter preferência sobre o BREAK existente. Disponível tanto em triggers como em stored procedures.

LEAVE;

Sintaxe BEGIN <declarações>; IF (<condições>) THEN <declarações>; END

NOTA: LEAVE | BREAK e EXIT podem agora ser utilizados em triggers

Declarações válidas de PLAN podem ser incluídas em Triggers Ignacio J. Ortega

Até o momento, um trigger que contivesse uma declaração PLAN seria rejeitado pelo compilador. Agora, uma declaração válida de PLAN pode ser incluída e utilizada.

v.1.08 Notas da Versão Firebird 1.5 08 fevereiro 2004 Página 28

(1.5) Blocos BEGIN..END vazios Dmitry Yemanov

Blocos BEGIN..END vazios são agora aceitos em módulos PSQL. Por exemplo, pode-se agora escrever módulos “stub” como:

CREATE TRIGGER BI_ATABLE FOR ATABLE ATIVE BEFORE INSERT POSITION 0 AS BEGIN END ^

(1.5) Declarar e definir variáveis locais numa única declaração Claudio Valderrama

Simplificação da sintaxe para permitir que variáveis locais possam ser declaradas e inicializadas em uma única declaração.

Sintaxe DECLARE [VARIABLE] nome <tipo_variável> [{'=' | DEFAULT} valor];

Exemplo DECLARE my_var INTEGER = 123;

(1.0) SELECT [FIRST (<expr. inteira M>)] [SKIP (<expr.inteira N>)] (1.5) SELECT FIRST pode agora ter zero como argumento

O FB 1.5 aceita zero como argumento de FIRST. O resultado será uma tabela vazia.

Retorna as primeiras M linhas do resultado da seleção. A cláusula opcional SKIP faz com que as primeiras N linhas sejam ignoradas, retornando um conjunto de M linhas, a partir da linha N + 1. Na forma mais simples, m e n são inteiros mas qualquer expressão Firebird cujo resultado seja um inteiro pode ser utilizada. Um identificador que represente um valor inteiro pode ser usado no em GDML, mas não em SQL ou DSQL.

O parêntesis é obrigatório para os argumentos das expressões e opcional nos outros casos.

Podem também ter sua definição variável, por exemplo, SKIP ? * FROM ATABLE retornará todos os registros após descartar as n linhas iniciais, onde n será definido através da variável "?". SELECT FIRST ? COLUMNA, COLUMNB FROM ATABLE retornará primeiras n linhas e descartará as demais.

A cláusula FIRST também é opcional, ou seja, é possível incluir SKIP numa declaração sem FIRST para obter um conjunto de dados que exclua as linhas indicadas pelo SKIP.

Disponível em SQL e DSQL exceto quando indicado o contrário.

Exemplos: SELECT SKIP (5+3*5) * FROM MYTABLE; v.1.08 Notas da Versão Firebird 1.5 08 fevereiro 2004 Página 29

SELECT FIRST (4-2) SKIP ? * FROM MYTABLE; SELECT FIRST 5 DISTINCT FIELD FROM MYTABLE;

(Parte 7 de 13)

Comentários