ciao a tutti, sto facendo, con sql developer, delle funzioni la cui traccia è la seguente:

creazione di funzioni che restituiscono statistiche sulla operosità dei parlamentari per legislatura.

tra le statistiche ho scelto la percentuale di voti per l'approvazione delle leggi di un parlamentare in una legislatura (le altre statistiche si fanno in modo analogo). ai fini del calcolo di questa statistica mi occorono le seguenti tabelle del db che ho creato:

LEGGI
(
TITOLO VARCHAR2(100), CHIAVE PRIMARIA
TESTO CLOB,
RELATORE VARCHAR2(30),
LEGIS_NUM VARCHAR2(5), CHIAVE ESTERNA FA RIFERIMMENTO ALLA LEGISLATURA
ABROGATA BOOL,
...
)

E APPROVAZIONI
(
LEGGE_TITOLO VARCHAR2(100) CHIAVE ESTERNA FA RIFERIMENTO ALLA LEGGE
PARL_ID VARCHAR2(6) CHIAVE ESTERNA FA RIFERIMENTO AL PARLAMENTARE
...
)

ADESSO LA FUNZIONE CHE HO CREATO IO è LA SEGUENTE:

codice:
create or replace FUNCTION REPOSITORYADM.PERC_APPROVAZIONI 
(
  LEGIS IN VARCHAR2  
) RETURN REPOSITORYADM.STATISTICHE_APPROVAZIONI AS

TABELLA REPOSITORYADM.STATISTICHE_APPROVAZIONI;

CURSOR C1 IS
  SELECT PARL_ID, COUNT(*) AS NUM_VOTI
  FROM REPOSITORYADM.LEGGI, REPOSITORYADM.APPROVAZIONI
  WHERE REPOSITORYADM.LEGGI.TITOLO = REPOSITORYADM.APPROVAZIONI.LEGGE_TITOLO
  GROUP BY PARL_ID;
  
RIGA_CURSOR C1%ROWTYPE;

TOT_APPROVAZIONI NUMBER := 0;

PERCENTUALE NUMBER(5, 2) := 0;
BEGIN
  SELECT COUNT(*) INTO TOT_APPROVAZIONI
  FROM REPOSITORYADM.LEGGI, REPOSITORYADM.APPROVAZIONI
  WHERE LEG_NUMERO = LEGIS AND TITOLO = LEGGE_TITOLO;
  
  OPEN C1;
  LOOP
    FETCH C1 INTO RIGA_CURSOR;
    EXIT WHEN C1%NOTFOUND;
    PERCENTUALE := RIGA_CURSOR.NUM_VOTI * 100 / TOT_APPROVAZIONI;
    TABELLA := REPOSITORYADM.STATISTICHE_APPROVAZIONI(REPOSITORYADM.STATISTICA_APPROVAZIONI(RIGA_CURSOR.PARL_ID, RIGA_CURSOR.NUM_VOTI, PERCENTUALE));
  END LOOP;
  CLOSE C1;
  
  RETURN TABELLA;
END PERC_APPROVAZIONI;
IN PRATICA LA FUNZIONE PRENDE IN INPUT UNA LEGISLATURA E DEVE RITORNARE LA SEGUENTE TABELLA:

TABELLA
(
PARL_ID
NUM_VOTAZIONI
PERCENTUALE
)

OSSIA LA TABELLA CON LE PERCENTUALI DELLE VOTAZIONI DI TUTTI I PARLAMENTARI NELLA DATA LEGISLATURA.

IL PROBLEMA CHE HO RISCONTRATO è CHE NEL CICLO, QUANDO VIENE INSERITO UN RECORD IN UNA TABELLA, QUEST'ULTIMO NON VIENE ACCODATO A QUELLI INSERITI IN PRECEDENZA MA BENSì VIENE SOVRASCRITTO IL PRIMO ED UNICO RECOD CHE INSERISCO. IN PARTICA NELLO STATO IN CUI SI TROVA ATTUALMENTE IL MIO DB, NELLA TABELLA DOVREBBERO COMPARIRE 3 RECORD, INVECE COMPARE SOLO L'ULTIMO INSERITO. COME POSSO FARE A POPOLARE UN OGGETTO DI TIPO TABELLA IN MODO DA OTTENERE IL RISULTATO RICHIESTO???