Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tworzysz niestandardową funkcję MySQL?

Deklarujesz tę funkcję MySQL w swojej aplikacji i pozostanie ona w bazie danych do momentu ponownego uruchomienia serwera bazy danych.

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");

Wykorzystuje to funkcje matematyczne MySQL . Przeniesienie tego przetwarzania do bazy danych jest szybkie i wydajne (dane nie muszą być przesyłane przewodem, a zwracane są tylko żądane wyniki).

Po zadeklarowaniu tego możesz go używać w następujący sposób:

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

Jeśli jednak baza danych zostanie zrestartowana, wszystkie zadeklarowane wcześniej funkcje lub procedury zostaną utracone. Możliwe jest obsłużenie błędu MySQL 1305 (Function functionName does not exist ) wdzięcznie na poziomie aplikacji.

W programie obsługi błędów bazy danych:

Przełącznik
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;
    ...


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wymusić unikatowość w MySQL?

  2. Jak zaktualizować kaskadowo w MySQL?

  3. Co może zrobić funkcja agregująca w klauzuli ORDER BY?

  4. Czy istnieją wady używania ogólnego varchar(255) dla wszystkich pól tekstowych?

  5. Zapytanie MySql do pobrania wartości atrybutu elementu xml