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