Firebird, verificando se um campo dentro da base de dados varchar está em branco ou nulo…

Neste caso precisei verificar em apenas uma tabela que é a pessoa, vc pode adaptar conforme a necessidade, essa consulta nos ajudou muito pois realizamos uma importação de milhares de registros e estes após a importação deveriam ser corrigidos

o interessante é a consulta passando pelas tabelas

RDB$RELATIONS TABELAS,

RDB$RELATION_FIELDS CAMPOS,

RDB$FIELDS DADOSCAMPO,

RDB$TYPES TIPOS

 
CREATE PROCEDURE SP_PESSOA_INCONSISTENCIA
RETURNS (
    OPQTD INTEGER,
    OPQTDFINAL INTEGER,
    OPTABELA VARCHAR(100),
    OPCAMPO VARCHAR(100))
AS
DECLARE VARIABLE VTABELA VARCHAR(100);
DECLARE VARIABLE VCAMPO VARCHAR(100);
DECLARE VARIABLE STRINGSQL VARCHAR(1000);
begin
  OPQTD = 0;
  OPQTDFINAL = 0;
  FOR
   SELECT CAMPOS.RDB$RELATION_NAME, CAMPOS.RDB$FIELD_NAME
    FROM RDB$RELATIONS TABELAS, RDB$RELATION_FIELDS CAMPOS, RDB$FIELDS DADOSCAMPO, RDB$TYPES TIPOS
    WHERE TABELAS.RDB$RELATION_NAME = CAMPOS.RDB$RELATION_NAME AND CAMPOS.RDB$FIELD_SOURCE = DADOSCAMPO.RDB$FIELD_NAME AND
         DADOSCAMPO.RDB$FIELD_TYPE = TIPOS.RDB$TYPE AND TIPOS.RDB$FIELD_NAME = ‘RDB$FIELD_TYPE’ AND
         TIPOS.RDB$TYPE_NAME = ‘VARYING’ AND TABELAS.RDB$SYSTEM_FLAG = 0
         AND CAMPOS.RDB$RELATION_NAME = ‘PESSOA’
    ORDER BY CAMPOS.RDB$RELATION_NAME, CAMPOS.RDB$FIELD_NAME
    INTO :VTABELA, :VCAMPO
  DO
  BEGIN
    STRINGSQL = ”;
    STRINGSQL = ‘ SELECT COUNT(*) FROM ‘ || lTRIM(rtrim(VTABELA));
    STRINGSQL = STRINGSQL || ‘ WHERE ( ‘ || lTRIM(rtrim(VCAMPO)) || ‘ LIKE ”” OR ‘ || lTRIM(rtrim(VCAMPO)) ||  ‘ IS NULL )’;
    EXECUTE STATEMENT STRINGSQL INTO :OPQTD;
    OPQTDFINAL =  OPQTDFINAL + OPQTD;
    OPTABELA = LTRIM(RTRIM(VTABELA));
    OPCAMPO = LTRIM(RTRIM(VCAMPO));
    SUSPEND;
  END
end

Firebird, Procedure para Alterar tudo para Maiusculo ….

neste caso resolvi ter como parametro de entrada a tabela e o nome do campo, mas se vc quiser é só tirar estes parametros.

CREATE PROCEDURE SP_ALTERA_PARA_MAISCULO
AS
DECLARE VARIABLE STRINGSQL VARCHAR(1000);
DECLARE VARIABLE VCAMPO VARCHAR(100);
DECLARE VARIABLE VTABELA VARCHAR(100);
begin
  FOR
    SELECT CAMPOS.RDB$RELATION_NAME, CAMPOS.RDB$FIELD_NAME
    FROM RDB$RELATIONS TABELAS, RDB$RELATION_FIELDS CAMPOS, RDB$FIELDS DADOSCAMPO, RDB$TYPES TIPOS
    WHERE TABELAS.RDB$RELATION_NAME = CAMPOS.RDB$RELATION_NAME AND CAMPOS.RDB$FIELD_SOURCE = DADOSCAMPO.RDB$FIELD_NAME AND
         DADOSCAMPO.RDB$FIELD_TYPE = TIPOS.RDB$TYPE AND TIPOS.RDB$FIELD_NAME = ‘RDB$FIELD_TYPE’ AND         TIPOS.RDB$TYPE_NAME = ‘VARYING’ AND TABELAS.RDB$SYSTEM_FLAG = 0
         INTO :VTABELA, :VCAMPO
  DO
  BEGIN
    STRINGSQL = ”;
    STRINGSQL = ‘ UPDATE ‘ || VTABELA;
    STRINGSQL = STRINGSQL || ‘ SET ‘ || VCAMPO || ‘ = UPPER(‘ || VCAMPO || ‘)’;
    EXECUTE STATEMENT STRINGSQL;
  END

  /* Procedure Text */
  suspend;
end

Verificando quantas sessões do Firebird estão abertas no Linux …

Segue o comando para verificarmos quantas sessões estão abertas no Linux, utilizei a porta 3050 que é padrão do Firebird.

[root@srv-hp ~]# netstat -n | grep -v 139 | grep 3050
tcp        0      0 172.18.1.205:3050           172.18.1.137:3411           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.128:1728          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.249:3967           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.249:3960           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.176:1435          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.137:3110           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.138:1177          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.120:1642          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.249:4422           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.78:1102           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.137:3121           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.137:3120           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.203:1929           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.124:1926          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.203:1923           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.138:1118          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.116:1206          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.136:1594          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.131:1702           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.156:1538          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.137:3492           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.136:1546           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.82:3777            ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.26:1968            ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.155:1122          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.155:1120          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.155:1121          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.108:1339           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.119:1196          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.133:1104          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.133:1107          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.133:1103          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.155:1116          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.119:1204          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.222:1750           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           192.168.0.161:2101          ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.136:1699           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.136:1214           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.136:1209           ESTABELECIDA
tcp        0      0 172.18.1.205:3050           172.18.1.108:4948           ESTABELECIDA

