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?