Próbuję użyć funkcji przechowywanej z przygotowanym oświadczeniem, ale bez powodzenia.Używanie przechowywanej funkcji z API C i gotowymi instrukcjami
MySQL przygotowuje instrukcję, ale potem jej nie wykonuje, nie podano żadnego błędu, po prostu cicho zawiedzie.
Jest to funkcja *:
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 ;
To działa w wierszu polecenia zgodnie z oczekiwaniami, i zastępując ciężko kodowana dwukrotnie w SELECT następnie pozwala jej działać zgodnie z oczekiwaniami, więc otaczający kod jest w porządku także.
Mam włączone CLIENT_MULTI_STATEMENTS jako parametr połączenia MySQL, podejrzewam, że odnosi się on tylko do procedur CALLING, ale było to słowne, które warto było ściskać.
Stwierdzenie wytwarza się stosując:
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);
}
przestrzeganymi przez wymagane instrukcje wiążą parametrów i wyników, a następnie wykonywane przy użyciu:
if (mysql_stmt_execute(statement)) {
fprintf(stderr, "mysql_stmt_execute(), failed. Error:%s\n", mysql_stmt_error(statement));
}
Jak wspomniano wcześniej, jeśli działają w powyższym Instrukcja SELECT jest zamieniana na twardy float (np. SELECT 2.3 .....), a następnie zwraca zakodowany numer zgodnie z oczekiwaniami.
W rzeczywistości kod przygotowanego oświadczenia jest wstawiany za pomocą makr, istnieje wieleset instrukcji, które działają zgodnie z wymaganiami, więc składanie instrukcji, powiązanie lub wykonywanie nie jest problemem (a jeśli jest niepoprawny powyżej, to jest to moje tłumaczenie z niepoprawne makra), chyba że musi być inny w przypadku użycia z funkcjami.
Są to wpisy dziennika, gdy jedno z wejść jest związany jako wyjście:
Prepare SELECT ? FROM mytable
Execute SELECT 51.36000061035156 FROM mytable
IS wpis dziennika, gdy próbuję użyć funkcji:
Prepare SELECT lineDistanceC(latitude, longitude, ?, ?) FROM mytable;
Jak wspomniano powyżej , cicho zawiedzie bez wykonywania instrukcji, bez błędów w dzienniku lub w innym miejscu.
Wszelkie wskazówki będą mile widziane.
* Aby dać kredyt w którym jest należny, funkcja ta pochodzi od formuły here
Czy możesz podać przykład tego, jak to nazywasz? Zarówno gdy działa i nie działa? – ethrbunny
@ethrbunny Zaktualizowany zgodnie z wymaganiami – blankabout
Co otrzymasz, jeśli spróbujesz zwrócić niektóre z parametrów? (IE pomiń kod i po prostu sprawdź, czy twoje dane wejściowe są racjonalne) – ethrbunny