Firebird 2.01, correção de Tabelas, Indíces, Backup´s e Outros.

Realize uma Cópia da base para outro local

Verifique os Erros
C:\Arquivos de programas\Firebird\Firebird_2_0\bin>gfix -v -f c:\telefonista.gdb -user SYSDBA -pass masterkey
Summary of validation errors

        Number of record level errors   : 3
        Number of index page errors     : 256
        Number of database page errors  : 1
Corrija os Erros
C:\Arquivos de programas\Firebird\Firebird_2_0\bin>gfix -m -i c:\telefonista.gdb  -user SYSDBA -pass masterkey

Realize Backup da Base
C:\Arquivos de programas\Firebird\Firebird_2_0\bin>gbak -g -b -z -l -v c:\telefonista.gdb c:\telbackup.fbk -user SYSDBA -pass masterkey

Exemplo do Final do Backup 
gbak:writing referential constraints
gbak:writing check constraints
gbak:writing SQL roles
gbak:closing file, committing, and finishing. 255005184 bytes written

Restaure o Backup, a opção -c faz com que seja criado um banco zerado
C:\Arquivos de programas\Firebird\Firebird_2_0\bin>gbak -g -c -z -v c:\telbackup.fbk c:\TELEFONISTATEL.gdb -user SYSDBA -pass masterkey
Se no Restore der o seguinte Erro
gbak: ERROR: warning — record could not be restored
gbak:Exiting before completion due to errors
Vá no IBexpert abra o Banco Cópia em Extract Metadata
Vá em Data Tables e Selecione tudo e exporte tudo
Se der algum erro vá eliminando-os, se vc usar Tabelas Externas (Create Table … External), concerteza vai dar erro Neste passo, vc terá que eliminar está tabela e outros problemas que houverem até dar 100% correto.
Crie uma base de dados nova
Importe todo o Metadados
e restaure o backup novamente

Firebird, utilizando a Cláusula Having …

Neste exemplo necessito selecionar o que é 021 só que não os que são 02119

 

SELECT CODIGOLIGACOESCOBRADAS, TRONCO, CODIGORAMAL,HORA,DURACAO,DATA,NUMERO,TIPO,TEMPO,SENHAPABX,TIPOLIGACAO

FROM LIGACOES

WHERE DATA >= ’12/01/2008′ and DATA <= ’05/31/2009′ and numero like ‘021%’ AND TIPO = ‘SAÍDA’

GROUP BY CODIGOLIGACOESCOBRADAS, TRONCO, CODIGORAMAL,HORA,DURACAO,DATA,NUMERO,TIPO,TEMPO,SENHAPABX,TIPOLIGACAO

HAVING numero NOT like ‘02119%’

Firebird, Linux, Limite de Conexões …

Certa vez, em vários equipamentos, tivemos a mensagem,

“Connection not established

Connection reject by remote interface”

 

Tendo nosso Servidor como Linux, verificando a QTD de conexões no Firebird com o comando

netstat -n | grep -v 139 | grep 3050

 

notamos que haviam 48 conexões abertas, sendo assim entramos no arquivo /etc/xinetd.conf e alteramos a linha

 

instances       = 50

 

para

 

instances       = 200

 

 

pronto agora podemos chegar até 200 instacias do firebird abertas.

Procedure Avançada no Firebird, utilizando vários recursos ….

CREATE PROCEDURE SP_TIPODOCUMENTO_TEMPO (
    ipcodigotipodocumento integer,
    ipdatafinal date)
returns (
    opdataprevistaretirada date,
    opdatarealretirada date)
