Vai al contenuto


Foto

[MySQL] Problema stupido con trigger


Questa discussione e' stata archiviata Questo significa che non e' possibile rispondere
99 risposte a questa discussione

#1 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 18:28

allora,
CREATE TRIGGER tr_ins_animale BEFORE INSERT ON Animali

	FOR EACH ROW

	BEGIN 

	DECLARE foo INT;

	IF(NEW.data_arrivo > CURDATE())

		select 'la data di inserimento non può essere maggiore di quella odierna' into foo; 

	END IF;

	END;


è un trigger che fa finta di fare il raise_application_error degli altri dbms in mysql, alla fine dovrebbe buttare fuori un errore del genere "invalid integer value: "la data di inserimento non può essere maggiore di quella odierna", bloccando l'inserimento.


Ma mi da errore di sintassi, dove lo vedete voi?


Inb4 manca una semicolon

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#2 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 18:30

mancava il then :trollface:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#3 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 18:45

Lancia un warning e inserisce lo stesso :trollface:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#4 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 19:00

si ma ti basta un check, sei scemo?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#5 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 19:02

La DECLARE dentro al ciclo FOR è una chicca...

:trollface:
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#6 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 15 giugno 2011 - 19:04

La DECLARE dentro al ciclo FOR è una chicca...

:trollface:


Mai usati i trigger, ma tecnicamente quello non è un vero e proprio ciclo for o sbaglio ?

#7 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 19:05

Non sbagli, ma io non avrei mai messo la DECLARE lì dentro...
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#8 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 19:18

Non sbagli, ma io non avrei mai messo la DECLARE lì dentro...



guarda che non è un for, è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :trollface:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#9 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 15 giugno 2011 - 19:20

[quote name="toyo ?":3tazankl] [quote name='"Nex ?":3tazankl] Non sbagli' date=' ma io non avrei mai messo la DECLARE lì dentro...[/quote']


guarda che non è un for, è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :trollface:[/quote]

in b4 caricamento ODI/SSIS con tabella da 30 milioni di record per 150 campi.

#10 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 19:23

guarda che non è un for, è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :trollface:

A parte che non è esattamente così, comunque l'avevo scritto sopra.

Il punto è che a livello logico è sbagliato e se fai 'ste cappellate poi ti capita di infilarle anche nel codice normale...
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#11 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 19:26

[quote name="Nex ?":3rnh5ub6] [quote name='"toyo ?":3rnh5ub6]guarda che non è un for' date=' è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :trollface:[/quote']
A parte che non è esattamente così, comunque l'avevo scritto sopra.

Il punto è che a livello logico è sbagliato e se fai 'ste cappellate poi ti capita di infilarle anche nel codice normale...[/quote]

ok, ma per una roba così
CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

FOR EACH ROW

	BEGIN

	DECLARE prezzo_n FLOAT;

	DECLARE prezzo_ns FLOAT;

	DECLARE prezzo_r FLOAT;

	DECLARE prezzo_rs FLOAT;

	DECLARE prezzo_c FLOAT;

	DECLARE prezzo_cs FLOAT;

	DECLARE totale FLOAT;

	SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

	SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

	SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

	SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

	SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

	SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

	SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

	END;

come fai senza i declare?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#12 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 20:29

Li metti subito dopo la CREATE TRIGGER e fuori dal ciclo.
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#13 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 22:33

Li metti subito dopo la CREATE TRIGGER e fuori dal ciclo.


ah si può? in tutti gli esempi che ho visto il for each era sempre sotto il create trigger.

provo subito.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#14 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 22:38

intendi così giusto?

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

  DECLARE prezzo_n FLOAT;

  DECLARE prezzo_ns FLOAT;

  DECLARE prezzo_r FLOAT;

  DECLARE prezzo_rs FLOAT;

  DECLARE prezzo_c FLOAT;

  DECLARE prezzo_cs FLOAT;

  DECLARE totale FLOAT;

  SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

  SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

  SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

  SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

  SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

  SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

   FOR EACH ROW

   BEGIN

   SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

   END;


o serve un altro begin/end?

magari è una domanda straniubba ma iniziato stamattina con pl/sql

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#15 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 22:43

Le DECLARE stanno fuori dal ciclo, ma le SELECT devono stare dentro, altrimenti non funziona niente.

I BEGIN/END li usi solo per i cicli, gli IF/CASE o quando inizi una transazione, ecc...

E solo se ci sono più righe di istruzione, altrimenti puoi fare senza, es:

IF @MY_VAR = 'Ciao' THEN SET @YOUR_VAR = 'Ok'
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#16 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 22:53

Ok grazie.
Ma se posso dichiarare una variabile fuori dal ciclo, perché non posso inizializzarla?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#17 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 22:57

Puoi inizializzarle dove vuoi, ma in questo caso specifico non sapendo se la tabella "BIGLIETTI" ha dei dati che non sono influenzati dal trigger che stai lanciando o comunque che non mutano mentre il trigger viene innescato, conviene mettere le SELECT dentro.

Mi spiego: mettiamo che il TRIGGER parta per ogni UPDATE che fai. Se le tue SELECT vanno a testare le stesse UPDATE e tu le mettessi fuori dal ciclo, nel caso in cui il ciclo agisse su più ROW modificate, avresti una situazione incoerente...

Dipende quindi dai casi.
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#18 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 23:03

Puoi inizializzarle dove vuoi, ma in questo caso specifico non sapendo se la tabella "BIGLIETTI" ha dei dati che non sono influenzati dal trigger che stai lanciando o comunque che non mutano mentre il trigger viene innescato, conviene mettere le SELECT dentro.

Mi spiego: mettiamo che il TRIGGER parta per ogni UPDATE che fai. Se le tue SELECT vanno a testare le stesse UPDATE e tu le mettessi fuori dal ciclo, nel caso in cui il ciclo agisse su più ROW modificate, avresti una situazione incoerente...

Dipende quindi dai casi.


ah ok, ma nel caso in cui viene richiamato questo trigger(che è sull'update di Storico_vendite, non Biglietti), la tabella biglietti ha sempre gli stessi valori (per motivi intrinsechi a come è progettato il mio zoo :trollface: )

quindi lo lascio fuori, grazie ancora

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#19 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.886 Messaggi:

Inviato 15 giugno 2011 - 23:07

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

DECLARE prezzo_n FLOAT;

DECLARE prezzo_ns FLOAT;

DECLARE prezzo_r FLOAT;

DECLARE prezzo_rs FLOAT;

DECLARE prezzo_c FLOAT;

DECLARE prezzo_cs FLOAT;

SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

FOR EACH ROW

	BEGIN

	SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

	END;


errore di sintassi alla riga 2 :trollface:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#20 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 16 giugno 2011 - 08:33

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

AS

DECLARE ...
...
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...