Limite do tamanho do CURSOR

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 321
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Estava conversando com um colega meu de trabalho, quando ele estava contando um caso onde tinha um cursor que retornava uma excessiva quantidade de linhas e que ao termino da execução não dava erro, mas não retornava todas as linhas esperadas e isso levantou a seguinte dúvida: "O CURSOR tem um limite de retorno de linhas?".

Cheguei a levantar a hipótese que a capacidade do cursor é a mesma capacidade da quantidade de memória disponível, mas também não tenho certeza. Por isso, eis ai a dúvida. Será que alguém consegue esclarecer?

Abçs.,
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Tinho,

Já ia responder direto que não havia limite, mas resolvi pesquisar um pouquinho sobre o assunto. Nunca passei pelo problema descrito por você.

Aparentemente, não parece haver nenhum limite para a execução de cursores. Mas é provável considerar que possam existir limites como, por exemplo, o tamanho da SGA.

Mas consultei em foruns e manuais, e aparentemente este limite não deve ser tão fácil assim de ser alcançado, senão a ORACLE já teria incluido em sua documentação.

Mas você precisa levar em conta que um cursor com muitos registros e colunas (ex: 60 milhões) pode demorar um tempo considerável para ser processado, além de aumentarem os riscos de um erro do tipo "SNAPHOT TOO OLD".

O correto é você avaliar se precisa processar tantos registros assim (ex: adicionar filtros à sua querie de cursor para descartar os registros desnecessários) ou optar por recursos de PL/SQL que processem o cursor de forma muito mais rápida (Ex: COLLECTIONS).

Pode ser que outros foristas tenham uma opinião diferente da minha.

Abraços,

Sergio Coutinho
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Eu penso que se há de fato tantas linhas no cursor, provavelmente o melhor seria evitar o uso de cursor se possível, principalmente se houver UPDATES/INSERTS/DELETES e outros cursores dentro do Loop desse cursor.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 321
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Camaradas, obrigado pela opinião. Infelizmente não tenho muito detalhes do caso, mas parece que o meu colega estava atualizando uma base de CPFs com muitos registros a partir de arquivos. Eu procurei por documentos oficiais que descrevessem algo a respeito mas não encontrei nada. Na ocasião, cheguei a sugerir que ele quebrasse isso em bloco, por exemplo, a cada quantidade de linhas processadas ele daria um commit, além de chegar a sugerir o uso de processamento paralelo, mas não sei se resolveria no caso dele.

De qualquer maneira mais uma vez agradeço a atenção de todos.

Abçs.,
Responder
  • Informação