as
declare variable vtempoarquivoanos integer;
declare variable vtempoarquivomeses integer;
declare variable vtempoarquivoanosusuario integer;
declare variable vtempoarquivomesusuario integer;
declare variable vfinalconcessao varchar(1);
declare variable vtempoesperaano integer;
declare variable vtempoesperameses integer;
declare variable vdatafinalconcessao date;
declare variable vdiapadrao integer;
BEGIN
    VDIAPADRAO = 1;

    /* LEMBRANDO QUE NO PROGRAMA SÓ VOU ACEITAR 3 6 E 9 PARA OS MESES*/
    SELECT TEMPOARQUIVOANO, TEMPOARQUIVOMESES, TEMPOARQUIVOANOSUSUARIO, TEMPOARQUIVOMESUSUARIO, FINALCONCESSAO, TEMPOESPERAANO, TEMPOESPERAMESES
    FROM TIPODOCUMENTO
    WHERE CODIGOTIPODOCUMENTO = :IPCODIGOTIPODOCUMENTO
    INTO :VTEMPOARQUIVOANOS, :VTEMPOARQUIVOMESES, :VTEMPOARQUIVOANOSUSUARIO, :VTEMPOARQUIVOMESUSUARIO, :VFINALCONCESSAO, :VTEMPOESPERAANO, :VTEMPOESPERAMESES;

    IF (:VTEMPOARQUIVOANOS IS NULL) THEN
        VTEMPOARQUIVOANOS = 0;

    IF (:VTEMPOARQUIVOMESES IS NULL) THEN
        VTEMPOARQUIVOMESES = 0;

    IF (:VTEMPOARQUIVOANOSUSUARIO IS NULL) THEN
        VTEMPOARQUIVOANOSUSUARIO = 0;

    IF (:VTEMPOARQUIVOMESUSUARIO IS NULL) THEN
        VTEMPOARQUIVOMESUSUARIO = 0;

    IF (:VTEMPOESPERAANO IS NULL) THEN
        VTEMPOESPERAANO = 0;

    IF (:VTEMPOESPERAMESES IS NULL) THEN
        VTEMPOESPERAMESES = 0;

    IF (EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES < 12) THEN
    BEGIN
        OPDATAPREVISTARETIRADA =
        CAST((EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES) AS VARCHAR(5)) || ‘/’ ||
        :VDIAPADRAO || ‘/’ ||
        CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS) AS VARCHAR(5));

        /** NO CASO DE MESES MENORES **/
        IF (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES < 12) THEN
        BEGIN
            /** NO CASO DE MESES MENORES PREENCHIDOS OS MESES**/
            IF (:VTEMPOESPERAMESES <> 0) THEN
            BEGIN
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 1) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 3) ) THEN
                    OPDATAREALRETIRADA = ’04/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 4) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 6) ) THEN
                    OPDATAREALRETIRADA = ’07/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 7) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 9) ) THEN
                    OPDATAREALRETIRADA = ’10/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 10) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 12) ) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1) AS VARCHAR(5));
                IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));

            END
            ELSE
            BEGIN
                /** NO CASO DE MESES MENORES PREENCHIDOS ANOS **/
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + VTEMPOESPERAANO)AS VARCHAR(5));
            END
        END
        ELSE
        BEGIN
            /** NO CASO DE MESES IGUAIS E MAIORES **/
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 1) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 3)) THEN
                OPDATAREALRETIRADA = ’04/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 4) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 6)) THEN
                OPDATAREALRETIRADA = ’07/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 7) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 9)) THEN
                OPDATAREALRETIRADA = ’10/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 10) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 12)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 2 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
        END
    END
    ELSE
    BEGIN
        /* CASO SEJA 12 TENHO QUE SOMAR 1 AO ANO*/
        IF (EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES = 12) THEN
        BEGIN
            OPDATAPREVISTARETIRADA =
            CAST(EXTRACT (MONTH FROM IPDATAFINAL) AS VARCHAR(5)) || ‘/’ ||
            :VDIAPADRAO || ‘/’ ||
            CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS + 1) AS VARCHAR(5));
        END
        ELSE
        BEGIN
            OPDATAPREVISTARETIRADA =
            CAST((EXTRACT (MONTH FROM IPDATAFINAL) – 12 + :VTEMPOARQUIVOMESES) AS VARCHAR(5)) || ‘/’ ||
            :VDIAPADRAO || ‘/’ ||
            CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS + 1) AS VARCHAR(5));
        END
        /** NO CASO DE MESES MENORES **/
        IF (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES < 12) THEN
        BEGIN
            /** NO CASO DE MESES MENORES PREENCHIDOS OS MESES**/
            IF (:VTEMPOESPERAMESES <> 0) THEN
            BEGIN
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 1) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 3) ) THEN
                    OPDATAREALRETIRADA = ’04/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 4) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 6) ) THEN
                    OPDATAREALRETIRADA = ’07/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 7) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 9) ) THEN
                    OPDATAREALRETIRADA = ’10/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 10) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 12) ) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1) AS VARCHAR(5));
                IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            END
            ELSE
            BEGIN
                /** NO CASO DE MESES MENORES PREENCHIDOS ANOS **/
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + VTEMPOESPERAANO)AS VARCHAR(5));
            END
        END
        ELSE
        BEGIN
            /** NO CASO DE MESES IGUAIS E MAIORES **/
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 1) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 3)) THEN
                OPDATAREALRETIRADA = ’04/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 4) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 6)) THEN
                OPDATAREALRETIRADA = ’07/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 7) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 9)) THEN
                OPDATAREALRETIRADA = ’10/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 10) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 12)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 2 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
        END
    END

    IF (VFINALCONCESSAO = ‘S’) THEN
    BEGIN
        SELECT DATAFINAL FROM FINALCONCESSAO INTO :VDATAFINALCONCESSAO;
        IF (:VDATAFINALCONCESSAO > :OPDATAREALRETIRADA) THEN
        BEGIN
            OPDATAPREVISTARETIRADA = VDATAFINALCONCESSAO;
            OPDATAREALRETIRADA = VDATAFINALCONCESSAO;
        END
        SUSPEND;
        EXIT;
    END
    SUSPEND;
END^

Trigger com Inserting e Updating no Firebird …

CREATE TRIGGER TR_ALA_QTD FOR ARQUIVO
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
begin

// SE ESTIVER INSERINDO FAZ ISSO
    IF (INSERTING) then
        EXECUTE PROCEDURE SP_ORGANIZA_QTD (NEW.CODIGOARQUIVO,’I’);

// SE ESTIVER ALTERANDO FAZ ISSO
    IF (UPDATING) then
    BEGIN
        if (NEW.STATUS <> OLD.STATUS) then
            EXECUTE PROCEDURE SP_ORGANIZA_QTD (OLD.CODIGOARQUIVO,’U’);
    END
end

Utilizando UDF no Firebird.

Primeiro declare a UDF como por exemplo :

DECLARE EXTERNAL FUNCTION LTRIM
    CSTRING(80) CHARACTER SET NONE
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT ‘IB_UDF_ltrim’ MODULE_NAME ‘ib_udf’;

DECLARE EXTERNAL FUNCTION STRLEN
    CSTRING(32767) CHARACTER SET NONE
RETURNS INTEGER BY VALUE
ENTRY_POINT ‘IB_UDF_strlen’ MODULE_NAME ‘ib_udf’;

DECLARE EXTERNAL FUNCTION RTRIM
    CSTRING(80) CHARACTER SET NONE
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT ‘IB_UDF_rtrim’ MODULE_NAME ‘ib_udf’;

DECLARE EXTERNAL FUNCTION LTRIM
    CSTRING(80) CHARACTER SET NONE
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT ‘IB_UDF_ltrim’ MODULE_NAME ‘ib_udf’;

depois é só usá-la

