Seite 1 von 1

MySQL und Stored Procedures

Verfasst: So, 16. Feb 2020 15:16
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.

Re: MySQL und Stored Procedures

Verfasst: So, 16. Feb 2020 15:57
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.

Re: MySQL und Stored Procedures

Verfasst: So, 16. Feb 2020 16:18
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?

Re: MySQL und Stored Procedures

Verfasst: So, 16. Feb 2020 22:40
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

Re: MySQL und Stored Procedures

Verfasst: Mo, 17. Feb 2020 0:03
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.