- Este tópico contém 32 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por
mpvargas.
-
AutorPosts
-
8 de janeiro de 2010 às 8:01 pm #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?
8 de janeiro de 2010 às 8:15 pm #91975facc
ParticipanteNa 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.
8 de janeiro de 2010 às 8:32 pm #91976facc
ParticipanteSegue 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)
);9 de janeiro de 2010 às 4:37 pm #91979facc
ParticipanteConsegui 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?
11 de janeiro de 2010 às 5:07 pm #91987fsitja
ParticipanteSe 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.
11 de janeiro de 2010 às 5:08 pm #91988facc
ParticipanteVou aumentar a amstragem, até chegar numa numeração bem proxima do pedido.
Muito obrigado!
11 de janeiro de 2010 às 8:11 pm #91993facc
ParticipanteOlha 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
11 de janeiro de 2010 às 10:50 pm #92011fsitja
ParticipanteTá 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)).
11 de janeiro de 2010 às 11:04 pm #92015facc
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 ContratosE 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
11 de janeiro de 2010 às 11:27 pm #92023facc
ParticipanteAinda 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
11 de janeiro de 2010 às 11:33 pm #92025facc
ParticipanteSeria 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??
11 de janeiro de 2010 às 11:36 pm #92026fsitja
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.
11 de janeiro de 2010 às 11:41 pm #92027facc
Participanteé isso mesmo…
é aí que estou quebrando a cabeça…
11 de janeiro de 2010 às 11:46 pm #92028fsitja
ParticipanteOpa, 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?
12 de janeiro de 2010 às 12:17 am #92032fsitja
ParticipanteBom 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));
-
AutorPosts
- Você deve fazer login para responder a este tópico.