[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