Pular para o conteúdo
Visualizando 15 posts - 16 até 30 (de 33 do total)
  • Autor
    Posts
  • #91974
    fsitja
    Participante

      É, com certeza é o insert, mas o problema maior está no select dentro dele.

      O que eu tinha sugerido seria colocar no final do loop o insert, em vez de colocar dentro do loop. Mas não vai ficar bom já que você está sendo obrigado a fazer o loop mesmo. Pega tudo do cursor CUR_ACSP e em vez de fazer um insert .. select nesse caso faz um INSERT INTO CYBELAR_AUX_SERASA VALUES (…) lá no loop e testa o desempenho, deve ficar mais aceitável.

      Agora uma coisa eu não entendi: você tem 3 tabelas CYBELAR_ACSP, CYBELAR_SERASA e a CYBELAR_AUX_SERASA.
      A tabela de origem é a CYBELAR_ACSP, correto?

      E as duas de destino são CYBELAR_SERASA e a CYBELAR_AUX_SERASA ou entendi errado? Onde você está inserindo na CYBELAR_SERASA?

      #91975
      facc
      Participante

        Na verdade eu tenho 2 tabelas, CYBELAR_ACSP E CYBELAR_SERASA, as tabelas recebem os mesmos dados, com diferença da segunda que recebe alguns campos a mais (Valores, Endereço, Cidade…) em ambas possui o campo Contrato.

        O que eu preciso é, de acordo com aquele SQL que me mostrou no inicio do tópico, gravar os dados e gerar um outro arquivo para a SERASA.

        #91976
        facc
        Participante

          Segue a estrutura de ambas as tabelas


          create table CYBELAR_ACSP
          (
          ACSPCCPF NUMBER(11),
          ACSPDTAB VARCHAR2(8),
          ACSPINDP CHAR(1),
          ACSPP06M NUMBER(1),
          ACSPP18M NUMBER(1),
          ACSPNRO NUMBER(2),
          ACSPMDIA NUMBER(4),
          ACSPDVM VARCHAR2(8),
          ACSPDPM VARCHAR2(8),
          ACSPNPM NUMBER(2),
          ACSPNROL NUMBER(3),
          ACSPNRC NUMBER(11)
          )

          create table CYBELAR_SERASA
          (
          SECGCCPF VARCHAR2(11),
          SEDTAPRO VARCHAR2(8),
          SEPERFOR VARCHAR2(12),
          SENRCON VARCHAR2(11),
          SEVLRCON VARCHAR2(11),
          SEVLRENT VARCHAR2(11),
          SEQTPARC VARCHAR2(2),
          SEDTNASC VARCHAR2(8),
          SESEXOCL VARCHAR2(1),
          SERENDA VARCHAR2(11),
          SEENDERE VARCHAR2(40),
          SECIDADE VARCHAR2(25),
          SEESTCIV CHAR(1),
          SEESCOLA CHAR(1),
          SENRDEPE CHAR(1),
          SENATOCU CHAR(1),
          SEPROFIS VARCHAR2(20),
          SEFONERE CHAR(3)
          );

          #91979
          facc
          Participante

            Consegui resolver o caso da lentidão e dos registros iguais nos arquivos.

            Agora preciso trazer a quantidade certa para enviar o arquivo. Estava pensando em criar uma tabela auxiliar antes de gerar o TXT e verificar a quantidade de registros, caso possua menos do solicitado, fazer um select inserindo nessa auxiliar os registros que faltam para preencher a quantidade.

            Alguem poderia me dar uma luz? Isso funcionaria? Sim, como poderia fazer esse select trazendo os dados que não estão nessa auxiliar?

            #91987
            fsitja
            Participante

              Se você buscar os registros que faltam para “arredondar” a quantidade você escolheria CPFs com qual DV? Isso vai quebrar a regra da proporção em % que foi feita para escolher os CPFs por percentual de DV na tabela completa.

              #91988
              facc
              Participante

                Vou aumentar a amstragem, até chegar numa numeração bem proxima do pedido.

                Muito obrigado!

                #91993
                facc
                Participante

                  Olha eu aqui novamente…

                  Cada dia que passa eles inventam moda…

                  Mas vamos ao que interessa, na verdade preciso trazer 5000 CPFs diferentes e não 5000 registros…

                  Como posso resolver esse impasse??

                  Ps.: não posso usar o distinct, pois preciso trazer os CPFs repetidos qndo houver

                  #92011
                  fsitja
                  Participante

                    Tá complicando… hehe
                    Quando fiz assumi que não teria CPFs repetidos na tabela, mas se há tem que alterar lá na veia, no coração do SQL.

                    Bom, vou disparar um monte de deduções aqui:
                    A tabela CYBELAR_ACSP tem dados de quê? Contratos? Tem CPFs repetidos lá dentro, é isso?
                    Eu vi que você postou o create table, mas eu não entendo o que são as colunas, pois os nomes são em hebraico (ou balêes, tô na dúvida)… 😆

                    E se eu pegar um CPF que tem mais de um registro no SQL, tem que trazer todos os demais registros para aquele CPF ou só um deles? Se for só um deles qual a regra para escolher qual?

                    Vou assumir que tem que pegar todos registros do cara se o CPF dele for o “sorteado”, daqui para baixo.
                    Acho que resolve ao mudar a função ROW_NUMBER() para a função RANK() e atribuindo o Random para CPF em vez de atribuir por linha.
                    Só que vai acontecer agora que sua amostra vai ficar com tamanho meio imprevisível, oscilando entre algo abaixo e acima de 5000, dependendo do gerador de números aleatórios. Testa o seguinte:

                    SELECT p.acspccpf,
                    p.acspdtab,
                    p.acspindp,
                    p.acspp06m,
                    p.acspp18m,
                    p.acspnro,
                    p.acspmdia,
                    p.acspdvm,
                    p.acspdpm,
                    p.acspnpm,
                    p.acspnrol,
                    p.acspnrc
                    FROM (SELECT acspccpf,
                    dv,
                    cont,
                    cont_distintos,
                    val_random,
                    rank() over(PARTITION BY dv ORDER BY val_random) num_linha,
                    acspdtab,
                    acspindp,
                    acspp06m,
                    acspp18m,
                    acspnro,
                    acspmdia,
                    acspdvm,
                    acspdpm,
                    acspnpm,
                    acspnrol,
                    acspnrc
                    FROM (SELECT substr(acspccpf, 7, 2) dv,
                    acspccpf,
                    COUNT() over(PARTITION BY substr(acspccpf, 7, 2)) cont,
                    COUNT(
                    ) over() cont_distintos,
                    AVG(dbms_random.value) over(PARTITION BY acspccpf) val_random,
                    acspdtab,
                    acspindp,
                    acspp06m,
                    acspp18m,
                    acspnro,
                    acspmdia,
                    acspdvm,
                    acspdpm,
                    acspnpm,
                    acspnrol,
                    acspnrc
                    FROM cybelar_acsp)
                    ORDER BY cont, rank() over(PARTITION BY dv ORDER BY val_random)) p
                    WHERE num_linha <= (cont * (5000 / cont_distintos));

                    O RANK() vai fazer com que todas as linhas que tenham o mesmo CPF fiquem “empatadas” no ordenamento e sejam todas mostradas. Para funcionar a mudança, foi feita a atribuição do valor aleatório como sendo uma média dos valores aleatórios de cada linha cujo CPF é repetido (AVG(dbms_random.value) over(PARTITION BY acspccpf)).

                    #92015
                    facc
                    Participante

                      [quote=”fsitja”:3l5eoumk]
                      Bom, vou disparar um monte de deduções aqui:
                      A tabela CYBELAR_ACSP tem dados de quê? Contratos? Tem CPFs repetidos lá dentro, é isso?[/quote]
                      Isso mesmo, ela possui CPF e Contratos

                      E se eu pegar um CPF que tem mais de um registro no SQL, tem que trazer todos os demais registros para aquele CPF ou só um deles? Se for só um deles qual a regra para escolher qual?

                      Tenho que trazer todos os CPFs, porém na conta final considero apenas um

                      #92023
                      facc
                      Participante

                        Ainda continuo quebrando a cabeça…

                        ele está me retornando cerca de 5000 registros, preciso trazer 5000 cpfs diferentes mais os que se repetem, no final irei trazer mais que 5000 registros.

                        Mais ou menos assim

                        o CPF 12345678900 se repete 2 vezes, na conta final (Somatoria) considero apenas 1, porém no arquivo devo trazer os 2

                        #92025
                        facc
                        Participante

                          Seria mais ou menos como esse sql

                          select * from tabela
                          where campo in (select distinct(campo) from tabela
                          where rownum <= 5000)

                          Mas como colocar isso naquele criterio??

                          #92026
                          fsitja
                          Participante

                            [quote=”facc”:hwyf889a]Ainda continuo quebrando a cabeça…

                            ele está me retornando cerca de 5000 registros, preciso trazer 5000 cpfs diferentes mais os que se repetem, no final irei trazer mais que 5000 registros.

                            Mais ou menos assim

                            o CPF 12345678900 se repete 2 vezes, na conta final (Somatoria) considero apenas 1, porém no arquivo devo trazer os 2[/quote]

                            Então, é isso mesmo que postei acima. Não estranhe que o tamanho em linhas do resultado vai oscilar para cada execução pois vai depender de quantas repetições cada CPF tem e se ele foi escolhido ou não no sorteio. É por definição assim, pois vai depender se o CPF tem linhas repetidas ou não e se ele foi escolhido na sorte.

                            [quote=”facc”:hwyf889a]Seria mais ou menos como esse sql

                            select * from tabela
                            where campo in (select distinct(campo) from tabela
                            where rownum <= 5000)

                            Mas como colocar isso naquele criterio??[/quote]

                            Como tá agora ele tá pegando 5.000 CPFs. Não é mais 5.000 linhas como antes. Então se cada CPF tiver duas linhas, vai voltar 10.000 linhas no output do SQL. Por isso o rownum não funciona, pois o critério não é mais linhas.

                            #92027
                            facc
                            Participante

                              é isso mesmo…

                              é aí que estou quebrando a cabeça…

                              #92028
                              fsitja
                              Participante

                                Opa, achei o problema. Vou tentar corrigir.

                                edit:
                                Fui dar uma olhada agora, fiquei com uma dúvida.

                                A proporção antes era para trazer no mesmo percentual de linhas que o DV tivesse. Agora mudou para o percentual de CPFs que um DV possui?

                                #92032
                                fsitja
                                Participante

                                  Bom estava cheio de coisas que mudaram que faltou ajustar.

                                  Só não tive como testar esse SQL porque não tenho uma base de testes razoável.


                                  SELECT p.acspccpf,
                                  p.acspdtab,
                                  p.acspindp,
                                  p.acspp06m,
                                  p.acspp18m,
                                  p.acspnro,
                                  p.acspmdia,
                                  p.acspdvm,
                                  p.acspdpm,
                                  p.acspnpm,
                                  p.acspnrol,
                                  p.acspnrc
                                  FROM (SELECT acspccpf,
                                  dv,
                                  cont,
                                  cont_distintos,
                                  val_random,
                                  dense_rank() over(PARTITION BY dv ORDER BY val_random) num_linha,
                                  acspdtab,
                                  acspindp,
                                  acspp06m,
                                  acspp18m,
                                  acspnro,
                                  acspmdia,
                                  acspdvm,
                                  acspdpm,
                                  acspnpm,
                                  acspnrol,
                                  acspnrc
                                  FROM (SELECT substr(to_char(acspccpf, '00000000000'), 11, 2) dv,
                                  to_char(acspccpf, '00000000000') cpf,
                                  COUNT(DISTINCT acspccpf) over(PARTITION BY substr(to_char(acspccpf, '00000000000'), 11, 2)) cont,
                                  COUNT(DISTINCT acspccpf) over() cont_distintos,
                                  AVG(dbms_random.value) over(PARTITION BY acspccpf) val_random,
                                  acspdtab,
                                  acspindp,
                                  acspp06m,
                                  acspp18m,
                                  acspnro,
                                  acspmdia,
                                  acspdvm,
                                  acspdpm,
                                  acspnpm,
                                  acspnrol,
                                  acspnrc
                                  FROM cybelar_acsp)
                                  ORDER BY cont, dense_rank() over(PARTITION BY dv ORDER BY val_random)) p
                                  WHERE num_linha <= (cont * (5000 / cont_distintos));

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