PDA

Visualizza la versione completa : [PostgreSQL] creare una funzione che ritorni il risultato di una select


uzmki
29-09-2009, 10:09
Ciao ragazzi, ringrazzio tutti coloro che mi hanno sempre e prontamente risposte in tutti gli altri post che ho creato. Oggi vi chiedo se è possibile e come, creare una function in PostgreSQL che restituisca il risultato di una select.

Spiego cosa devo fare: Nella function devono essere eseguite tre attività, due inserimenti che sono coordinati (cioè il primo inserimento implica la realizzazione di un secondo inserimento) e successivamente voglio aggiungere una select che mi visualizza il risultato dei due insert appena fatti.

Ora poichè i due insert sono coordinati, dovre utilizzare all'interno della funzione anche le transazioni, così se il secondo insert non va a buon fine anche il primo non viene memorizzato.

Inoltre, con il secondo insert devo memorizzare delle informazioni su colui che stà eseguendo l'operazione, quindi vorrei sapere come faccio (se esiste quanlche comando) ad ottenere il nome del soggetto che stà eseguendo l'operazione in quel momento.

Vi ringrazio.

MacApp
29-09-2009, 10:24
Non è così immediato ma si può fare:
http://www.postgresql.org/docs/8.4/interactive/plpgsql-control-structures.html#AEN47528
;-)

uzmki
29-09-2009, 11:52
Sono riuscito a fare questo:

CREATE OR REPLACE FUNCTION addgruppo(newgruppo character varying, areatematica character varying, utente demail)
RETURNS SETOF gruppo AS $$
DECLARE rw gruppo%rowtype;
DECLARE new_index INTEGER := 0;
BEGIN
INSERT INTO gruppo(nomegruppo, tematica) VALUES (newGruppo, areatematica);
new_index := currval('gruppo_idgruppo_seq'::regclass);
INSERT INTO fondazione(idgruppo, fondatore) VALUES (new_index, utente);
FOR rw IN SELECT * FROM gruppo WHERE nomegruppo = newgruppo
LOOP
RETURN NEXT rw;
END LOOP;
RETURN;
END; $$
LANGUAGE 'plpgsql';

Questa già funziona ma devo ancora rendere il tutto atomico (agg. le transaction) ed inoltre non sono soddisfatto del LOOP che vorrei togliere (ma non ci riesco senza necessariamente compromettere la funzione) perchè vorrei visualizzare la sola riga inserita senza dover ricorrere al loop (esso sarebbe utile se dovessi visualizzare tutti i record in tabella). Inoltre vorrei visualizzare la riga del JOIN tra la tabella gruppo e fondazione.

Qualche suggerimento???? Vi ringazio.

Loading