Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tạo một hàm MySQL tùy chỉnh?

Bạn khai báo hàm MySQL này trong ứng dụng của mình và nó sẽ vẫn còn trong cơ sở dữ liệu cho đến khi máy chủ cơ sở dữ liệu được khởi động lại.

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

Điều này sử dụng các hàm toán học của MySQL . Việc tải quá trình xử lý này xuống cơ sở dữ liệu nhanh chóng và hiệu quả (dữ liệu không phải di chuyển qua dây và bạn chỉ được trả về kết quả bạn muốn).

Khi bạn đã khai báo điều này, bạn có thể sử dụng nó như sau:

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

Tuy nhiên, nếu cơ sở dữ liệu của bạn khởi động lại, bất kỳ chức năng hoặc thủ tục nào đã khai báo trước đó sẽ bị mất. Có thể xử lý lỗi MySQL 1305 (Function functionName does not exist ) một cách duyên dáng ở cấp ứng dụng.

Trong trình xử lý lỗi cơ sở dữ liệu của bạn:

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. Mysql:thực thi lệnh bị từ chối đối với người dùng '' @ 'localhost' vì lỗi thông thường

  2. Giao điểm truy vấn với Activerecord

  3. Tạo thủ tục lưu trữ MySQL bằng JPA Hibernate

  4. Sự cố mã hóa bộ ký tự

  5. mysql chuyển đổi từ UTC sang IST