Dúvida com Delphi + Unidac (ORA-01000: máximo de cursores abertos excedido)

06/05/2019

7

Bom dia,

Estou tendo um problema com ORA-01000 utilizando os componentes do UniDac.

Tenho uma ferramenta que aplica atualizações de estrutura no banco de dados Oracle, ou seja, a ferramenta pode executar comandos de INSERT/UPDATE/DELETE e CREATE/ALTER/DROP em uma única atualização.

Em alguns casos está ocorrendo o erro "ORA-01000: máximo de cursores abertos excedido" durante a atualização, geralmente para resolver é alterado a configuração do banco aumentando a quantidade de cursores.

Existe alguma maneira de gerenciar isso via código, abrindo e encerrando os cursores para não chegar no limite?

Eu utilizo o TUniQuery da seguinte maneira:

var
  vQuery: TUniQuery;
begin
  vQuery: TUniQuery.Create(Self);
  try
    vQuery.Connection := MinhaConexao;
    vQuery.SQL.Text := 'Meu comando SQL';
    vQuery.Open; //ou .Execute;
  finally
    vQuery.Close;
    FreeAndNil(vQuery);
  end;
end;
Responder

Posts

Bom dia,

Estou tendo um problema com ORA-01000 utilizando os componentes do UniDac.

Tenho uma ferramenta que aplica atualizações de estrutura no banco de dados Oracle, ou seja, a ferramenta pode executar comandos de INSERT/UPDATE/DELETE e CREATE/ALTER/DROP em uma única atualização.

Em alguns casos está ocorrendo o erro "ORA-01000: máximo de cursores abertos excedido" durante a atualização, geralmente para resolver é alterado a configuração do banco aumentando a quantidade de cursores.

Existe alguma maneira de gerenciar isso via código, abrindo e encerrando os cursores para não chegar no limite?

Eu utilizo o TUniQuery da seguinte maneira:

var
  vQuery: TUniQuery;
begin
  vQuery: TUniQuery.Create(Self);
  try
    vQuery.Connection := MinhaConexao;
    vQuery.SQL.Text := 'Meu comando SQL';
    vQuery.Open; //ou .Execute;
  finally
    vQuery.Close;
    FreeAndNil(vQuery);
  end;
end;



Bom pela lógica você está criando uma Query ali em cima mas não está destuindo ela no final você está somente liberando da memória, ai você cria outra, outra, outra e etc...

Outra coisa... quando for passar a instrução sql fecha a query e limpa a propriedade sql antes.

vQuery.Close;
vQuery.SQL.Clear;

Assim é mais garantido que você vai fazer o procedimento com ela fechada de certeza, dentro do finally pode ocorrer algum desvio no código e não passar por lá, eu gosto de usar muito é o except para verificar erros e evitar mensagens em inglês ao usuário se ocorrer esses erros.

Espero ter ajudado.
Responder