MySQL und Stored Procedures

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2601
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

MySQL und Stored Procedures

Beitrag von UliTs » So, 16. Feb 2020 15:16

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
Foren-Administrator
Foren-Administrator
Beiträge: 2591
Registriert: Fr, 08. Feb 2008 21:29

Re: MySQL und Stored Procedures

Beitrag von georg » So, 16. Feb 2020 15:57

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2591
Registriert: Fr, 08. Feb 2008 21:29

Re: MySQL und Stored Procedures

Beitrag von georg » So, 16. Feb 2020 16:18

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2601
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: MySQL und Stored Procedures

Beitrag von UliTs » So, 16. Feb 2020 22:40

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: 2601
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: MySQL und Stored Procedures

Beitrag von UliTs » Mo, 17. Feb 2020 0:03

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