NEWS
[gelöst] MySQL Stored Procedure in Blockly aufufen
-
Moin,
hab da eine etwas knifflige Frage.
Und zwar hab ich mir MySQL installiert und würde dort gerne eine Stored Procedure über Blockly aufrufen:
Einen simplen Select bekomme ich über send to seht gut hin und das Ergebnis läßt sich auch gut auswerten.
Bei größeren Projekten ist es aber nicht gerade elegant riesige SELECTS im Blockly Script zu verpacken.
Wenn ich dasselbe mit einer Prozedur versuche bekommt ich immer einen Fehler:
Beispielsweise das hier:CALL iobroker.GetCheapestPriceE10Week(@Preis); SELECT @Preis;
Muß dann eventuell der Befehl von query auf procedure umgestellt werden?
Danke Euch - Gruß
Martin -
habe das mal kurz getestet - funktioniert
schalte mal das debug im block ein bei loglevel - vielleicht siehst du dann mehr
-
@liv-in-sky
OK danke. Schau ich mir an. Der größter Unterschied scheint mir auf den ersten Blick, dass meine Prozedur einen OUT Parameter hat. Evtl. reicht es auch einfach das auf Ergebnis Recordset - also einen SELECT umzustellen.
Danke ich versuche es mal.
Gruß
Martin -
@liv-in-sky
Hey, eben getestet und die Prozedur funktioniert:
Allerdings bekomme ich das Ergebnis nicht. Denn im result steht nur folgendes:
script.js.SQL.Spritpreise_Dettingen-Prozedur: {'error':null,'result':{'fieldCount':0,'affectedRows':1,'insertId':0,'info':'','serverStatus':16386,'warningStatus':0,'stateChanges':{'systemVariables':{},'schema':'','trackStateChange':null}}}Hab dann das hier versucht:
CALL iobroker.GetCheapestPriceE10Week(@Preis);
SELECT @Preis;und da kommt dann:
script.js.SQL.Spritpreise_Dettingen-Prozedur: {'error':'Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT @Preis' at line 1'}Vermutlich muß ich einfach die Prozedur von Output Parameter auf Recordset umstellen um das zu lösen.
Gruß
Martin -
@liv-in-sky
wie vermutet klappt es jetzt. Das Ergebnis der Prozedur ist nur leider zweifach verpackt in JSON - aber das ist bei Prozeduraufrufen halt so:
{'error':null,'result':[[{'Preis':1.769}],{'fieldCount':0,'affectedRows':0,'insertId':0,'info':'','serverStatus':16386,'warningStatus':0,'stateChanges':{'systemVariables':{},'schema':'','trackStateChange':null}}]}Läßt sich ja lösen.
Danke. Falls Du noch dahinter kommst wie man mit Output Variablen arbeitet wäre ich dankbar.
LG Martin -
@martin-schlender sagte in MySQL Stored Procedure in Blockly aufufen:
Danke. Falls Du noch dahinter kommst wie man mit Output Variablen arbeitet wäre ich dankbar.
weißt du, wie man die output variable in so einem call bekommt ? wird die vom adapter geliefert ?
-
@martin-schlender sagte in MySQL Stored Procedure in Blockly aufufen:
SELECT @Preis;
hast du mal probiert, die datenbank mit anzugeben ?
select @Preis from .......
-
@martin-schlender wo rufst du eigentlich das select@Preis auf
wenn ich es in der procedure mache kommt das:
-
@liv-in-sky
nee - das SELECT @Preis ist natürlich außerhalb der Prozedur im Blockly mit drin.
Man ruft die Prozedur auf und wertet danach das Ergebnis der Output Variable aus.Wenn man das in einer MySQL Sitzung macht funktioniert das auch:
Das hier funktioniert im übrigen nicht:
CALL iobroker.GetCheapestPriceE10Week(@Preis);
SELECT iobroker.@Preis;Was jetzt auch kein Wunder ist, da es sich ja um eine Variable handelt die nicht Teil der Datenbank iobroker ist.
LG Martin -
ganz ehrlich: so richtig check ich das nicht
@martin-schlender sagte in [gelöst] MySQL Stored Procedure in Blockly aufufen:
natürlich außerhalb der Prozedur
ja aber dann wird ein select aufgrufen, der keine "heimat" hat - die procedure wird doch in der datenbank angelegt/definiert
der adapter macht eine neue anfrage mit select @Preis - woher soll er wissen, zu welcher db das gehört ? wenn man das in phpadmin macht, ist die db ja definiert, daher funktioniert das
oder täusche ich mich da
-
@liv-in-sky
In MySQL muß man Variablen nicht definieren.
Daher kann man die Output Variable @Preis einfach angeben und die wird durch die Definition in der Prozedur definiert. Das SELECT @Preis gibt sie einfach nur aus- das war der lahme Versuch an den Inhalt der Variablen zu kommen.
Wenn man die Prozedur aus SQL heraus aufrufen würde, würde man einfach mit dem Preis weiter rechnen oder sonst was machen.
LG Martin