PDA

Visualizza la versione completa : Oracle-plsql Cilci Innestati Con Due Cursori


elpocho7
07-03-2009, 16:01
ciao ragazzi ho un problema... stò creando un trigger che deve usufruire di due cursori e quindi su questi due cursori fare due controlli diversi mmmm che dovrei usare? un loop innestato o un singolo loop che gestisca i due cursori con i rispettivi controlli??? :cry: :confused: AIUTO :oVVoVe: :oVVoVe:

YuYevon
07-03-2009, 17:15
Dipende se ti serve che i for siano innestati o no: se in C devo leggere i valori di una matrice sono "costretto" a ricorrere a due for annidati, ma se devo leggere due vettori distinti e separati mi servirò di altrettanti cicli distinti e separati...

cosa devi fare precisamente in questo trigger?

Non ti assicuro di essere in grado di aiutarti perché non ho molta esperienza col PL/SQL, ma qualcosa la so, d'altra parte non mi sembra che sul forum ci siano molti altri che conoscano il linguaggio, essendo un'estensione proprietaria di Oracle che non so perché in alcune università si dilettano tanto di insegnare...

Sei di informatica della Parthenope di Napoli per caso? Non saresti il primo...

elpocho7
07-03-2009, 18:31
ciao si in effetti sn della parthenope :mame: infatti ricordo il tuo nick dal forum dell'uni...
cmq.... in pratica dovrei fare un trigger che mi gestisca l'inserimento degli eventi nella mia videoteca e cioè mi controlla se la data dell'evento è valida cioè se non è minore di sysdate poi se la data non è già occupata e poi controlla se ci sono già 2 eventi nella videoteca in questione(la mia è una catena di videoteca) e nel caso inserisce l'evento in una videoteca che ha meno impegni mensili.... :oVVoVe:
in pratica volevo usare due cursori in uno stesso loop ma mi sono accorto che non ne avevo il bisogno xkè un cursore lo uso per cercare nella videoteca una stessa data di quella che voglio inserire ma in ogni caso ho un errore di esecuzione :oVVoVe: :dhò:
ti posto il codice anche se sò che sarà un casino per te capire il tutto..

[code]
create or replace trigger g
before insert on EVENTI
for each row
declare
data_occupata EVENTI.DATA_EVENTO%TYPE;
videoteca_impegnata_mese EVENTI.PI%TYPE;
videoteca_libera_mese EVENTI.PI%TYPE;

cursor troppi_eventi_mese is select PI from eventi where to_char(DATA_EVENTO,'MON')=to_char(sysdate,'MON') group by PI having count(PI)>2;
cursor data_gia_impegnata is select DATA_EVENTO from EVENTI where DATA_EVENTO=:new.DATA_EVENTO and PI=:new.PI;
data_non_valida exception;
data_non_disponibile exception;
begin

select distinct PI into videoteca_libera_mese from EVENTI where to_char(DATA_EVENTO,'mon')=to_char(:new.DATA_EVENT O,'mon') group by PI having count(PI)<=ALL(select count(PI) from EVENTI where to_char(DATA_EVENTO,'mon')=to_char(:new.DATA_EVENT O,'mon') group by PI);
if(:new.DATA_EVENTO<=sysdate) then
raise data_non_valida;
end if;
open data_gia_impegnata;
fetch data_gia_impegnata into data_occupata;
if (data_gia_impegnata%ROWCOUNT>0)then
raise data_non_valida;
end if;
close data_gia_impegnata;
open troppi_eventi_mese;

fetch troppi_eventi_mese into videoteca_impegnata_mese;
loop
if(:new.PI=videoteca_impegnata_mese) then
insert into EVENTI(PI) values(videoteca_libera_mese);

end if;
fetch troppi_eventi_mese into videoteca_impegnata_mese;
exit when troppi_eventi_mese%NOTFOUND;
end loop;
close troppi_eventi_mese;
exception
when data_non_valida then
raise_application_error('-20008','DATA NON VALIDA!');
when data_non_disponibile then
raise_application_error('-20006','DATA_OCCUPATA!');
end;
/
[\code]

elpocho7
07-03-2009, 20:17
vabbè cmq risolto todo :fighet:

Loading