CREATE PROCEDURE SP_TEMPOLIGPART_SELECIONA
AS
DECLARE VARIABLE STRINGSQL VARCHAR(1000);
DECLARE VARIABLE STRINGSQL2 VARCHAR(1000);
DECLARE VARIABLE LODATA DATE;
DECLARE VARIABLE LOHORA TIME;
DECLARE VARIABLE LONUMERO VARCHAR(100);
DECLARE VARIABLE CODIGORAMAL INTEGER;
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE HORA TIME;
DECLARE VARIABLE DURACAO TIME;
DECLARE VARIABLE NUMERO CHAR(10);
begin
    STRINGSQL = ”;
    FOR
      SELECT DATA, HORA, NUMERO
      FROM LIGACAO
      WHERE DATA >= ’06/14/05′ AND TIPO = ‘PARTICULAR’ AND PABX IS NULL INTO :LODATA, :LOHORA, :LONUMERO
    DO
    BEGIN
      STRINGSQL = ‘ SELECT FIRST 1 CODIGORAMAL, DATA, HORA, DURACAO, NUMERO ‘;
      STRINGSQL = STRINGSQL || ‘ FROM LIGACOES’;
      STRINGSQL = STRINGSQL || ‘ WHERE TIPO = ‘ || ”” || ‘SAÍDA’ || ””;
      STRINGSQL = STRINGSQL || ‘ AND DATA =’ || ”” || :LODATA || ””  || ‘ AND’;
      STRINGSQL = STRINGSQL || ‘ (HORA >= ‘ || ”” || (:LOHORA – (5 * 60)) || ”” || ‘ ) AND’;
      STRINGSQL = STRINGSQL || ‘ (HORA <= ‘ || ”” || (:LOHORA + (20 * 60)) || ”” || ‘ ) AND’;
      STRINGSQL = STRINGSQL || ‘ (‘;
      /* O SUBSTR COMEÇA A CONTAR DO 0 ENTÃO COLOCAMOS 3 PARA PEGAR OS ULTIMOS 4 CARACTERES*/
      STRINGSQL = STRINGSQL || ‘ RTRIM(NUMERO) LIKE ‘ || ”” || ‘%’ || SUBSTR(:LONUMERO,STRLEN(RTRIM(:LONUMERO)) – 3,STRLEN(RTRIM(:LONUMERO))) || ””; /*||  ‘%’ || ””;*/
      STRINGSQL = STRINGSQL || ‘) ORDER BY 3 DESC’;
      FOR
          EXECUTE STATEMENT STRINGSQL INTO :CODIGORAMAL, :DATA, :HORA, :DURACAO, :NUMERO
      DO
      BEGIN
          STRINGSQL2 = ‘UPDATE LIGACAO’;
          STRINGSQL2 = STRINGSQL2 || ‘ SET PABX = ‘ || ”” || ‘   CÓD. RAMAL : ‘ || ”” || ”” || :CODIGORAMAL || ””
                                                    || ”” || ‘   DATA : ‘ || ”” || ”” || EXTRACT(DAY FROM :DATA) || ‘/’ || EXTRACT(MONTH FROM :DATA) || ‘/’ || EXTRACT(YEAR FROM :DATA) || ””
                                                    || ”” || ‘   HORA : ‘ || ”” || ”” || EXTRACT(HOUR FROM :HORA) || ‘:’ || EXTRACT (MINUTE FROM :HORA) || ‘:’ || EXTRACT(MINUTE FROM :HORA) || ””
                                                    || ”” || ‘  NUMERO :’ || ”” || ”” || :NUMERO || ””
                                                    || ”” || ‘ DURAÇÃO : ‘ ||”” || ”” || EXTRACT(HOUR FROM :DURACAO) || ‘:’ || EXTRACT (MINUTE FROM :DURACAO) || ‘:’ || EXTRACT(MINUTE FROM :DURACAO) || ””;
          STRINGSQL2 = STRINGSQL2 || ‘ WHERE DATA =’ || ”” || :LODATA || ”” || ‘ AND HORA =’ || ”” || :LOHORA || ”” || ‘ AND NUMERO LIKE ‘ || ”” || ‘%’ || SUBSTR(:LONUMERO,STRLEN(RTRIM(:LONUMERO)) – 3,STRLEN(RTRIM(:LONUMERO))) || ””; /*|| ‘%’ || ””;*/
          EXECUTE STATEMENT STRINGSQL2;
      END
    END
  suspend;
end

Consulta no Firebird, utilizando o Union.

Se você já precisou unir duas consultas no Firebird, porém uma não tinha a mesma quantidade de campos da outra, segue um exemplo abaixo utilizo o Union para unir as consultas e o Cast, para gerar campos nulos para que a consulta ocorra.

SELECT I.CODIGOIMAGEM, I.CODIGOALBUM, A.ALBUM, I.SEQUENCIAALBUM, C.CODIGOCATEGORIA, C.CATEGORIA, C.CODIGOTIPO, T.TIPO, C.PROPRIEDADEDIGITAL,
C.PROPRIEDADENEGATIVO, L.CODIGOLOGON, L.LOGON, I.CODIGOLOCAL, LO.LOCAL, LO.CODIGOOBJETO, O.OBJETO,  LO.CODIGOSP, S.SP, LO.KM, I.CODIGOEMPRESA,
E.EMPRESA, I.CODIGOFOTOGRAFO, F.FOTOGRAFO, F.CODIGOESTUDIO, ES.ESTUDIO, I.ASSUNTO, I.DATA, I.DATAREGISTRO, I.HORAREGISTRO
FROM IMAGEM I, ALBUM A, CATEGORIA C, TIPO T, LOGON L, LOCAL LO, OBJETO O, SP S, EMPRESA E, FOTOGRAFO F, ESTUDIO ES
WHERE I.CODIGOALBUM = A.CODIGOALBUM AND I.CODIGOCATEGORIA = C.CODIGOCATEGORIA AND C.CODIGOTIPO = T.CODIGOTIPO AND I.CODIGOLOGON = L.CODIGOLOGON AND
I.CODIGOLOCAL = LO.CODIGOLOCAL AND LO.CODIGOOBJETO = O.CODIGOOBJETO  AND LO.CODIGOSP = S.CODIGOSP AND I.CODIGOEMPRESA = E.CODIGOEMPRESA AND
F.CODIGOESTUDIO = ES.CODIGOESTUDIO AND I.CODIGOFOTOGRAFO = F.CODIGOFOTOGRAFO AND C.CODIGOCATEGORIA IS NOT NULL
UNION
SELECT I.CODIGOIMAGEM, I.CODIGOALBUM, A.ALBUM, I.SEQUENCIAALBUM, COALESCE(I.CODIGOCATEGORIA,NULL), CAST(”’EM BRANCO”’ AS VARCHAR(20)), COALESCE(0,NULL), CAST(”’EM BRANCO”’ AS VARCHAR(20)), CAST(” AS VARCHAR(1)),  CAST (” AS VARCHAR(1)), L.CODIGOLOGON, L.LOGON, COALESCE(I.CODIGOLOCAL,NULL), CAST(”’EM BRANCO”’ AS VARCHAR(20)), COALESCE(0, NULL), CAST(”’EM BRANCO”’ AS VARCHAR(50)), COALESCE(0,NULL), CAST (”’EM BRANCO”’ AS VARCHAR(20)), CAST(”’EM BRANCO”’ AS VARCHAR(20)), COALESCE(0,NULL), CAST(”’EM BRANCO”’ AS VARCHAR(50)), COALESCE(0,NULL), CAST(”’EM BRANCO”’ AS VARCHAR(50)), COALESCE(0,NULL),  CAST (”’EM BRANCO”’ AS VARCHAR(50)), CAST(”’EM BRANCO”’ AS VARCHAR(200)),I.DATA, I.DATAREGISTRO, I.HORAREGISTRO
FROM IMAGEM I, LOGON L, ALBUM A
WHERE I.CODIGOLOGON = L.CODIGOLOGON AND I.CODIGOALBUM = A.CODIGOALBUM AND I.CODIGOCATEGORIA IS NULL AND I.CODIGOFOTOGRAFO IS NULL AND I.ASSUNTO IS NULL
ORDER BY 1

