Trigger programmieren

Trigger programmieren

am 23.05.2006 09:03:32 von emanuel

Hallo,

ich möchte mit MySql Triggers und oder Stored Procedures erstellen,
die mehr machen als nur Feldwerte zu prüfen oder Defaultwerte zu
setzen.

Leider finde ich dazu keine Referenz die sich auf den SQL 2003 Standard
bezieht.

Für PL/SQL gibt es super Referenzen aber das bringt mir nicht viel,
denn es ist nicht kompatibel zu SQL 2003.

Konkret beschäftige ich mich zurzeit damit:
- Wie kann ich Exceptions aufrufen/abfangen/erstellen
Beispiel (PL/SQL):
raise MyException;
Exception
When MyException then
RAISE_APPLICATION_ERROR(-20500, 'Ein Fehler ist aufgetreten!');

- Wie kann ich ein SQL ausführen und die Daten in Variabeln schreiben
Beispiel (PL/SQL):
select count(*) into MyVarCount from mysql.user;


Für jeden Link, Buchempfehlung, etc. bin ich dankbar!

Grüsse
Emanuel Blaser

Re: Trigger programmieren

am 23.05.2006 09:42:51 von christoph.soellner

> Wie kann ich ein SQL ausführen und die Daten in Variabeln schreiben
> Beispiel (PL/SQL):
> select count(*) into MyVarCount from mysql.user;

Hab mich auch totgesucht dazu.
Ergebnis: Geht nicht so einfach.
Umweg:
1. Temp-Tabelle (type=memory) erstellen am Anfang der SP
2. Daten in Temp-Tabelle schreiben mittels INSERT
3. Aufruf dann:

CALL myproc;
SELECT * FROM temptable;

Hier mal ein Programmbeispiel:
########################################################
CREATE PROCEDURE plzgebiete ()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE lastkey, plzs, plze INT;
DECLARE ckey, cplz INT;
DECLARE cur CURSOR FOR SELECT geb_pKey, plz FROM plz ORDER BY geb_pKey
ASC, plz ASC;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

DROP TABLE IF EXISTS temptable;
CREATE TEMPORARY TABLE temptable (geb_pKey INT(5), plz_von INT(5) UNSIGNED
ZEROFILL, plz_bis INT(5) UNSIGNED ZEROFILL) ENGINE = MEMORY;

SET lastkey = 0;
OPEN cur;
ml:LOOP
FETCH cur INTO ckey, cplz;
IF (done=1) THEN
LEAVE ml;
END IF;
IF lastkey <> ckey THEN
IF lastkey <> 0 THEN
-- SELECT lastkey, plzs, plze
INSERT INTO temptable VALUES (lastkey, plzs, plze);
END IF;
SET lastkey = ckey;
SET plzs = cplz;
SET plze = cplz;
ITERATE ml;
END IF;
IF (cplz = (plze+1)) THEN
SET plze = cplz;
ELSE
-- SELECT lastkey, plzs, plze
INSERT INTO temptable VALUES (lastkey, plzs, plze);
SET plzs = cplz;
SET plze = cplz;
END IF;
END LOOP ml;
-- SELECT lastkey, plzs, plze
INSERT INTO temptable VALUES (lastkey, plzs, plze);
CLOSE cur;
END
########################################################

Hoffe, das hilft.
Christoph

Re: Trigger programmieren

am 23.05.2006 09:47:38 von emanuel

> - Wie kann ich ein SQL ausführen und die Daten in Variabeln schreiben
> Beispiel (PL/SQL):
> select count(*) into MyVarCount from mysql.user;

Ok eine kleine Korrektur...

select count(*) into MyVarCount from mysql.user;

... funktioniert in Stored Procedures aber nicht in Triggers.

Bin aber immer noch dankbar für gute Hinweise, speziell bezüglich
Exceptions.

Emanuel

Re: Trigger programmieren

am 23.05.2006 11:09:24 von emanuel

> Hab mich auch totgesucht dazu.

Ja, irgendwie sind die Informationen wie man SP's oder Triggers
entwickelt sehr verteilt und spärlich, aber das liegt wohl daran, dass
MySql diese Funktionen noch nicht lange bietet.

Hab jetzt ein Buch gefunden
http://www.amazon.de/exec/obidos/ASIN/0596100892/qid=3D11483 72563/sr=3D1-1/=
ref=3Dsr_1_0_1/302-3775200-7375215

das scheint ziemlich genau das zu sein was ich brauche.

So oder so vielen Dank für die Hilfe

Emanuel

Re: Trigger programmieren

am 23.05.2006 12:59:21 von Sven Paulus

emanuel wrote:
> Bin aber immer noch dankbar für gute Hinweise, speziell bezüglich
> Exceptions.

Exceptions aus Triggern zu erzeugen geht noch nicht. Abhilfe ist,
bewusst einen SQL-Error zu erzeugen (zweifacher INSERT mit
identischem unique-key-Wert o.ae.).

Re: Trigger programmieren

am 23.05.2006 13:32:17 von emanuel

> > Bin aber immer noch dankbar für gute Hinweise, speziell bezüglich
> > Exceptions.
>
> Exceptions aus Triggern zu erzeugen geht noch nicht. Abhilfe ist,
> bewusst einen SQL-Error zu erzeugen (zweifacher INSERT mit
> identischem unique-key-Wert o.ae.).

Und wie siehts aus mit Stored Procedures, kann ich da Exceptions
erzeugen?
Dann könnte ich evt. mit einem Call MyExceptionProc die Exception
auslösen...

Re: Trigger programmieren

am 23.05.2006 14:22:41 von Sven Paulus

emanuel wrote:
> Und wie siehts aus mit Stored Procedures, kann ich da Exceptions
> erzeugen?

Noe, meines Wissens genau die gleiche Situation.

> Dann könnte ich evt. mit einem Call MyExceptionProc die Exception
> auslösen...

Irgendwo hat mal jemand beschrieben (-> guegeln oder einfach selbst
nachdenken), wir man so eine MyExceptionProc() macht, indem man eben
innerhalb dieser eine ungueltige SQL-Anweisung ausfuehrt.

Ich finde es auch eher ungeschickt, weil gerade in Triggern das doch
wirklich was schoenes waere.

Re: Trigger programmieren

am 23.05.2006 14:44:50 von frank paulsen

Sven Paulus writes:

> Exceptions aus Triggern zu erzeugen geht noch nicht. Abhilfe ist,
> bewusst einen SQL-Error zu erzeugen (zweifacher INSERT mit
> identischem unique-key-Wert o.ae.).

har, har, har.

http://thedailywtf.com/forums/thread/73971.aspx

--
frobnicate foo

Re: Trigger programmieren

am 23.05.2006 14:50:47 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Trigger programmieren

am 23.05.2006 15:30:16 von Sven Paulus

frank paulsen wrote:
>> Exceptions aus Triggern zu erzeugen geht noch nicht. Abhilfe ist,
>> bewusst einen SQL-Error zu erzeugen (zweifacher INSERT mit
>> identischem unique-key-Wert o.ae.).
> har, har, har.
> http://thedailywtf.com/forums/thread/73971.aspx

Der Gag bei den doppelten INSERTs ist, dass man eben genau den
Fehlermeldungstext zweimal einfuegt. So hat man inmitten von
zusammenhanglosem SQL-Gemeckere noch den eigentlichen Fehlertext.
Voellig krank, ja. Aber keine Moeglichkeit zu haben, mit Fehler aus
einem Trigger auszusteigen ist's ja auch.