[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