PDA

Visualizza la versione completa : [PL/SQL] funzione che restituisce un oggetto di tipo tabella


pietrol83
17-06-2013, 18:50
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:



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(REPOSITORYA DM.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???

Loading