Setando um Generator via Stored Procedure no Firebird.

CREATE PROCEDURE AAAAAA_APAGAAPARTIR (
    IPCODIGOINICIAL INTEGER)
AS
DECLARE VARIABLE VCODIGOMAIOR INTEGER;
begin
  /* SERÁ APAGADO DESTE ATÉ O ÚLTIMO INFORMADO, A PARTIR DESTE */
  DELETE FROM PROPRIEDADENEGATIVO WHERE CODIGOIMAGEM >= :IPCODIGOINICIAL;
  DELETE FROM RELACOES WHERE CODIGOIMAGEM >= :IPCODIGOINICIAL;
  DELETE FROM IMAGEM WHERE CODIGOIMAGEM >= :IPCODIGOINICIAL;

  SELECT MAX(CODIGOPROPRIEDADENEGATIVO) FROM PROPRIEDADENEGATIVO INTO :VCODIGOMAIOR;
  EXECUTE STATEMENT ‘SET GENERATOR GEN_CODIGOPROPRIEDADENEGATIVO TO ‘ || VCODIGOMAIOR;

  SELECT MAX(CODIGORELACOES) FROM RELACOES INTO :VCODIGOMAIOR;
  EXECUTE STATEMENT ‘SET GENERATOR GEN_CODIGORELACOES TO ‘ || VCODIGOMAIOR;

  SELECT MAX(CODIGOIMAGEM) FROM IMAGEM INTO :VCODIGOMAIOR;
  EXECUTE STATEMENT ‘SET GENERATOR GEN_CODIGOIMAGEM TO ‘ || VCODIGOMAIOR;

end

Stored Procedure no Firebird utilizando Vários Recursos.

CREATE PROCEDURE SP_MEDIA_INCLUITE
AS
DECLARE VARIABLE DATAINICIAL DATE;
DECLARE VARIABLE PREFIXO VARCHAR(5);
DECLARE VARIABLE TIPO VARCHAR(6);
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE KMINICIAL NUMERIC(18,2);
DECLARE VARIABLE KMFINAL NUMERIC(18,2);
DECLARE VARIABLE MEDIA NUMERIC(18,2);
DECLARE VARIABLE COMBUSTIVELQTD NUMERIC(18,2);
DECLARE VARIABLE COMBUSTIVELVLR NUMERIC(18,2);
DECLARE VARIABLE GRAXAQTD NUMERIC(18,2);
DECLARE VARIABLE MANUTENCAOVLR NUMERIC(18,2);
DECLARE VARIABLE LUBRIFACANTEQTD NUMERIC(18,2);
DECLARE VARIABLE FILTROQTD NUMERIC(18,2);
DECLARE VARIABLE FILTROVLR NUMERIC(18,2);
DECLARE VARIABLE MAQUINAVEICULO VARCHAR(1);
DECLARE VARIABLE OBSERVACAO VARCHAR(200);
DECLARE VARIABLE RESPONSAVEL VARCHAR(100);
DECLARE VARIABLE HORAKM NUMERIC(18,2);
DECLARE VARIABLE IMPORTACAO INTEGER;
DECLARE VARIABLE DATAFINAL DATE;
BEGIN
/*
 PONTOS IMPORTANSSIMOS : ERROS QUE NÃO PODERÍAM DAR
 MEDIA, MEDIALEVES, MEDIAPESADOS COM 0;
 KMINICIAL E KMFINAL IGUAIS;
 QTDCOMBUSTIVEL 0;
*/
  FOR
    SELECT PREFIXO, DATA FROM IMPORTACAO INTO :PREFIXO, :DATA
  DO
  BEGIN
    FOR
        SELECT PREFIXO, TIPO, DATA, KMFINAL, OBSERVACAO, RESPONSAVEL
        FROM MEDIAINTERMEDIARIA
        WHERE  PREFIXO = :PREFIXO AND DATA > :DATA  AND (COALESCE(MEDIALEVES,0) <> 0)
        ORDER BY 1,3
        INTO :PREFIXO, :TIPO, :DATAFINAL, :KMFINAL, :OBSERVACAO, :RESPONSAVEL
    DO
    BEGIN
        SELECT FIRST 1 DATA FROM MEDIAINTERMEDIARIA
        WHERE PREFIXO = :PREFIXO AND DATA < :DATAFINAL AND (COALESCE(MEDIALEVES,0) <> 0)
        ORDER BY DATA DESC INTO :DATAINICIAL;
 
        IF (DATAINICIAL IS NULL) THEN
        BEGIN
            DATAINICIAL = DATAFINAL;
        END
 
        IF (DATAINICIAL <> DATAFINAL) THEN
        BEGIN
           DATAINICIAL = DATAINICIAL + 1;
        END
 
        SELECT SUM(MEDIA) AS MEDIA, SUM(COMBUSTIVELQTD) AS COMBUSTIVELQTD, SUM(COMBUSTIVELVLR) AS COMBUSTIVELVLR, SUM(GRAXAQTD) AS GRAXAQTD, SUM(MANUTENCAOVLR) AS MANUTENCAOVLR, SUM(LUBRIFACANTEQTD) AS LUBRIFACANTEQTD, SUM(FILTROQTD) AS FILTROQTD, SUM(FILTROVLR) AS FILTROVLR
        FROM MEDIAINTERMEDIARIA
        WHERE PREFIXO = :PREFIXO AND DATA >= :DATAINICIAL AND DATA <= :DATAFINAL
        INTO :MEDIA, :COMBUSTIVELQTD, :COMBUSTIVELVLR, :GRAXAQTD, :MANUTENCAOVLR, :LUBRIFACANTEQTD, :FILTROQTD, :FILTROVLR;
 
        SELECT MIN(KMINICIAL)
        FROM MEDIAINTERMEDIARIA
        WHERE PREFIXO = :PREFIXO AND DATA = :DATAINICIAL
        INTO :KMINICIAL;
        IF ((COALESCE(KMINICIAL,0) = 0) OR (KMINICIAL IS NULL)) THEN
        BEGIN
            SELECT MIN(KMFINAL)
            FROM MEDIAINTERMEDIARIA
            WHERE PREFIXO = :PREFIXO AND DATA = :DATAINICIAL – 1
            INTO :KMINICIAL;
        END
        IF ((COALESCE(KMINICIAL,0) <> 0) AND (COALESCE(KMFINAL,0) <> 0) AND (COALESCE(COMBUSTIVELQTD,0) <> 0) AND ( (COALESCE(KMINICIAL,0) – COALESCE(KMFINAL,0) <> 0))  ) THEN
        BEGIN
            IF (TIPO = ‘L’) THEN
                MEDIA = COALESCE( (KMFINAL – KMINICIAL) / COMBUSTIVELQTD, 0 );
            IF (TIPO = ‘P’) THEN
                MEDIA = COALESCE( COMBUSTIVELQTD / (KMFINAL – KMINICIAL), 0 );
        END
        ELSE
        BEGIN
            MEDIA = 0;
        END
        EXECUTE PROCEDURE SP_MEDIA_INCLUI ( :PREFIXO, :DATAINICIAL, :DATAFINAL, MEDIA, :KMINICIAL, :KMFINAL, :COMBUSTIVELVLR, :GRAXAQTD, :MANUTENCAOVLR, :COMBUSTIVELQTD, :LUBRIFACANTEQTD, :KMFINAL – :KMINICIAL, :FILTROQTD, :FILTROVLR, :TIPO);
 
        SELECT COALESCE(COUNT(*),0) FROM IMPORTACAO WHERE PREFIXO = :PREFIXO INTO :IMPORTACAO;
        IF (IMPORTACAO = 0) THEN
        BEGIN
            INSERT INTO IMPORTACAO ( PREFIXO, DATA) VALUES (:PREFIXO,:DATA);
        END
        ELSE
        BEGIN
          UPDATE IMPORTACAO
          SET  DATA = :DATAFINAL
          WHERE (PREFIXO = :PREFIXO);
        END
   /*     DELETE FROM MEDIA WHERE PREFIXO = :PREFIXO AND (MEDIA = 0 OR MEDIA IS NULL OR MEDIA < 0);*/
 /*       DELETE FROM MEDIAINTERMEDIARIA WHERE PREFIXO = :PREFIXO;*/
    END
  END
  DELETE FROM MEDIA WHERE MEDIA = 0 OR MEDIA IS NULL OR MEDIA < 0;
  DELETE FROM MEDIAINTERMEDIARIA;
END

Importando Arquivos Textos direto para o Firebird.

Isto só é possível com a criação externa de tabelas.

CREATE TABLE PAGAMENTOIMPORTACAO EXTERNAL ‘/home/sistemas/teste/Importa’ (
    EMPRESA       CHAR(3) CHARACTER SET NONE,
    FILIAL        CHAR(2) CHARACTER SET NONE,
    DEPARTAMENTO  CHAR(3) CHARACTER SET NONE,
    SETOR         CHAR(3) CHARACTER SET NONE,
    FILREG        CHAR(2) CHARACTER SET NONE,
    FICHAREG      CHAR(6) CHARACTER SET NONE,
    CODIGO        CHAR(3) CHARACTER SET NONE,
    NUMHORAS      CHAR(5) CHARACTER SET NONE,
    VALHORAS      CHAR(7) CHARACTER SET NONE,
    BASE          CHAR(12) CHARACTER SET NONE,
    VALOR         CHAR(12) CHARACTER SET NONE,
    CTRL          CHAR(2) CHARACTER SET NONE
);

o caminho REAL do SERVIDOR onde ficará o arquivo é “/home/sistemas/teste/Importa”,

no final é obrigatório a utilização do “CTRL CHAR(2) CHARACTER SET NONE”, que indica a mudança de linha.

criei uma outra stored procedure que lê tudo o que está nessa tabela e insere na minha tabela real, realizando as conversões.

 

CREATE PROCEDURE SP_PAGIMPORTACAO_CONVERSAO (
    IPDATA DATE)
