sábado, 13 de maio de 2017

Commit encerra uso do Cursor

Olá!

Ao ser necessário realizar a persistência de vários registros no banco de dados (DB) é uma boa prática realizar Commit (salvar alterações que são feitas no DB) após uma quantidade registros processados.

Pois, com essa prática caso ocorra algum erro durante a execução do programa é possível realizar o restart da aplicação a partir do último registro processado, assim ganhando processamento pelo fato de não ter que processar todos os registros novamente.

Exemplo com o processamento de um arquivo:
Ler o arquivo com as informações dos clientes e atualizar o DB com esses dados. Considerando que o arquivo tenha 1 milhão de registros, o Commit deve ser feito a cada 1.000 registros atualizados.

Para esse exemplo o fluxo de processamento é bem simples, sendo criado uma estrutura de repetição para ler o arquivo de entrada e atualizar o DB, e a cada 1.000 registros atualizados executar o Commit para salvar os dados dos cliente já atualizados.

Nada de mais, né? Então, vamos para outro exemplo.

Exemplo de processamento para vários registros de uma tabela - cursor:
Realizar a leitura de todos os saldos da tabela de cliente (cliente.saldos), e adicionar R$ 100 de limite de crédito (cliente.limite_credito) onde o saldo do cliente for maior que R$ 500. De modo que a cada 1.000 clientes atualizados realizar Commit no DB.

Nesse exemplo o fluxo de processamento é semelhante ao do primeiro exemplo, pois também é necessário uma estrutura de repetição para ler o saldo de cada cliente armazenado na tabela, e se esse saldo for superior a R$ 500 adicionar R$ 100 ao limite de crédito do cliente, e a cada 1.000 clientes atualizados realizar Commit para salvar os clientes já atualizados.

Entretanto, se criado o seguinte fluxo:
...
     Abrir cursor
     Ler cursor
     Loop até fim de cursor
         Se saldo cliente > 500 adicionar 100 ao limite de crédito
         Se quantidade de clientes atualizados > que 1.000 fazer Commit
         Ler cursor para ver saldo do próximo cliente
...

Será reportado erro ao tentar ler o saldo do próximo cliente após ter executado a instrução Commit dos clientes já atualizados.

Pois, ao executar o comando Commit o cursor é automaticamente fechado. Assim, quando o programa tentar ler o saldo do próximo cliente será retornado erro pela tentativa de ler o cursor fechado.

Umas das possíveis soluções é: abrir o cursor, realizar a leitura de todos os clientes e armazenar em memória (tabela interna Cobol) aqueles que satisfação a condição definida, fechar o cursor. Agora, com os clientes que estão em memória fazer a persistência dos novos dados na tabela e a cada 1.000 atualizações fazer Commit.

Note que essa é somente uma das várias soluções, pois dependendo da quantidade de registros não será possível armazenar eles em memoria, de modo a ter que usar outra forma de processamento para realizar a aplicação.

Enfim, tenha em mente que após a execução da instrução Commit o cursor que esteja aberto é automaticamente encerrado, desse modo impossibilitando a leitura do próximo registro.


Consultar a relação de Termos e Abreviaturas acesse aqui.

FELIPE BARBOSA FERREIRA
Até o próximo post!