PROBLEMAS NO IN DO ORACLE MAIS DE 1K DE ITENS

NALDOXD 05/02/2014 16:00:09
#434305
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?
KERPLUNK 05/02/2014 16:06:47
#434307
Esses códigos que devem ser incluídos no IN, estão em uma tabela?
NALDOXD 05/02/2014 16:29:47
#434309
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..
OCELOT 05/02/2014 17:17:26
#434312
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
KERPLUNK 05/02/2014 17:21:39
#434313
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
AJSO 05/02/2014 20:09:06
#434323
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
NALDOXD 06/02/2014 10:49:31
#434351
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!
Faça seu login para responder