MySQL Datensätze schreiben mit Stored Procedure ?

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: MySQL Datensätze schreiben mit Stored Procedure ?

Re: MySQL Datensätze schreiben mit Stored Procedure ?

von heinz_ketchup » Mi, 30.01.2008 12:05

Hallo Barlee,

vielen Dank!!!

Der Sytaxfehler lag an dem fehlenden Semikolon nach der Group By Anweisung.
Ich habe ein Update bei meinem Navicat gemacht und siehe da, schon funzt die Prozedur richtig gut. :lol:
Ohne Absturz.

Schöne Grüße
Werner

Re: MySQL Datensätze schreiben mit Stored Procedure ?

von Barlee » Mo, 28.01.2008 21:32

Hallo Werner,

hast Du es mal ohne Navicat versucht?
Folgende Testprozedur habe ich in Base unter Extras/SQL erfolgreich angelegt und anschließend z.B. mit CALL Test(10000) ohne Probleme aufgerufen:

Code: Alles auswählen

CREATE PROCEDURE `Test`(monat INT)
BEGIN
    DECLARE monat INT;
    SET monat=0;
    WHILE monat < 13000 DO
    INSERT INTO Tab_C (Art, Mwst)
select Art, sum(Mwst) from Tab_A
group by Art;
    SET monat = monat + 1;
    END WHILE;
    END
Alternativ könntest Du auch mal den MySQL Administrator probieren. Unter Catalog/Stored Procedure kannst Du Funktionen erstellen und auch editieren (natürlich auch die unter Base angelegte).
Aber zuerst würde ich den Versuch über Base empfehlen. Triitt der Fehler dann auch auf?

Gruß Barlee

Re: MySQL Datensätze schreiben mit Stored Procedure ?

von heinz_ketchup » Mo, 28.01.2008 09:21

Hallo Barlee,

ja, hatte ich. Da ist mir gleich Navicat abgeschmiert. Das funktioniert also auch nicht. Hmmm, irgendwie verflixt.

Viele Grüße
Werner

Re: MySQL Datensätze schreiben mit Stored Procedure ?

von Barlee » So, 27.01.2008 17:09

Hallo Werner,

hattest Du es auch schon mit einem Semikolon am Ende der "GROUP BY" Zeile versucht?

Gruß Barlee

Re: MySQL Datensätze schreiben mit Stored Procedure ?

von heinz_ketchup » So, 27.01.2008 11:32

Hallo Barlee,

der Hinweis war schon sehr gut!

Klar, ich kann ja eine Variable nicht verwenden, bevor ich sie deklariert habe (wenngleich hier meine Literatur zum SET-Befehl nicht ganz eindeutig ist). Ich habe auch schon gelernt, dass man für eine While-Schleife mit Variablen Begin ... End benötigt.

Jetzt habe ich aber ein anderes Problem. Ich bekomme immer folgende Fehlermeldung:

You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near 'SET monat = monat + 1;
END WHILE;
END' at line 20

Hier mein Code:

Code: Alles auswählen

CREATE PROCEDURE `KstH`.`plandaten_schreiben`(monat INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE monat INT;
SET monat = 0;
WHILE monat < 13 DO
INSERT INTO plandaten ( pd_ktonr, pd_kstnr, pd_beschreibung, pd_wert, pd_monat, pd_jahr)
SELECT istdaten.id_ktonr, 
	istdaten.id_kst_ksth, 
	konten.kto_bezeichnung,
	SUM(istdaten.id_wert)/12, 
	monat, 
	istdaten.id_jahr
FROM istdaten, konten WHERE istdaten.id_ktonr = kto_nr
GROUP BY istdaten.id_ktonr, istdaten.id_kst_ksth
SET monat = monat + 1;
END WHILE;
END
Ich bekomme die Fehlermeldung auch, wenn ich ein Semikolon hinter meiner letzten End-Anweisung habe. Mit den 2 Semikolons davor, nach der SET-Anweisung und dem END WHILE habe ich auch schon experimentiert. Daran liegt's also nicht. irgendwas passt nicht mit dem Hochsetzen meines Zählers 'monat' für die While-Schleife. Aber ich komm einfach nicht drauf wo das Problem liegt.

Vielen Dank für Deine/Eure Hilfe!

Viele Grüße
Werner

Re: MySQL Datensätze schreiben mit Stored Procedure ?

von Barlee » Sa, 26.01.2008 23:09

Hallo Werner,

die Zuweisung des Variableninhalts mit "=" sollte in Ordnung sein. Mir fällt auf, dass die Variable nicht definiert wird. Vielleicht resultiert der Fehler daraus.
Versuche einmal folgendes voranzustellen:

Code: Alles auswählen

DECLARE @monat int 
Ändert sich etwas?

Gruß Barlee

MySQL Datensätze schreiben mit Stored Procedure ?

von heinz_ketchup » Sa, 26.01.2008 16:14

Hallo,

ich brauche wieder mal eure Hilfe, bei einem Problem:

Ich habe in einer Istdaten-Tabelle folgende Buchhaltungsdaten:
Konto-Nr, Kostenstellen-Nr, Kontenbezeichnung, Buchungswert, Buchungsmonat, Buchungsjahr (PS: die Kontenbezeichnung hole ich aus einer Konten-Tabelle)

Nun möchte ich die Istdaten pro Konto und Kostenstelle und Jahr auf den Jahreswert (Summe p.a.) verdichten. (Das ist ja nicht schwer)
Die so verdichteten Datensätze möchte ich nun in eine Plandaten-Tabelle schreiben und 12-teln, so dass ich aus dem einen verdichteten Datensatz 12 Datensätze mit gleiche Inhalten, aber unterschiedlichen Monaten (1 bis 12) in meiner Plandaten-Tabelle stehen habe.

Da ich das ganze flexibel benötige, also die Anzahl der Monate variieren (12, 18, 24, 36 ... Monate) können muss, möchte ich das mit einer While-Schleife in einer Prozedur lösen. Die Anzahl der Monate möchte ich später aus einer Steuerungstabelle holen.

Hier mein Ansatz für die Prozedur:

Code: Alles auswählen

Set @monat = 0

While @monat < 13 Do

Insert Into plandaten ( pd_ktonr, pd_kstnr, pd_beschreibung, pd_wert, pd_monat, pd_jahr)

SELECT istdaten.id_ktonr, 
	istdaten.id_kst_ksth, 
	konten.kto_bezeichnung,
	SUM(istdaten.id_wert)/12, 
	@monat, 
	istdaten.id_jahr
FROM istdaten, konten where istdaten.id_ktonr = kto_nr
GROUP BY istdaten.id_ktonr, istdaten.id_kst_ksth

Set @monat = @monat + 1

End While;
So, soweit bin ich schon. Jetzt mault immer mein GUI-Tool Navicat, wenn ich die Prozedur speichern möchte mit Sytaxerror near Zeile @monat. Ich habe auch schon die Variablendeklaration von @monat mit := probiert. Das passt ihm auch nicht.

Vielleicht sieht ja ein geübteres SQL-Auge meinen Anfängerfehler sofort. Schon jetzt danke für eure Hilfe!

Viele Grüße
Werner

Nach oben