PROBLEMAS NO IN DO ORACLE MAIS DE 1K DE ITENS
Boa tarde pessoa, estou com um problema no oracle e espero que vocês me ajudem, estou fazendo um select simples [Ô]SELECT * FROM xx WHERE xxx = [ô]xxx[ô] AND codigo IN (xx,xxx,xxx,xxx,xx,x)[Ô]
Só que no meu IN existe mais de 1000 (para ser exato existe 7049 códigos) itens e isso retorna um erro no oracle, alguem sabe uma forma que eu possa pesquisar igual o IN sem perde perfomance?
Só que no meu IN existe mais de 1000 (para ser exato existe 7049 códigos) itens e isso retorna um erro no oracle, alguem sabe uma forma que eu possa pesquisar igual o IN sem perde perfomance?
Esses códigos que devem ser incluÃdos no IN, estão em uma tabela?
Citação::
Esses códigos que devem ser incluÃdos no IN, estão em uma tabela?
não, eles vem de um aplicação C# que é passada para uma package e dentro da existe uma function que recebe esses códigos como parâmetro..
Me parece que existe uma limitação de exatamente 1000 itens no IN
Apesar de não ser a melhor forma me parece que você pode contornar isso usando mais de um IN
[Ô]SELECT * FROM xx WHERE xxx = [ô]xxx[ô] AND (codigo IN (codigo1, codigo2,.... ,codigo1000) OR codigo IN (codigo1001, codigo1002....) )[Ô]
Levando em conta que todos os IN ficam dentro de parenteses e usando OR entre cada um deles
Apesar de não ser a melhor forma me parece que você pode contornar isso usando mais de um IN
[Ô]SELECT * FROM xx WHERE xxx = [ô]xxx[ô] AND (codigo IN (codigo1, codigo2,.... ,codigo1000) OR codigo IN (codigo1001, codigo1002....) )[Ô]
Levando em conta que todos os IN ficam dentro de parenteses e usando OR entre cada um deles
Então para seu caso, tem vários approaches:
1 - Você pode criar uma tabela temporária, preencher com os valores da cláusula IN e na cláusula IN da sua query, passar o select necessário: Select * from Tabela Where xxx = [ô]yyy[ô] and foo IN (Select campo from TabelaTemporaria)
Com isso você vai ter que manter a tabela, preenchendo e esvaziando ela toda a vez.
2 - Você pode criar uma Stored Procedure para isso, dentro dela, você vai criar uma tabela dinâmica(não fÃsica no banco) e a SP vai lidar com ela. Tem um exemplo disso aqui
3 - Você pode usar um for...each para esses valores e concatenando na query usando cada valor como um parâmetro
1 - Você pode criar uma tabela temporária, preencher com os valores da cláusula IN e na cláusula IN da sua query, passar o select necessário: Select * from Tabela Where xxx = [ô]yyy[ô] and foo IN (Select campo from TabelaTemporaria)
Com isso você vai ter que manter a tabela, preenchendo e esvaziando ela toda a vez.
2 - Você pode criar uma Stored Procedure para isso, dentro dela, você vai criar uma tabela dinâmica(não fÃsica no banco) e a SP vai lidar com ela. Tem um exemplo disso aqui
3 - Você pode usar um for...each para esses valores e concatenando na query usando cada valor como um parâmetro
Caro NALDOXD
Passar esse resultado do que vai para clausula IN para um cursor ou uma view....... que faz o armazenamento em loop..
Fica até mais dinâmico que a clausula IN() e ainda suporta um numero de itens ainda maior,,,,,,,,,,,,,
................View e cursor podem consumir memória...... deixando a aplicação lenta.....
Boa Sorte
Passar esse resultado do que vai para clausula IN para um cursor ou uma view....... que faz o armazenamento em loop..
Fica até mais dinâmico que a clausula IN() e ainda suporta um numero de itens ainda maior,,,,,,,,,,,,,
................View e cursor podem consumir memória...... deixando a aplicação lenta.....
Boa Sorte
Boa tarde amigos, eu solucionei o problema!
Solução:
Carreguei todas as informações em BindingSources do C# e realizei Filters, ficou com um ótimo desempenho.. Agradeço a todos, obrigado!
Solução:
Carreguei todas as informações em BindingSources do C# e realizei Filters, ficou com um ótimo desempenho.. Agradeço a todos, obrigado!
Faça seu login para responder