Tạo Stored Function
Function trả về giá trị đơn (scalar), dùng được trong SELECT, WHERE, ORDER BY.
Ví dụ
Tạo bảng:
CREATE TABLE DemoTable638 (Name VARCHAR(100), Marks INT);
INSERT INTO DemoTable638 VALUES
('John', 67), ('John', 90), ('David', 99), ('John', 60);
Tạo function tính trung bình Marks của 'John':
SET GLOBAL log_bin_trust_function_creators = 1; -- Cần cho replication
DELIMITER //
CREATE FUNCTION getAverageDemo()
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE value INT;
SELECT AVG(Marks) INTO value
FROM DemoTable638
WHERE Name = 'John';
RETURN value;
END //
DELIMITER ;
Gọi function:
SELECT getAverageDemo();
Kết quả: 72 (AVG của 67, 90, 60 = 217/3 = 72.33 → INT truncate).
Giải thích các từ khóa
RETURNS INT: Kiểu trả về.DETERMINISTIC: Cùng input → cùng output (cho phép caching, replication safe).DECLARE value INT: Biến local.SELECT ... INTO value: Gán kết quả query vào biến (phải trả về 1 dòng 1 cột).RETURN value: Trả về kết quả.
Cải tiến: Function có tham số
CREATE FUNCTION getAverageByName(p_name VARCHAR(100))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE avg_val DECIMAL(10,2);
SELECT AVG(Marks) INTO avg_val
FROM DemoTable638
WHERE Name = p_name;
RETURN COALESCE(avg_val, 0);
END;
Sử dụng:
SELECT getAverageByName('John'); -- 72.33
SELECT getAverageByName('David'); -- 99.00
SELECT getAverageByName('Unknown'); -- 0
Function vs Procedure
| Đặc điểm | FUNCTION | PROCEDURE |
|---|---|---|
| Trả về | 1 giá trị (RETURN) | 0 hoặc nhiều result set (OUT params) |
| Gọi từ | SELECT, WHERE, ORDER BY | CALL statement |
| DML (INSERT/UPDATE) | Không cho phép (thường) | Cho phép |
| Transaction | Không | Có |
Lưu ý
log_bin_trust_function_creators=1cần cho binary logging + replication.- Function nên
DETERMINISTIChoặcREADS SQL DATA/NO SQL. - Tránh logic phức tạp, side-effect trong function.