Mysql
 sql >> база данни >  >> RDS >> Mysql

Създаване на персонализирана MySQL функция?

Вие декларирате тази MySQL функция във вашето приложение и тя ще остане в базата данни, докато сървърът на базата данни не бъде рестартиран.

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

Това използва математически функции на MySQL . Разтоварването на тази обработка в базата данни е бързо и ефективно (данните не трябва да се движат по кабела и вие получавате само резултатите, които искате).

След като декларирате това, можете да го използвате по следния начин:

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

Въпреки това, ако вашата база данни се рестартира, всички функции или процедури, декларирани по-рано, се губят. Възможно е да се обработва MySQL грешка 1305 (Function functionName does not exist ) изящно на ниво приложение.

В манипулатора на грешки в базата данни:

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. Създайте заявка, за да получите групата на незавършените обаждания по 2 полета

  2. Има ли MySQL, еквивалентен на типа набор на Python?

  3. как да извлека mysql данни във vb.net?

  4. LIMIT OFFSET,LENGTH изисква ли ORDER BY за пагинация?

  5. Последици върху производителността на MySQL планирането на събития