Ich versuche, eine gespeicherte Funktion mit einer vorbereiteten Anweisung zu verwenden, aber keinen Erfolg.Verwenden der gespeicherten Funktion mit C-API & vorbereiteten Anweisungen
MySQL bereitet die Anweisung vor, führt sie aber nicht aus, es wird kein Fehler ausgegeben, es wird nur stillschweigend fehlgeschlagen.
Dies ist die * Funktion:
drop function if exists lineDistanceC;
delimiter //
CREATE FUNCTION lineDistanceC (la1 DOUBLE, lo1 DOUBLE, la2 DOUBLE, lo2 DOUBLE) RETURNS DOUBLE
BEGIN
SET @r = 6371;
SET @lat1 = RADIANS(la1);
SET @lon1 = RADIANS(lo1);
SET @lat2 = RADIANS(la2);
SET @lon2 = RADIANS(lo2);
SET @x = (@[email protected]) * COS((@[email protected])/2);
SET @y = (@lat2 - @lat1);
RETURN (SQRT((@x*@x) + (@y*@y)) * @r);
END
//
delimiter ;
Es ist auf der Kommandozeile funktioniert wie erwartet, und dann ist es wie erwartet zu arbeiten, so dass der umgebende Code ist in Ordnung, erlaubt in der SELECT-Anweisung ein hartcodiert Doppel Substituieren auch.
Ich habe CLIENT_MULTI_STATEMENTS als MySQL-Verbindungsparameter aktiviert, ich vermute, dass es sich nur um CALLing-Prozeduren handelt, aber es war ein Strohhalm, den es wert ist, gepackt zu werden.
Die Anweisung wird unter Verwendung von:
strcpy (sqlStr, "SELECT lineDistanceC(Y(pnt),X(pnt), ?, ?) FROM mytable");
MYSQL_STMT *statement;
if (mysql_stmt_prepare(statement, sqlStr, strlen(sqlStr))) {
fprintf(stderr, "ERROR:mysql_stmt_prepare() failed. Error:%s\nsql:%s\n", mysql_stmt_error(statement), sqlStr);
}
Gefolgt von den erforderlichen Bind-Anweisungen für die Parameter und die Ergebnisse dann ausgeführt werden:
if (mysql_stmt_execute(statement)) {
fprintf(stderr, "mysql_stmt_execute(), failed. Error:%s\n", mysql_stmt_error(statement));
}
Wie bereits erwähnt, wenn die Funktion in den obigen SELECT-Anweisung wird durch einen harten Code-Float (zB SELECT 2.3 .....) ersetzt, dann gibt es die fest codierte Zahl wie erwartet zurück.
In der Realität wird der vorbereitete Anweisungscode mit Makros eingefügt, es gibt viele hundert Anweisungen, die wie erforderlich funktionieren, so dass die Vorbereitung, Bindung oder Ausführungssyntax nicht das Problem ist (und wenn es oben falsch ist, dann ist es meine Übersetzung aus der Makros, die falsch sind), es sei denn, sie müssen für die Verwendung mit Funktionen unterschiedlich sein.
Hier sind die Einträge Protokoll, wenn eines der Eingangssignale als die Ausgabe gebunden ist:
Prepare SELECT ? FROM mytable
Execute SELECT 51.36000061035156 FROM mytable
Das ist der Protokolleintrag, wenn ich die Funktion zu benutzen versuchen:
Prepare SELECT lineDistanceC(latitude, longitude, ?, ?) FROM mytable;
Wie oben erwähnt Es schlägt automatisch fehl, ohne die Anweisung auszuführen, keine Fehler im Protokoll oder an anderer Stelle.
Alle Hinweise würden geschätzt werden.
* Um Kredit zu geben, wo sie fällig ist, wurde diese Funktion aus einer Formel abgeleitete here
Können Sie ein Beispiel hinzufügen, wie Sie es nennen? Sowohl wenn es funktioniert und nicht? – ethrbunny
@ethrbunny Aktualisiert wie angefordert – blankabout
Was erhalten Sie, wenn Sie einige Parameter zurückgeben? (IE überspringen Sie den Code und überprüfen Sie einfach, dass Ihre Eingaben sind rational) – ethrbunny