Pular para o conteúdo
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #84198
    mpvargas
    Participante

      Preciso alimentar um campo de uma tabela através da subtração de dois outros campos. Como posso fazer isso?
      Exemplo:

      TABELA TESTE

      CAMPO 1 (number)
      CAMPO 2 (number)

      NOVO CAMPO = CAMPO 2 – CAMPO 1

      Qual é a melhor forma de fazer isso, levando em consideração que a tabela tem +ou- 50.000 linhas?

      #84199
      Manoel872
      Participante

        UPDATE TESTE SET NOVO CAMPO = CAMPO 2 – CAMPO 1

        Seria isso… como deve ser para tabela inteira acredito que seja assim, causando um full table scan de preferência…

        #84200
        mpvargas
        Participante

          Obrigado pela ajuda.
          Seria algo assim… mas eu tenho como fazer que esse campo receba esses valores automaticamente, ou só é possível numa aplicação?
          Digo, quando inseridos novos valores nos campos 1 e 2, o novo campo seria preenchido automaticamente com a subtração.

          #84201
          Ishii
          Participante

            Olá

            Use uma trigger…

            Algo do tipo:
            :new.novacoluna = campo1 - campo2;

            []s Ishii

            #84215
            mpvargas
            Participante

              Obrigado Ishii.
              Valeu pela dica, mas você poderia me ajudar na sintaxe, pois tenho pouco conhecimento sobre triggers. Seria +ou- assim:

              CREATE TRIGGER trig1
              AFTER INSERT ON emp
              FOR EACH ROW
              BEGIN
              novacoluna = campo1 – campo2;
              END trig1;
              end;
              /

              Estou na dúvida de como colocar o campo calculado.
              E como faço para aplicar a trigger? É só criar no banco?

              #84216
              Marcio68Almeida
              Participante

                Uma questão filosófica…
                Por que você quer uma coluna calculada baseada em outras colunas da mesma tabela ??? Não é um desperdício de espaço ???

                Mas… Respondendo…
                Você deve colocar total = :new.coluna1 – :new.coluna2

                #84219
                juliano_sf
                Participante

                  Olha,

                  Não sei o real motivo dele, mas criar uma coluna pré-calculada reduziria o I/O necessário para buscar as 2 colunas e a CPU necessária para subtraí-las. Além disso, ele poderia criar um índice nessa coluna e pesquisar por ela…

                  Porem…

                  Podem haver problemas de integridade (ex: update em um dos valores envolvidos no cálculo) e aumentaria o custo em cpu de um insert por causa da trigger (o que geralmente não impacta muito, a não ser que seja realizada uma carga de inserts muito grande)

                  Att,

                  #84232
                  mpvargas
                  Participante

                    Eu sei que não é muito comum fazer isso, mas foi uma solicitação de um Analista. Temos um relatório padrão no ERP e o diretor pediu mais um campo, o Analista me perguntou se era possível fazer isso direto no banco, aí eu resolvi pesquisar… porque isso sendo possível poderíamos ter uma solução sem precisar mexer na aplicação, bastaria criar esse campo e ao ler a tabela o valor já estaria lá calculado automaticamente.

                    #84236
                    juliano_sf
                    Participante

                      Você pode também fazer uma view, mas aí você perde todos os beneficios de pré-calcular o resultado…

                      create view vw_xxx as
                      select campo1, campo2, (campo1 – campo2) as campo3
                      from xxx;

                      Juliano

                      #84252
                      mpvargas
                      Participante

                        Juliano, valeu pela dica.
                        Também é uma boa idéia.

                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.