AS
DECLARE VARIABLE VEMPRESA CHAR(3);
DECLARE VARIABLE VFILIAL CHAR(2);
DECLARE VARIABLE VDEPARTAMENTO CHAR(3);
DECLARE VARIABLE VSETOR CHAR(3);
DECLARE VARIABLE VFILREG CHAR(2);
DECLARE VARIABLE VFICHAREG CHAR(6);
DECLARE VARIABLE VCODIGO CHAR(3);
DECLARE VARIABLE VNUMHORAS CHAR(5);
DECLARE VARIABLE VVALHORAS CHAR(7);
DECLARE VARIABLE VBASE CHAR(12);
DECLARE VARIABLE VVALOR CHAR(12);
DECLARE VARIABLE VMES VARCHAR(3);
DECLARE VARIABLE VSTRINGSQL VARCHAR(100);
DECLARE VARIABLE OPEMPRESA INTEGER;
DECLARE VARIABLE OPFILIAL INTEGER;
DECLARE VARIABLE OPDEPARTAMENTO INTEGER;
DECLARE VARIABLE OPSETOR INTEGER;
DECLARE VARIABLE OPFILREG INTEGER;
DECLARE VARIABLE OPFICHAREG INTEGER;
DECLARE VARIABLE OPCODIGO INTEGER;
DECLARE VARIABLE OPNUMHORAS NUMERIC(3,2);
DECLARE VARIABLE OPVALHORAS NUMERIC(5,2);
DECLARE VARIABLE OPBASE NUMERIC(10,2);
DECLARE VARIABLE OPVALOR NUMERIC(10,2);
begin
    FOR
        SELECT EMPRESA, FILIAL, DEPARTAMENTO, SETOR, FILREG, FICHAREG, CODIGO, NUMHORAS, VALHORAS, BASE, VALOR
        FROM PAGAMENTOIMPORTACAO
        INTO :VEMPRESA, :VFILIAL, :VDEPARTAMENTO, :VSETOR, :VFILREG, :VFICHAREG, :VCODIGO, :VNUMHORAS, :VVALHORAS, :VBASE, :VVALOR
    DO
    BEGIN
        OPEMPRESA = CAST(:VEMPRESA AS INTEGER);
        OPFILIAL = CAST(:VFILIAL AS INTEGER);
        OPDEPARTAMENTO = CAST(:VDEPARTAMENTO AS INTEGER);
        OPSETOR = CAST(:VSETOR AS INTEGER);
        OPFILREG = CAST(:VFILREG AS INTEGER);
        OPFICHAREG = CAST(:VFICHAREG AS INTEGER);
        OPCODIGO = CAST(:VCODIGO AS INTEGER);
        OPNUMHORAS = CAST(SUBSTR(:VNUMHORAS,1,3) || + ‘.’ || + SUBSTR(:VNUMHORAS,4,6) AS NUMERIC (3,2));
        OPVALHORAS = CAST(SUBSTR(:VVALHORAS,1,5) || + ‘.’ || + SUBSTR(:VVALHORAS,6,8) AS NUMERIC (5,2));
        OPBASE = CAST(SUBSTR(:VBASE,1,10) || + ‘.’ || + SUBSTR(:VBASE,11,12) AS NUMERIC (10,2));
        OPVALOR = CAST(SUBSTR(:VVALOR,1,10) || + ‘.’ || + SUBSTR(:VVALOR,11,12) AS NUMERIC (10,2));

        INSERT INTO PAGAMENTO (EMPRESA, FILIAL, DEPARTAMENTO, SETOR, FILREG, FICHAREG, CODIGO, NUMHORAS, VALHORAS, BASE, VALOR, DATA)
        VALUES (:OPEMPRESA, :OPFILIAL, :OPDEPARTAMENTO, :OPSETOR, :OPFILREG, :OPFICHAREG, :OPCODIGO, :OPNUMHORAS, :OPVALHORAS, :OPBASE, :OPVALOR, :IPDATA);
    END
end

Procedure que Apaga Registros e Zera os Generators no Firebird.

SET SQL DIALECT 3;
SET NAMES ISO8859_1;

SET TERM ^ ;
CREATE PROCEDURE SP_LIMPAR_TABELAS
AS
BEGIN
EXIT;
END^
SET TERM ; ^

SET TERM ^ ;
ALTER PROCEDURE SP_LIMPAR_TABELAS
AS
DECLARE VARIABLE NOME_OBJETO VARCHAR(80);
DECLARE VARIABLE VSQL VARCHAR(256);
begin
FOR
SELECT DISTINCT t.RDB$RELATION_NAME TABELA
FROM RDB$USER_PRIVILEGES t
WHERE t.RDB$RELATION_NAME NOT LIKE ‘RDB$%’ AND
t.RDB$OBJECT_TYPE=0
ORDER BY 1
INTO :nome_objeto
DO
BEGIN
VSQL = ‘DELETE FROM ‘ :nome_objeto;
EXECUTE STATEMENT VSQL;
END

FOR SELECT g.RDB$GENERATOR_NAME
FROM RDB$GENERATORS g
WHERE (g.RDB$GENERATOR_NAME NOT LIKE ‘RDB$%’) AND
(g.RDB$GENERATOR_NAME NOT LIKE ‘SQL$%’)
INTO :nome_objeto
DO
BEGIN
VSQL = ‘SET GENERATOR ‘ :nome_objeto ‘ TO 0’;
EXECUTE STATEMENT VSQL;
END

end

Loop em tabelas utilizando o Firebird.

Fazendo um Loop nas Tabelas usando o Execute Statment …

Imagine o Cenário vc não sabe em qual tabela esta a menor data de um certo campo, e precisamos fazer um Loop nas tabelas para descobrirmos qual a data é menor.

Tabelas
Campo

Documento1
DataInicial
Documento2
DataInicial
Documento3
DataInicial
Documento4
DataInicial

CREATE PROCEDURE SP_DOCUMENTO_MENORDATA
RETURNS (
OPDATAFINAL DATE)
AS
DECLARE VARIABLE VNOMETABELA VARCHAR(100);
DECLARE VARIABLE VDATAINICIAL DATE;
DECLARE VARIABLE VSQL VARCHAR(1000);
begin
OPDATAFINAL = CURRENT_DATE;
FOR
SELECT DISTINCT T.RDB$RELATION_NAME TABELA
FROM RDB$USER_PRIVILEGES T
WHERE T.RDB$RELATION_NAME NOT LIKE ‘RDB$%’ AND T.RDB$OBJECT_TYPE=0 AND T.RDB$RELATION_NAME LIKE ‘DOCUMENTO%’
ORDER BY 1
INTO :VNOMETABELA
DO
BEGIN
VSQL = ”;
VSQL = ‘SELECT MIN(DATAINICIAL) FROM ‘ || :VNOMETABELA;
EXECUTE STATEMENT VSQL INTO :VDATAINICIAL;
IF (:VDATAINICIAL < :OPDATAFINAL) THEN
BEGIN
OPDATAFINAL = :VDATAINICIAL;
END
END
end

Criando uma Mensagem de uma Exception em tempo de execução, no Firebird.

Neste caso a Exception Relacionamento é construída na execução da Procedure.

CREATE PROCEDURE SP_LOGON_EXCLUI (
CODIGOLOGON INTEGER)
AS
DECLARE VARIABLE VNOME VARCHAR(100);
BEGIN
SELECT LOGON
FROM LOGON L, ACESSOS A
WHERE L.CODIGOLOGON = A.CODIGOLOGON INTO :VNOME;

DELETE FROM LOGON
WHERE CODIGOLOGON = :CODIGOLOGON;
WHEN SQLCODE -530 DO
EXCEPTION RELACIONAMENTO ‘NÃO É POSSÍVEL EXCLUIR O ACESSO DO USUÁRIO ‘ || VNOME;
END

Gerando Log no Firebird, quando der erro será gravado na em tabela.

Neste caso a Exception para todos os erros grava em uma tabela de log o erro encontrado isso se torna interessante na hora da depuração.

CREATE PROCEDURE SP_LOGON_EXCLUI (
CODIGOLOGON INTEGER)
AS
DECLARE VARIABLE VNOME VARCHAR(100);
BEGIN
SELECT LOGON
FROM LOGON L, ACESSOS A
WHERE L.CODIGOLOGON = A.CODIGOLOGON INTO :VNOME;

DELETE FROM LOGON
WHERE CODIGOLOGON = :CODIGOLOGON ;

WHEN ANY DO
BEGIN
INSERT INTO LOG (LOG)
VALUES (CAST(SQLCODE AS VARCHAR(10)) || ‘ ERRO ‘);
END
END

Execute Statement no Firebird, uso avançado.

Execute Statement a Fundo …

Mudando um pouco de não só o execute stament, imagine que o usuário possui um Nível que está ligado a verificação de registros de vários setores e que o Nível 1 tem acesso a todos os setores.

Ex:
Setor :
1 – ADM
2 – CONSERVA
3 – PEDÁGIO

Usuários :
Cód. – Nome – Nível
1 – SÁVIO – 2
2 – BRANDINO – 2
3 – DIRETOR – 1

Acessos :
2 CONSERVA – 1 SÁVIO
3 PEDÁGIO – 2 BRANDINO
1 ADM – 3 DIRETOR
2 CONSERVA – 3 DIRETOR
3 PEDÁGIO – 3 DIRETOR

Quando o usuário incluir o usuário com o nível um na tabela de acessos terá que ser criado um acesso para cada setor já que ele é o nível 1 que tem acesso a todos os setores.

CREATE PROCEDURE SP_LOGON_INCLUI (
LOGON VARCHAR(20),
SENHA VARCHAR(10),
NIVEL INTEGER)
AS
DECLARE VARIABLE VCODIGOSETOR INTEGER;
DECLARE VARIABLE VCODIGOLOGON INTEGER;
BEGIN
INSERT INTO LOGON ( LOGON, SENHA, NIVEL)
VALUES ( :LOGON, :SENHA, :NIVEL);

SELECT CODIGOLOGON FROM LOGON WHERE LOGON = :LOGON AND SENHA = :SENHA AND NIVEL = :NIVEL INTO :VCODIGOLOGON;

IF (:NIVEL = 1) THEN
BEGIN
FOR
SELECT CODIGOSETOR FROM SETOR INTO :VCODIGOSETOR
DO
INSERT INTO ACESSOS (CODIGOSETOR, CODIGOLOGON) VALUES (:VCODIGOSETOR, :VCODIGOLOGON);
END

WHEN SQLCODE -803 DO
EXCEPTION CHAVE;
END

CREATE PROCEDURE SP_LOGON_ALTERA (
CODIGOLOGON INTEGER,
LOGON VARCHAR(20),
SENHA VARCHAR(10),
NIVEL INTEGER)
AS
BEGIN
IF (:NIVEL = 1) THEN
BEGIN
EXCEPTION ERRO ‘PARA O NÍVEL ‘ || :NIVEL || ‘ DO USUÁRIO ‘ || :LOGON || ‘ NÃO É POSSÍVEL ALTERAÇÃO’;
EXIT;
END
ELSE
BEGIN
UPDATE LOGON
SET LOGON = :LOGON, SENHA = :SENHA, NIVEL = :NIVEL
WHERE (CODIGOLOGON = :CODIGOLOGON);
END
END

CREATE PROCEDURE SP_LOGON_EXCLUI (
CODIGOLOGON INTEGER)
AS
DECLARE VARIABLE VNOME VARCHAR(100);
BEGIN
SELECT LOGON
FROM LOGON L, ACESSOS A
WHERE L.CODIGOLOGON = A.CODIGOLOGON INTO :VNOME;

DELETE FROM LOGON
WHERE CODIGOLOGON = :CODIGOLOGON;

WHEN SQLCODE -530 DO
EXCEPTION RELACIONAMENTO ‘NÃO É POSSÍVEL EXCLUIR O ACESSO DO USUÁRIO ‘ || VNOME;
END