PDA

View Full Version : [Oracle] cursor


texerasmo
03-01-2008, 10:55
Ciao a tutti un domanda semplice.

In oracle definisco il numero max di cursori aperti.

Che nel mio appplicativo corrispondono a oggetto resulset.

Ora ho risolto aumentando il numero dei cursori su oracle.

Volevo capire meglio

Se io ho un tabella di 100 righe e ho definito un cursore di 90 su oracle.

se il mio result va a riempirsi con un select * from table

è in questo caso che va in errore?

tnks

shinya
03-01-2008, 12:29
No il numero di cursori aperti non c'entra niente con la cardinalità dei risultati di una query...


open p_refcur for
select * from table;


Il cursore è 1. Quel parametro è esattamente il numero massimo di cursori aperti (che di default mi pare sia 300) dalle varie transazioni.

Scusa, ma qual'era l'errore? E a quanto avevi settato il numero di cursori aperti? (Che è un parametro che raramente va modificato tra l'altro, se non in situazioni molto particolari...boh, io ho sempre usato il valore di default).

texerasmo
03-01-2008, 12:37
Quindi
Essendo l'applicativo fatto in java soto stati lasciati diversi resulset aperti

Mi sempre che il valore settato è 500


ERRORE è questo
ORA-01000: maximum open cursors exceeded

shinya
03-01-2008, 14:58
Quindi
Essendo l'applicativo fatto in java soto stati lasciati diversi resulset aperti

Mi sempre che il valore settato è 500


ERRORE è questo
ORA-01000: maximum open cursors exceeded

Evidentemente non viene chiusa la connessione e/o il callableStatement...posta un esempio di chiamata. Usi un datasource, vai via jdbc, usi una libreria per il pooling, altro...?

Oppure hai dei cursori che utilizzi e poi non chiudi all'interno delle procedure.

texerasmo
03-01-2008, 15:29
purtroppo non posso vedere la web-appp

shinya
03-01-2008, 16:59
purtroppo non posso vedere la web-appp

Eh allora non fai tanta strada...cmq l'errore è li (direi, al 95% secondo la mia esperienza).
Altra fonte di errore può essere un utilizzo dei cursori in pl/sql tipo:


-- pseudo pl/sql
cursor my_cur is select * from table;

open my_cur;

loop
fetch my_cur into my_record;
exit when my_cur%not_found;

-- faccio alcune cose con il record fetchato
end loop;

-- qui ci va un "close my_cur;" direi...che forse non c'è!


Questa può essere un'altra sorgente di problemi...

texerasmo
04-01-2008, 07:55
Grazie,un cosa
fetch cos'è?

shinya
04-01-2008, 08:09
Grazie,un cosa
fetch cos'è?

'fetch' estrae un record dal cursore e lo mette in un tipo record.

Un link veloce, il primo che ho trovato...
http://www.unix.org.ua/orelly/oracle/prog2/ch06_06.htm

texerasmo
04-01-2008, 08:11
gentilissimo