[firebase-br] Procedure Firebird Compila e não Executa
Sandro Souza
escovadordebits em gmail.com
Seg Jan 15 16:33:02 -03 2018
Bom dia/tarde/noite Tony.
Fiz alguns ajustes no seu código fonte.
Por gentileza, teste essa nova versão da sua stored procedure e nos informe
se funcionou.
SET TERM ^ ;
CREATE 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 VPREFIXO varchar(32765);
declare variable VSUFIXO 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
A.RDB$FIELD_TYPE
FROM
RDB$FIELDS A,
RDB$RELATION_FIELDS B
WHERE
(A.RDB$SYSTEM_FLAG <> 1)AND
(A.RDB$FIELD_NAME = :I_DOM)AND
(B.RDB$FIELD_SOURCE = A.RDB$FIELD_NAME)
INTO
:vDTYPE;
-- Gera o prefixo do comando SQL.
VPREFIXO = 'ALTER TABLE ';
-- Gera o sufixo do comando SQL.
VSUFIXO = ' ADD ' || :I_FIELD || ' ' || :I_DOM;
-- HÁ VALOR PADRÃO ?
IF ((I_DEFAULT IS NOT NULL) AND (I_DEFAULT > '')) THEN
BEGIN
IF (vDTYPE IN(14,37)) /* Char, Varchar */ THEN
VSUFIXO = VSUFIXO || ' DEFAULT ''' || I_DEFAULT || '''';
ELSE
VSUFIXO = VSUFIXO || ' DEFAULT ' || I_DEFAULT; -- pressuponto
Integer !!! TESTAR OUTROS DEPOIS
END
-- NOT NULL?
if (I_NOTNULL = 'S') THEN
VSUFIXO = VSUFIXO || ' NOT NULL';
-- Deve criar a coluna em apenas uma tabela?
IF ((I_TABELA IS NOT NULL) AND (TRIM(I_TABELA) > '')) THEN
-- Cria a nova coluna.
EXECUTE STATEMENT (VPREFIXO || I_TABELA || VSUFIXO);
ELSE
-- Laco para obter os nomes de todas as tabelas.
FOR SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS
WHERE
(RDB$SYSTEM_FLAG <> 1)AND
(RDB$VIEW_BLR IS NULL)
ORDER BY
1
INTO
:I_TABELA DO
EXECUTE STATEMENT (VPREFIXO || I_TABELA || VSUFIXO);
END^
SET TERM ; ^
Espero ter ajudado mais que atrapalhado. :D
2018-01-15 13:42 GMT-03:00 Tony <tony em tonysoftwares.com.br>:
> 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
> ______________________________________________
> 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
>
Mais detalhes sobre a lista de discussão lista