Fórum Simulando retorno de um cursor em SP. Tem como? #44529

28/05/2004

0

Olá pessoal,

Pois é, eu sei que o FB não tem cursor. Por isso mesmo, vim aqui pedir ajuda... ver se alguém me dá uma idéia pra resolver um problema aqui.

Aqui na empresa temos um sistema pronto que usa o SGBD Oracle, e estamos migrando o mesmo pra FB, versão 1.5. Os bancos de dados que usam o sistema são até grandes... no FB ainda não temos o suficiente pra dizer, mas no Oracle temos bancos de cerca de 400 MB. Já é o suficiente pra deixar uma consulta um pouco lenta.

Em alguns relatórios mto complicados, foram usadas views pra facilitar. O problema é que, usando view... primeiro o sistema monta a view com todos os dados, e depois ele passa os parâmetros (que eu passei no delphi) pra pegar o resultado. E isso as vezes era MUITO demorado.

Dae, pra resolver o problema de lerdeza... criei uma Stored Procedure, e nos parâmetros de entrada eu passava os parâmetros da consulta mesmo (os que no caso anterior tinham sido passados pelo delphi)... e como parâmetro de saída, a SP retornava um cursor. Aí, era como se ele ´montasse uma view´ só com os dados que eu queria e me devolvesse. Ficou 10x mais rapido que o outro jeito.

No FB, fazendo com view, tá lento. O banco que temos ainda é de teste e pequeno... qdo o sistema estiver implantado, vai ficar difícil, acredito que mto lento. Então eu queria de vocês uma idéia... não tem como eu retornar por parâmetro um cursor, ou view, ou tabela... ao menos creio que não. Tem como fazer algo parecido? Se não, o que posso fazer para melhorar o desempenho, nesse sentido? Se eu não achar um jeito, alguns relatórios ficarão inviáveis :(

Se você teve paciência de ler até aqui, obrigada! ehhehehhe

Thanks in advance!


Moonlight

Moonlight

Responder

Posts

28/05/2004

Afarias

Oi minha Luz!! ;)


No IB (ou FB) vc tem o q é chamado ´procedimentos selecionáveis´ -- que podem ser usados como uma TABELA ou VIEW qualquer.

...e vc ´simula cursores´ uando um FOR SELECT, ex::

create procedure alguma_selecao (data_inicial date, data_final date)
returns (data date, usuario varchar(20), tarefa varchar(30)) as
begin

  FOR SELECT data, usuario, tarefa from algma_tabela
         where data between :data_inicial and :data_final
         into :data, :usuario, :tarefa
  DO begin

    SUSPEND;

  end

end^



e vc pode usá-lo da forma::

select * from alguma_selecao (´01.01.04´, ´31.01.04´);


NOTAS:: o comando SUSPEND é que indica o retorno de registros, e, dentro do begin end do FOR...DO, vc pode fazer qualquer processo q desejar!



bração!
T+


Responder

Gostei + 0

31/05/2004

Moonlight

simples :oops: poutz, eu costumava ser mais inteligente
danke schon! :P


Responder

Gostei + 0

31/05/2004

Afarias

|simples poutz,

As coisas simples nem sempre estão claras... :)



Sie sind willkommen! :wink:

T+


Responder

Gostei + 0

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

Aceitar