Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách tạo function (hàm) đơn giản trong MySQL


Cú pháp tạo FUNCTION

DELIMITER // 
DROP FUNCTION IF EXISTS ten_ham; 
CREATE FUNCTION ten_ham(tham_so1 KIEU, ...) RETURNS kieu_tra_ve 
BEGIN 
    -- Khai báo biến
    DECLARE ten_bien KIEU DEFAULT gia_tri_mac_dinh; 
    -- Logic xử lý
    SELECT cot INTO ten_bien FROM ten_bang WHERE dieu_kien; 
    RETURN ten_bien; 
END // 
DELIMITER ;

Ví dụ: Function tìm tên theo ID

1. Tạo bảng mẫu

mysql> CREATE TABLE ViewDemo ( 
-> Id INT, 
-> Name VARCHAR(200), 
-> Age INT 
-> ); 
Query OK, 0 rows affected (0.58 sec)

mysql> INSERT INTO ViewDemo VALUES(1,'John',23); 
Query OK, 1 row affected (0.15 sec) 
mysql> INSERT INTO ViewDemo VALUES(2,'Sam',24); 
Query OK, 1 row affected (0.15 sec)

2. Tạo function

mysql> SET GLOBAL log_bin_trust_function_creators = 1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP FUNCTION IF EXISTS searchRecord; 
Query OK, 0 rows affected (0.21 sec) 

mysql> CREATE FUNCTION searchRecord(yourId INT) RETURNS CHAR(100) 
-> BEGIN 
-> DECLARE Name1 CHAR(100) DEFAULT "No Name Found For This Id"; 
-> SELECT Name INTO Name1 FROM ViewDemo WHERE Id = yourId; 
-> RETURN Name1; 
-> END // 
Query OK, 0 rows affected (0.33 sec) 

mysql> DELIMITER ;

3. Test function

Trường hợp 1: ID tồn tại (2)

mysql> SELECT searchRecord(2) AS Found;
+-------+ 
| Found | 
+-------+ 
| Sam   | 
+-------+ 
1 row in set (0.00 sec)

Trường hợp 2: ID không tồn tại (100)

mysql> SELECT searchRecord(100) AS Found;
+---------------------------+ 
| Found                     | 
+---------------------------+ 
| No Name Found For This Id | 
+---------------------------+ 
1 row in set (0.00 sec)

Giải thích các thành phần

Thành phầnMô tả
DELIMITER //Đổi dấu kết thúc câu lệnh để định nghĩa function
DROP FUNCTION IF EXISTSXóa function cũ nếu có (tránh lỗi)
RETURNS CHAR(100)Kiểu dữ liệu trả về
DECLARE ... DEFAULTKhai báo biến cục bộ với giá trị mặc định
SELECT ... INTOGán kết quả truy vấn vào biến
RETURNTrả về giá trị cho caller
log_bin_trust_function_creatorsBật cho phép tạo function khi binlog bật

Function có nhiều tham số

CREATE FUNCTION calculate_price(base_price DECIMAL(10,2), discount_pct INT, tax_pct INT) 
RETURNS DECIMAL(10,2) 
DETERMINISTIC 
BEGIN 
    DECLARE final_price DECIMAL(10,2); 
    SET final_price = base_price * (1 - discount_pct/100) * (1 + tax_pct/100); 
    RETURN ROUND(final_price, 2); 
END;

Function attributes (QUAN TRỌNG)

CREATE FUNCTION ten_ham(...) RETURNS ... 
    DETERMINISTIC         -- Cùng input → cùng output (cho phép cache, replication an toàn)
    | NOT DETERMINISTIC   -- Mặc định
    READS SQL DATA        -- Chỉ đọc dữ liệu
    | MODIFIES SQL DATA   -- Sửa dữ liệu (INSERT/UPDATE/DELETE)
    | NO SQL              -- Không truy cập bảng
    | CONTAINS SQL        -- Chỉ xử lý biến, không đọc/ghi bảng
    SQL SECURITY DEFINER  -- Chạy với quyền của người tạo (mặc định)
    | SQL SECURITY INVOKER -- Chạy với quyền của người gọi
BEGIN ... END

Lưu ý

  • Function không được trả về result set (chỉ 1 giá trị scalar)
  • Không dùng transaction trong function
  • MySQL 8.0: Cần set log_bin_trust_function_creators = 1 nếu bật binlog
  • Function deterministic giúp optimizer cache kết quả
  • Xem function: SHOW CREATE FUNCTION ten_ham