Delphi 5 + BDE/Oracle: ResultSet retorna no máximo 32 colunas (problema para os mais antigos)

04/05/2023

0

Caros,

Este problema só os mais antigos "talvez" respondam.

Tenho uma aplicação que foi desenvolvida em 2000, aproximadamente, utilizando Delphi 5. Ela utiliza banco de dados Oracle através do BDE e funciona muito bem, até hoje. Porém, tem algo que sempre me incomodou.

Se eu executo uma query que retorne mais de 32 colunas, ocorre um erro e nenhuma linha é retornada.

Além desse problema, também reparei que, sempre que uma coluna do tipo varchar2 é retornada com mais de 128 caracteres, o BDE a interpreta como sendo do tipo LOB (memo no Delphi) e, por conta disso, retorna apenas 1 linha por fetch, o que torna o acesso aos dados muito mais lento.

Alguém já passou por isso?

Já tentei olhar o código fonte, debugar entrando até nas rotinas em Assembly, mas não é nada simples. Parece ser uma limitação do BDE e, como ele foi descontinuado, não existem atualizações que corrijam estas deficiências. Se é que são deficiências. Pode ser que eu esteja utilizando incorretamente, ou tenha setado algum parâmetro que compromete o funcionamento.
Arthur Heinrich

Arthur Heinrich

Responder

Posts

04/05/2023

Arthur Heinrich

Fiz um teste simples, utilizando os componentes direto no form, utilizando um alias criado manualmente no BDEAdmin e a query retorna mais de 32 colunas.
Porém, quando crio os componentes dinamicamente, sem utilizar um alias previamente, o BDE retorna falta de memória.
Responder

05/05/2023

Arthur Heinrich

Acho que o meu problema deve estar relacionado a como o BDE controla internamente os caches de blobs, ou mesmo armazena temporariamente as linhas, quando fazemos um fetch de múltiplas linhas.

Eu estava utilizando uma configuração onde:

BLOB SIZE=10240
ROWSET SIZE=1000
BLOBS TO CACHE=16

É possível que haja alguma limitação no tamanho do buffer interno, do tipo, armazenar no máximo 32 K colunas no buffer. Como eu estava forçando a alocação para um fetch de 1000 linhas, isto poderia estar limitando o resultado a no máximo 32 colunas. Mas é claro que isto é só uma suposição.

Reduzi o tamanho do fetch e agora é possível retornar mais de 32 colunas. Também reduzi o número de blobs a serem cacheados.

BLOB SIZE=10240
ROWSET SIZE=200
BLOBS TO CACHE=1

Escolher adequadamente o fetch size é extremamente importante para minimizar o número de vezes que a aplicação precisa acessar o banco e o melhor valor, depende do conteúdo que será retornado pela query. Fazer este ajuste durante a conexão não permite flexibilizar o fetch entre queries distintas.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar