[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