MySQL und Stored Procedures

alles zu mySql/mariadb

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

MySQL und Stored Procedures

Beitrag von UliTs »

Hallo allerseits,

ich habe ein Problem mit MySQL und Stored Procedures, welches mich seit Tagen lähmt und zu dem ich keine Lösung finde. Vielleicht gibt es hier ja einen MySQL-Experten, der direkt die Lösung kennt.

Ich habe eine Stored Procedure, die unter anderem aus mehreren select-Statements besteht geschrieben. Mein Problem dabei kann ich sehr gut mit der folgenden Beispiel-Routine darstellen:

Code: Alles auswählen

procedure Test( in Nr int );
begin
  declare Result int;

  select Nr-5;
  set Result = (select Nr+5);
  select Nr,Result;
end;
Bei Aufruf

Code: Alles auswählen

call Test( 100 );
würde ich als Ergebnis eine Tabelle mit 1 Datensatz und 2 Spalten mit den Werten 100 und 105 erwarten:
100 105
Tatsächlich kommt aber das Ergebnis des ersten Select-Statements heraus:
95
Woran kann das liegen bzw. was muß ich ändern, damit der richtige Wert herauskommt?

P.S. Dabei setze ich nicht xBase++ ein, sondern das Ganze wird in ein Delphi-Programm mit Hilfe der FireDac-Schnittstelle integriert.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySQL und Stored Procedures

Beitrag von georg »

Hallo, Uli -


mit stored procedures habe ich noch nichts gemacht, aber Du hast da direkt eine Select-Anweisung, die das von Dir genannte Resultat generiert:

Code: Alles auswählen

select Nr - 5;
ergibt 95. Stimmt doch, oder?

Was Du willst, ist doch, das erste Select-Statement (von der Ausgabe her) unterdrücken? In dem Fall solltest Du die Rechenoperation anders ausführen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySQL und Stored Procedures

Beitrag von georg »

Hallo, Uli -


also, ich habe mal ein wenig gebuddelt und dazu was gefunden und angepasst:

Code: Alles auswählen

MariaDB [stopro]> create procedure uli (in Nr int)
    -> begin
    -> declare result int;
    -> set Nr = Nr - 5;
    -> set Result = Nr + 5;
    -> select Nr, Result;
    -> end //
Query OK, 0 rows affected (0.013 sec)

MariaDB [stopro]> call uli(100)//
+------+--------+
| Nr   | Result |
+------+--------+
|   95 |    100 |
+------+--------+
1 row in set (0.008 sec)

Query OK, 0 rows affected (0.013 sec)
Was ich in Deinem Beispiel nicht verstehe, ist diese Anweisung:

Code: Alles auswählen

select Nr-5;
Damit erzwingst Du die Ausgabe von "95", was an sich wertfrei ist, aber zu dem "Fehlverhalten" führt. Wenn Du den Wert von Nr verringern willst, musst Du eine andere Anweisung verwenden. Aber da Du 100 (den unveränderten Wert) erwartest, die Frage: was ist der Zweck der Select-Anweisung?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: MySQL und Stored Procedures

Beitrag von UliTs »

Hallo Georg,

danke für die Antwort.
Allerdings geht dein Beispiel am Thema vorbei. Da gibt es ja nur eine select Anweisung!

Edit: was kommt denn bei Dir raus, wenn Du meine Testroutine aufrufst?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: MySQL und Stored Procedures

Beitrag von UliTs »

So, ich bin ein klein bisschen weiter gekommen...

Es ist tatsächlich so, dass Stored Procedures mehrere Tabellen als Rückgabewert haben können. Und dann macht es auch sinn, dass diese Tabellen durch mehrere select statemens angegeben werden können.

Eigentlich möchte ich aber nur eine Tabelle (bzw. Ergebnismenge) als Rückgabewert haben. Das Dilemma entsteht bei mir dadurch, dass ich innerhalb der Stored Procedure eine andere Stored Procedure mittels

Code: Alles auswählen

call ProtokollEinfuegen();
aufrufe. Die Ergebnismenge (die ich in diesem Fall gar nicht brauche), wird auch als Ergebnismenge der aufrufenden Stored Procedure verstanden.
Also dachte ich mir (das Ergebnis von ProtokollEinfuegen() ist tatsächlich nur ein einzelner integer-Wert), mache ich den Aufruf wie folgt.

Code: Alles auswählen

set PrResult = (call ProtokollEinfuegen());
Leider führt das schon beim Anlegen zu einer Fehlermeldung.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten