Fórum Simulando retorno de um cursor em SP. Tem como? #44529
28/05/2004
0
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
Curtir tópico
+ 0Posts
28/05/2004
Afarias
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+
Gostei + 0
31/05/2004
Moonlight
danke schon! :P
Gostei + 0
31/05/2004
Afarias
As coisas simples nem sempre estão claras... :)
Sie sind willkommen! :wink:
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)