[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