Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[PLPGSQL] Errori funzione database attivo

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[PLPGSQL] Errori funzione database attivo

Messaggioda BassMan92 » sab giu 01, 2013 3:20 pm

Salve,
lavoro su database relazionale, con Postgresql 9.1 come DBMS.

Spiego brevemente il problema. Ho una relazione molti a molti, e relativa funzione + trigger che prima di un inserimento mi fa un uppercast dei valori varchar. La relazione è cosi composta:

Codice: Seleziona tutto
create table espansioni(
  nome_espansione varchar primary key,
  data_uscita date not null
);

create table zone(
  nome_zona varchar primary key
);

create table zona_espansione(
  espansione varchar,
  zona varchar
);


I trigger+funzione attivi quando si inserisce un nuovo valore (uguale sia per uno che per l' altro, cambiano solo dei valori):

Codice: Seleziona tutto
CREATE FUNCTION normalizza_esp() RETURNS TRIGGER AS $BODY$
DECLARE
tmp_1 varchar;
BEGIN
tmp_1 := NEW.nome_espansione;
NEW.nome_espansione := upper(NEW.nome_espansione);
RAISE NOTICE 'Trigger action: uppercast on %', tmp_1;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER up_espansioni
BEFORE INSERT OR UPDATE ON espansioni
FOR EACH ROW EXECUTE PROCEDURE normalizza_esp();


Ora il "problema". Premetto che la funzione scritta funziona, ma probabilmente un INSERT dentro alla funzione da fastidio e mi genera un sacco di output di "errore".
Ho sfruttato il fatto che il trigger è attivato tutte le volte che inserisco valori in zona_espansione per far si che la cosa diventi "ricorsiva" (una volta arrivato all' INSERT nella funzione quindi lo mette in maiuscolo, e poi continua (riprendendo la funzione) finchè non arriva all' ultima espansione dove la variabile t_espansione varrà NULL).

La funzione dovrebbe far si che una zona presente in un' espansione sia presente anche nelle espansioni successive (senza che l' utente le inserisca manualmente).

Codice: Seleziona tutto
CREATE FUNCTION aggiorna_zone_esp() RETURNS TRIGGER AS $BODY$
DECLARE
t_zona varchar;
t_esp varchar;
t_data date;
t_espansione varchar;
i integer;
BEGIN
i = 0;
t_zona = NEW.zona;
t_esp = NEW.espansione;
SELECT data_uscita INTO t_data FROM espansioni WHERE nome_espansione = t_esp;
SELECT nome_espansione INTO t_espansione FROM espansioni WHERE data_uscita > t_data;
IF (t_espansione IS NOT NULL) THEN
   INSERT INTO zona_espansione VALUES (t_espansione, t_zona);
   RAISE NOTICE 'INSERT TOO: % in espansione %', t_zona, t_espansione;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;


CREATE TRIGGER add_zone_esp
AFTER INSERT OR UPDATE ON zona_espansione
FOR EACH ROW EXECUTE PROCEDURE aggiorna_zone_esp();


Controllando l' output e la tabella zona_espansione la cosa funziona, ma ottengo questo anche:

Codice: Seleziona tutto
CONTEXT:  SQL statement "INSERT INTO zona_espansione VALUES (t_espansione, t_zona)"
PL/pgSQL function "aggiorna_zone_esp" line 13 at SQL statement


L' errore è a livello della riga: INSERT INTO zona_espansione VALUES (t_espansione, t_zona);

Qualcuno può darmi consigli per eliminare l' errore? Ho già provato a scorporare l' INSERT in un altra funzione ma nada. Il problema è la finta ricorsione?
Avatar utente
BassMan92
Aficionado
Aficionado
 
Messaggi: 44
Iscritto il: mer nov 17, 2010 1:46 pm

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron
Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising