Nochmal SP mit Records-Set Rückgabe.
Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 16:55:27 von christoph.soellner
Hi *,
meine SP soll ein Record-Set zurückgeben; Temporäre Tabellen
scheiden aus, denn wenn mehrere Benutzer gleichzeitig diese
Procedure aufrufen, gibt das ein Durcheinander.
Leider akzeptiert MySQL 5.0.19-nt das UNION Statement inner-
halb von meinem CURSOR nicht, und auch UNION ALL wirft einen
Fehler beim Speichern der SP.
Hat dafür jemand eine Lösung gefunden?
Danke,
Christoph
-- #########################################################
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;
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; -- <<<<<< 1. SELECT
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; -- <<<<<< 2. SELECT
SET plzs = cplz;
SET plze = cplz;
END IF;
END LOOP ml;
SELECT lastkey, plzs, plze; -- <<<<<< 3. SELECT
CLOSE cur;
END
-- #########################################################
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 17:04:12 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 17:16:28 von christoph.soellner
> Huch? temp. tabellen sollten nur innerhalb der Session gelten, in der
> diese erstellt werden. So ist das zumindest unter PG, und ich bezweifle,
> daß MySQL derart kapott ist.
Mag sein, aber auch eine Memory-Tabelle bleibt bestehen, bis der
Server neu gestartet wird oder ein berechtigter Benutzer selbige
löscht. Schlechte Idee.
> > Leider akzeptiert MySQL 5.0.19-nt das UNION Statement inner-
> > halb von meinem CURSOR nicht, und auch UNION ALL wirft einen
> > Fehler beim Speichern der SP.
> Nett von Dir, diese Fehlemerldung zu verschweigen. Das ist echt
> zielführend...
Point taken.
### ERROR 1064 (42000): You have an error in your SQL syntax;
### check the manual that corresponds to your MySQL server ver-
### sion for the right syntax to use near 'UNION
### SELECT lastkey, plzs, plze; END IF;
### SET lastkey = ckey;
### SET pl' at line 17
### ERROR 1064 (42000): You have an error in your SQL syntax;
### check the manual that corresponds to your MySQL server ver-
### sion for the right syntax to use near 'UNION all
### SELECT lastkey, plzs, plze;
### END IF;
### SET lastkey =' at line 18
> > Hat dafür jemand eine Lösung gefunden?
> Für PG nannte ich ja eine ;-)
Jo, die hab ich auch portiert bekommen, aber da hat es zu einer
Gebiet-ID immer das Minimum und das Maximum der PLZ ausgewählt.
Vielleicht tun die Cursor anders als das Pendant in PGSQL.
Anyway, die Funktion von oben funktioniert. Nur gibt sie eben
für jedes SELECT ein eigenes RECORD-SET zurück -> Schlecht. Ich
hätt das gerne in einer einzigen Tabelle.
Hab auch im google-Cache euren Beitrag zu diesem Thema gefunden,
aber außer einer Temp-Tabelle und dem UNION schien keine andere
Lösung da drin zu sein. Und Temp geht nicht, und UNION ist feh-
lerhaft.
"Was tun?" sprach Zeus. Und er meinte damit nicht PGSQL instal
lieren (nix für ungut)...
Danke trotzdem,
Christoph
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 17:25:02 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 17:35:39 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 17:45:51 von christoph.soellner
>> Vielleicht ein View, der das außerhalb Deiner SP macht?
> streich mal bitte diesen Satz, das war nix...
Das dachte ich mir schon ^^
> Kannst Du nicht in einer SP durch das Resultat wandern, so wie hier:?
Hm, ich glaube schon. Also kurz wie ein Cursor funktioniert:
1. Mit Select irgenwas auswählen oben im DECLARE.
Der Cursor hat nun diese riesige Tabelle intus.
### DECLARE cur CURSOR FOR SELECT geb_pKey, plz FROM plz ORDER
### BY geb_pKey ASC, plz ASC;
2. Bis nix mehr drin ist, mittels FETCH die nächste Zeile
holen und FETCH rutscht den Zeiger eins weiter runter.
### FETCH cur INTO ckey, cplz;
Das Wandern funktioniert also. Und die richtigen Werte be-
komme ich auch. Für jeden Durchlauf nach dem FETCH (LOOP-
Schleife) habe ich in lastkey, plzs, plze die exakt richtigen
Werte drinnen stehen.
Mein Problem ist nun eben, dieses Tupel (lastkey, plzs, plze)
zu sammeln, und ganz zum Schluß als Ergebnis-SET zurückzugeben:
lastkey, plzs, plze
1 2 12
1 15 20
....
....
....
Mit dem SELECT in innerhalb der Schleife interpretiert MySQL
die Sache so, als würde ich jedesmal eine neue Tabelle zurück-
geben wollen. Und da liegt der Hase begraben...
Christoph
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 18:43:43 von Thomas Rachel
Christoph Soellner wrote:
>> Huch? temp. tabellen sollten nur innerhalb der Session gelten, in der
>> diese erstellt werden. So ist das zumindest unter PG, und ich
>> bezweifle, daß MySQL derart kapott ist.
(Deine Umlaute sind kaputt.)
> Mag sein, aber auch eine Memory-Tabelle bleibt bestehen, bis der
> Server neu gestartet wird oder ein berechtigter Benutzer selbige
> löscht. Schlechte Idee.
Stimmt - aber Memory-Tabelle != Temp-Tabelle.
Eine temporäre Tabelle wird im tmp-Verzeichnis des Servers (was auch
immer da eingestellt ist) erstellt und nach Sitzungsende gelöscht.
Speichertechnisch wird sie behandelt wie eine "permanente" Tabelle:
- als Memory-Tabelle wird nur die .frm im Dateisystem gespeichert (perm
-> DB-Verzeichnis, temp -> tmp-Verzeichnis),
- als MyISAM- oder sonst irgendeine Tabelle werden alle drei Dateien im
Dateisystem gespeichert.
HTH,
Thomas
--
Alle Völker lachen auf unserer Erde, aber selten über die
gleichen Dinge. (Pierre Daninos)
Re: Nochmal SP mit Records-Set R?ckgabe.
am 09.04.2006 20:33:03 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Nochmal SP mit Records-Set Rückgabe.
am 09.04.2006 20:50:59 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Nochmal SP mit Records-Set Rückgabe - GELÖST
am 11.04.2006 09:18:50 von christoph.soellner
Nach ewigem Gesuche und Gejammere steht nun fest:
MySql kann (noch) keine Record-Sets aus SPs zurück-
geben (mit bestimmten Ausnahmen). Lösung ist wirk-
lich zZ nur mit Temp-Tables möglich. Ich werf die
in den RAM und gut is. Trotzdem dauert die Abfrage
auf meine Xeon-Maschine 2,8GHz DualCPU 1 Sekunde.
Hier die Prozedur:
-- ############################################
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
-- ############################################
und ps:
Ich bin stolz auf mein OExpress. Und ja, ROTxy kann ich grad
noch entschlüsseln, hatte auch Kryptologie an der Uni. Wobei
das 13er ja praktischerweise schon im OE eingebaut ist...
In diesem Sinne,
Christoph
Re: Nochmal SP mit Records-Set R?ckgabe - GEL?ST
am 11.04.2006 09:49:30 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: Nochmal SP mit Records-Set R?ckgabe - GEL?ST
am 11.04.2006 10:11:11 von christoph.soellner
> Fein. Das sollte Dich nicht hindern, es wenigstens gescheit zu
> konfigurieren. Deklaration des Zeichensatzes zum Beispiel.
Hab ich doch. Warum es nicht tut, weiß der Geier.
Ich sehe auch, dass er im Quelltext _nicht_ deklariert ist,
aber hier im Programm isses das. Ich hab mal das UUEncode
ausgemacht, vielleicht liegts daran. Text-Coding:none.
Und ein paar TEST ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖs.
Tuts?
Re: Nochmal SP mit Records-Set R?ckgabe - GEL?ST
am 11.04.2006 10:17:09 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: Nochmal SP mit Records-Set R?ckgabe - GEL?ST
am 11.04.2006 16:11:01 von Thomas Rachel
Christoph Soellner wrote:
> Ich bin stolz auf mein OExpress. Und ja, ROTxy kann ich grad
> noch entschlüsseln, hatte auch Kryptologie an der Uni. Wobei
> das 13er ja praktischerweise schon im OE eingebaut ist...
Was gibt es darauf stolz zu sein? Es läÃt sich effektiv nur mit Hilfe
diverser Zusatzprogramme wirklich RFC-konform einstellen.
[Deklaration des Zeichensatzes]
> Hab ich doch. Warum es nicht tut, weiß der Geier.
Offenbar nicht richtig.
Thomas
Re: Nochmal SP mit Records-Set R?ckgabe - GEL?ST
am 11.04.2006 22:59:36 von christoph.soellner
> > Ich bin stolz auf mein OExpress. Und ja, ROTxy kann ich grad
> > noch entschlsseln, hatte auch Kryptologie an der Uni. Wobei
> > das 13er ja praktischerweise schon im OE eingebaut ist...
> Was gibt es darauf stolz zu sein? Es l Ãt sich effektiv nur mit Hilfe
> diverser Zusatzprogramme wirklich RFC-konform einstellen.
> > Hab ich doch. Warum es nicht tut, wei der Geier.
> Offenbar nicht richtig.
oh look who's talking... Deine AEs und OEs gehen auch nicht...
nix fuer ungut...
Re: Nochmal SP mit Records-Set R?ckgabe - GEL?ST
am 12.04.2006 07:13:37 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: Nochmal SP mit Records-Set Rückgabe - GELÖST
am 12.04.2006 10:36:56 von Thomas Rachel
Christoph Soellner wrote:
> oh look who's talking... Deine AEs und OEs gehen auch nicht...
Bei Dir nicht. Deklariert sind sie richtig:
| Content-Type: text/plain; charset=utf-8
| Content-Transfer-Encoding: 8Bit
Sowas sollte bei Deinen Postings idealerweise auch drinstehen...
Wundert mich eigentlich, daà OE utf-8 (lesend) noch nicht beherrscht - aber
da kenne ich mich mit den Versionsnummern nicht so aus.
(Daà mein Subject verhunzt ist, liegt daran, daà ich es vergessen habe, beim
Follow-up zu fixen. Mea culpa.)
> nix fuer ungut...
Dito.
Ich schlage vor, EOD wegen OffTopic und fehlender Relevanz zum eigentlichen
Thema?
Thomas