Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen einer benutzerdefinierten MySQL-Funktion?

Sie können diese MySQL-Funktion in Ihrer Anwendung deklarieren und sie bleibt in der Datenbank, bis der Datenbankserver neu gestartet wird.

mysql_query("CREATE FUNCTION Distance(LAT_A INT, LON_A INT, LAT_B INT, LON_B INT, )
RETURNS INT
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE radius, deltaLat, deltaLon, result, distance BIGINT;
SET radius=3956;
SET deltaLat=LAT_B-LAT_A;
SET deltaLon=LON_B-LON_A;
SET result=POW(SIN(deltaLat/2), 2) + (COS(LAT_A) * COS(LAT_B) * POW(SIN(deltaLon/2.0), 2));
SET distance=radius * 2 * ATAN2(SQRT(result), SQRT(1 - result));
RETURN distance;
END");

Dies verwendet die mathematischen Funktionen von MySQL . Das Auslagern dieser Verarbeitung in die Datenbank ist schnell und effizient (die Daten müssen nicht über die Leitung übertragen werden und Sie erhalten nur die gewünschten Ergebnisse).

Sobald Sie dies deklariert haben, können Sie es wie folgt verwenden:

$query = "SELECT lat, lon FROM zipcodes WHERE Distance(lat, lon, 0, 0) < 20";
mysql_query($query);

Wenn Ihre Datenbank jedoch neu gestartet wird, gehen alle zuvor deklarierten Funktionen oder Prozeduren verloren. Es ist möglich, den MySQL-Fehler 1305 (Function functionName does not exist ) elegant auf Anwendungsebene.

In Ihrer Datenbank-Fehlerbehandlung:

switch (mysql_errno()):
    case 1305:
        if (false === $database->_declareStoredProcedureFlag) {
             if ($c = preg_match_all("/FUNCTION [a-zA-Z0-9]+\." .
                 "([a-zA-Z0-9_]*) does not exist/is",
                 mysql_error(), $matches)
             ) {
                 $storedFunctionName = $matches[1][0];
                 $database->_declareStoredProcedureFlag = true;
                 if (true === $database->declareStoredFunction($storedFunctionName)) {
                     $result = mysql_query($query);
                 }
             }
         }
         break;
    ...