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ần | Mô tả |
|---|---|
| DELIMITER // | Đổi dấu kết thúc câu lệnh để định nghĩa function |
| DROP FUNCTION IF EXISTS | Xóa function cũ nếu có (tránh lỗi) |
| RETURNS CHAR(100) | Kiểu dữ liệu trả về |
| DECLARE ... DEFAULT | Khai báo biến cục bộ với giá trị mặc định |
| SELECT ... INTO | Gán kết quả truy vấn vào biến |
| RETURN | Trả về giá trị cho caller |
| log_bin_trust_function_creators | Bậ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 = 1nếu bật binlog - Function deterministic giúp optimizer cache kết quả
- Xem function:
SHOW CREATE FUNCTION ten_ham