[firebase-br] Criar campo chave para diversas tabelas em um único comando

Eduardo Belo beloelogica em gmail.com
Ter Jun 5 16:25:47 -03 2012


Robson, mais uma vez obrigado pela ajuda.

Veja, eu não preciso alterar o nome do campo, pois tenho vários com nomes
diferentes(TOTAL, VLR_TOTAL, TOT, ETC), todos do tipo DOUBLE PRECISION e
quero alterar para NUMERIC(10,2). Agtadeço por mais essa ajuda.

abs

Em 5 de junho de 2012 13:15, Robson Zambroti <rlzambroti em gmail.com>escreveu:

> Quando a alteração do campo o melhor que consegui (no curto tempo do
> almoço) foi gerar um script para sua necessidade, veja abaixo:
>
> EXECUTE BLOCK (NOME_CAMPO VARCHAR(30) = :NOME_CAMPO, NOVO_TIPO VARCHAR(100)
> = :NOVO_TIPO, TIPO_ATUAL INTEGER = :TIPO_ATUAL)
>            -- NOME DO CAMPO A SER ALTERADO        | NOVO TIPO EX.
> NUMERIC(10,2)        |  TIPO ATUAL 27 = DOUBLE PRECISION
> RETURNS (P_SQL VARCHAR(1500))
> AS
> DECLARE VARIABLE V_TABLE VARCHAR(30);
> BEGIN
>  P_SQL = '';
>  FOR
>      SELECT
>            TRIM(RDB$RELATION_FIELDS.RDB$RELATION_NAME)
>       FROM RDB$RELATION_FIELDS
>       LEFT JOIN RDB$FIELDS ON RDB$FIELDS.RDB$FIELD_NAME =
> RDB$RELATION_FIELDS.RDB$FIELD_SOURCE
>      WHERE RDB$FIELDS.RDB$FIELD_TYPE          = :TIPO_ATUAL
>        AND RDB$RELATION_FIELDS.RDB$FIELD_NAME = :NOME_CAMPO
>        AND NOT(RDB$RELATION_FIELDS.RDB$RELATION_NAME LIKE 'RDB$%')
>       INTO :V_TABLE
>  DO
>  BEGIN
>    P_SQL = 'ALTER TABLE '||:V_TABLE||' ADD CAMPO_TMP '||:NOVO_TIPO||';';
>    P_SQL = :P_SQL||ASCII_CHAR(13)||
>            'UPDATE '||:V_TABLE||' SET CAMPO_TMP = '||:NOME_CAMPO||';';
>    P_SQL = :P_SQL||ASCII_CHAR(13)||
>            'ALTER TABLE '||:V_TABLE||' DROP '||:NOME_CAMPO||';';
>    P_SQL = :P_SQL||ASCII_CHAR(13)||
>            'ALTER TABLE '||:V_TABLE||' ADD '||:NOME_CAMPO||'
> '||:NOVO_TIPO||';';
>    P_SQL = :P_SQL||ASCII_CHAR(13)||
>            'UPDATE '||:V_TABLE||' SET '||:NOME_CAMPO||' = CAMPO_TMP;';
>    P_SQL = :P_SQL||ASCII_CHAR(13)||
>            'ALTER TABLE '||:V_TABLE||' DROP CAMPO_TMP;';
>    SUSPEND;
>  END
> END
>
>
> Este execute block gera um script ai você precisa executar depois.
> Espero ter ajudado.
> Att.
> Robson Zambroti
>
> Em 5 de junho de 2012 12:30, Robson Zambroti <rlzambroti em gmail.com
> >escreveu:
>
> > Eduardo,
> > Tente assim (obs. testado no FB2.5):
> >
> > EXECUTE BLOCK
> > AS
> > DECLARE VARIABLE SQL VARCHAR(1500);
> > BEGIN
> >   FOR
> >       SELECT DISTINCT
> >              'ALTER TABLE '||
> >              TRIM(RDB$RELATION_FIELDS.RDB$RELATION_NAME)||
> >              ' ADD CONSTRAINT PK_'||
> >              TRIM(RDB$RELATION_FIELDS.RDB$RELATION_NAME)||
> >              ' PRIMARY KEY
> > ('||TRIM(RDB$RELATION_FIELDS.RDB$FIELD_NAME)||');'
> >         FROM RDB$RELATION_FIELDS
> >        WHERE RDB$RELATION_FIELDS.RDB$FIELD_NAME = 'ITEM'
> >          AND RDB$RELATION_FIELDS.RDB$VIEW_CONTEXT IS NULL
> >          AND NOT EXISTS ( SELECT NULL
> >                             FROM RDB$RELATION_CONSTRAINTS,
> > RDB$INDEX_SEGMENTS
> >                            WHERE
> > RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
> >                              AND RDB$INDEX_SEGMENTS.RDB$FIELD_NAME =
> > RDB$RELATION_FIELDS.RDB$FIELD_NAME
> >                              AND
> > RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME =
> > RDB$RELATION_FIELDS.RDB$RELATION_NAME
> >                              AND RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME
> =
> > RDB$INDEX_SEGMENTS.RDB$INDEX_NAME  )
> >         INTO :SQL
> >   DO
> >   BEGIN
> >     EXECUTE STATEMENT SQL;
> >   END
> > END
> >
> > Att
> > Robson Zambroti
> >
> > Em 5 de junho de 2012 12:10, Eduardo Belo <beloelogica em gmail.com
> >escreveu:
> >
> > Prezados,
> >>
> >>
> >> Tem como criar um script  único afim de criar uma chave primaria para
> >> todas
> >> as tabelas de uma vez só? Todas as tabelas em comum tem o campo chave
> >> "ITEM". A questão é que são 5 bases e todas em média tem cerca de 100
> >> tabelas, pela lógica teria que fazer isso manualmente uma a uma, tipo:
> >> ALTER TABLE CLIENTE ADD CONSTRAINT PK_CLIENTE PRIMARY KEY (ITEM).
> >>
> >> Tem como fazer isso de uam vez só afim de facilitar a manutenção?
> >>
> >>
> >> A mesma pergunta faço para alterar de uma vez só um determinado tipo de
> >> campo de todas as tabelas, exemplo: alterar todas as tabelas que tem o
> >> campo tipo DOUBLE PRECISION para NUMERIC(15,2) ?
> >>
> >>
> >>
> >> Agradeço antecipadamente a todos que ajudarem.
> >>
> >>
> >>
> >> Eduardo Belo
> >> ______________________________________________
> >> 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://firebase.com.br/pesquisa
> >>
> >
> >
> >
> > --
> > Att.
> > Robson Zambroti
> >
> >
>
>
> --
> Att.
> Robson Zambroti
> ______________________________________________
> 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://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista