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

Washington Tavares washingtontavares em gmail.com
Ter Mar 20 12:08:05 -03 2018


A correção seria na Linha, aonde tem :
/* Setença Padrão DDL Adição do Campo */
        vSQL = 'ALTER TABLE ' || trim(:I_TABELA) || ' ADD ' || :I_FIELD ||'
'|| :I_DOM;

Altere por essa:  vSQL = 'ALTER TABLE ' || trim(:I_TABELA) || ' ADD ' ||
:I_FIELD ||' '|| :I_DOM;

Estava faltando um espaço entre  :I_FIELD ||' '|| :I_DOM;

2018-03-20 11:43 GMT-03:00 Tony <tony em tonysoftwares.com.br>:

> 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
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://www.firebase.com.br/
> pesquisa_lista.html
>



-- 
Washington Tavares
84 9188 3135(tim)
tawaresw em hotmail.com
tawaresw em yahoo.com
Skype: washington_tavares



Mais detalhes sobre a lista de discussão lista