[firebase-br] Procedure Firebird Compila e não Executa

Tony tony em tonysoftwares.com.br
Seg Jan 15 14:42:55 -03 2018


Pessoal,

A seguinte Procedure DDL Firebird compila mas não executa. Trata ela de
criação automática de campo nas Tabelas de um BD ou apenas numa Tabela
informada.

Alguém ajuda?

create or alter procedure Z_DDL_INSFIELDTABLE (
    I_TABELA varchar(20),
    I_FIELD varchar(20),
    I_DOM varchar(20),
    I_DEFAULT varchar(20),
    I_NOTNULL char(1))
as
declare variable VSQL varchar(32765);
declare variable VDTYPE smallint;
begin
    /* 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;

/*ALTER TABLE SETOR
    ADD CHEFE_ID dom_i_integer DEFAULT 0 NOT NULL ; */

    /* Setença DDL conforme Tipo do Domínio e NULL not */
    vSQL = 'ALTER TABLE ' || :I_TABELA || ' ADD ' || :I_FIELD || :I_DOM;

    /* TABELA INDIVIDUAL OU TODAS TABELAS */
    if (:I_TABELA <> '' ) then begin
        /* HÁ VALOR PADRÃO ? */
        if (:I_DEFAULT <> '') 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 ' ;

         EXECUTE STATEMENT vSQL; /* Executa a Setença */
     end else begin
      /* LOOPING de todas as Tabelas */
      FOR Select 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
          EXECUTE STATEMENT vSQL;
    end
end



Mais detalhes sobre a lista de discussão lista