[firebase-br] Procedure de Criação Automática de Campos Funciona em Parte

Tony tony em tonysoftwares.com.br
Ter Mar 20 11:43:54 -03 2018


Prezados,

A seguinte Procedure DDL Firebird compila mas executa à contento quando é
passado o nome da Tabela, ou seja, não executa no Loop das tabelas do Banco
de dados.

Alguém ajuda como poderíamos corrigir ou melhorar o código.

create or alter procedure Z_DDL_INSFIELDTABLE (
    I_TABELA varchar(31),
    I_FIELD varchar(20),
    I_DOM varchar(20),
    I_DEFAULT varchar(20),
    I_NOTNULL char(1))
as
declare variable VSQL varchar(32765);
declare variable VTABLE varchar(31);
declare variable VDTYPE smallint;
begin
    /* Setença DDL de Adição de Campo na Tabela Firebird
       ALTER TABLE SETOR ADD CHEFE_ID dom_i_integer DEFAULT 0 NOT NULL ; */

    /* Qual o tipo do DOMINIO?
    WHEN 261 THEN 'BLOB' ; WHEN 14 THEN 'CHAR' ; WHEN 40 THEN 'CSTRING'
    WHEN 11 THEN 'D_FLOAT' ; WHEN 27 THEN 'DOUBLE' ; WHEN 10 THEN 'FLOAT'
    WHEN 16 THEN 'INT64' ; WHEN 8 THEN 'INTEGER' ; WHEN 9 THEN 'QUAD'
    WHEN 7 THEN 'SMALLINT' ; WHEN 12 THEN 'DATE' ; WHEN 13 THEN 'TIME'
    WHEN 35 THEN 'TIMESTAMP' ; WHEN 37 THEN 'VARCHAR'
    */
    SELECT DISTINCT RDB$FIELDS.RDB$FIELD_TYPE
    FROM    RDB$FIELDS
    INNER JOIN RDB$RELATION_FIELDS
           ON (RDB$RELATION_FIELDS.RDB$FIELD_SOURCE =
RDB$FIELDS.RDB$FIELD_NAME)
    WHERE RDB$FIELDS.RDB$SYSTEM_FLAG <> 1 and
RDB$FIELDS.RDB$FIELD_NAME=:I_DOM
    INTO :vDTYPE;

    vTABLE = :I_TABELA;

    /* LOOPING de todas as Tabelas */
    FOR Select Trim(rdb$Relation_Name)
        From rdb$relations
        Where (rdb$system_flag <> 1 or Rdb$System_Flag is null) and
Rdb$View_BLR is null
        Order by rdb$relation_name

    INTO :I_TABELA do begin

        if (vTABLE <> '' or vTABLE Is Not Null) then
            I_TABELA = vTABLE;

        /* Setença Padrão DDL Adição do Campo */
        vSQL = 'ALTER TABLE ' || trim(:I_TABELA) || ' ADD ' || :I_FIELD ||'
'|| :I_DOM;

        /* HÁ VALOR PADRÃO ? */
        if (:I_DEFAULT <> '' or :I_DEFAULT Is Null) then begin
           if (:vDTYPE = 14 or :vDTYPE = 37) /* Char, Varchar */ then
              vSQL = vSQL || ' DEFAULT ' ||''||:I_DEFAULT||'';   else
              vSQL = vSQL || ' DEFAULT ' ||:I_DEFAULT ; /* pressuponto
Integer !!! TESTAR OUTROS DEPOIS */
        end

        /* NULL ou NOT NULL ? */
        if (:I_NOTNULL='S') then
           vSQL = vSQL || ' NOT NULL ';

        /* Executa a Setença */
        EXECUTE STATEMENT vSQL;

        /* Tabela Individual ? */
        if (vTABLE <> '' or vTABLE Is Not Null) then Exit;
    end
end



Mais detalhes sobre a lista de discussão lista