progetto, postgresql, trigger.. HELP! Clicca QUI per vedere il messaggio nel forum |
cash |
Ciao ragazzi, siamo uno dei gruppi del progetto non frequentanti (palestra).
Come cavolo si fanno i trigger?
sembra che i trigger normali non funzionino con postgres e che bisogna richiamare per forza una procedura. e fin qui, passi.
però sembra che le funzioni che ritornano al trigger non possano ricevere dati in entrata, oppure sì, ma solo text :?: Perchè ho cercato online e ho trovato che si può far riferimento ai dati in entrata usando tg_argv[x] dove x è il numero dell'elenco delle variabili in entrata. ma accetta solo text cazzo!!!
vi prego... se c'è qualcuno, che batta un colpo..
(il mio problema è fare un trigger che, inserendo un nuovo abbonato, se lavoratore, trovi in un altra relazione il valore dello sconto relativo al suo ente e calcoli il prezzo effettivamente pagato...)
(o se qualcuno ci fornisse un trigger esempio da cui costruire gli altri... sarebbe perfetto) |
ildiff |
Se il tuo problema è ottenere un valore numeric per aggiornare una colonna puoi semplicemente fare l'UPDATE dentro il trigger protetto da un IF(tipoabbonato='lavoratore').
Altrimenti se devi semplicemente fare qualcosa del tipo, dato un abbonato,
code:
CREATE OR REPLACE FUNCTION calcola_prezzo (
nome_abbonato CHARACTER VARYING
)
RETURNS NUMERIC AS
$BODY$
DECLARE prezzo NUMERIC;
BEGIN
// istruzioni per riempire prezzo
RETURN prezzo;
END
$BODY$
LANGUAGE 'plpgsql';
e poi la chiami come
code:
SELECT *
FROM calcola_prezzo('Pippo');
che torna una riga contentente il valore numeric "prezzo". |
cash |
non ho capito bene...
in postgres mi dà errore di sintassi qualsiasi cosa scrivo (begin,if, referencing...) tranne execute procedure, che normalmente ho visto solo con un "returns trigger" dentro.
ma mettiamo che creo una funzione tipo la tua e ritorno "prezzo". nel trigger come dò il valore a all'attributo in questione?
new.attributo=execute procedure calcola_prezzo(abbonato, ente)?
o qualcosa del genere?
mi dà errore di sintassi pure sul new!!! |
ildiff |
Ora ho capito.
devi fare qualcosa del tipo
code:
CREATE FUNCTION nome_funzione()
RETURNS TRIGGER AS
$BODY$
DECLARE var1 NUMERIC;
BEGIN
...
// recupero il prezzo
SELECT MAX(prezzo) INTO var1
FROM tabella_prezzi
WHERE chiave = ... //in modo che torni solo una riga
//metto il prezzo a posto nella tabella
NEW.prezzo = var1;
...
RETURN NEW;
END
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER nome_trigger
BEFORE INSERT ON tabella
FOR EACH ROW
EXECUTE PROCEDURE nome_funzione();
perchè puoi assegnare dei valori al NEW solo se il trigger è di tipo BEFORE |
cash |
Grazie mille! Invece come si fa a tirar fuori che giorno della settimana è data una data... ;) |
ildiff |
Dovrebbe essere qualcosa del tipo:
code:
SELECT EXTRACT(DOW FROM TIMESTAMP '2008-10-13');
il risultato è un numero che varia tra 0 (domenica) e 6 (sabato). Nel caso dell'esempio tornerebbe 1 perchè oggi è lunedì. |
cash |
Grandissimo!!! Su internet non si trova un cavolo di niente!!! |
ARIEL |
A me invece succede che per parecchi triggers quando provo a testarli facendo una insert in postgresql mi viene fuori il seguente errore:
"Missing FROM - clause entry for table "nome_tabella"
CONTESTO: PL/pgsql function
Non so da cosa dipenda! Qualcuno può aiutarmi?
Grazie |
ildiff |
Originally posted by cash
Grandissimo!!! Su internet non si trova un cavolo di niente!!!
Falso. Basta saper cercare. Trovi tutto sulla documentazione di postgres. |
|
|
|