Không thể trả về bảng từ hàm (FUNCTION) MySQL. Function chỉ trả về giá trị vô hướng: string, integer, decimal, v.v. Để trả về tập kết quả (result set), hãy dùng Stored Procedure.
Tạo bảng demo
mysql> create table DemoTable696 (
Id int,
Name varchar(100)
);
Query OK, 0 rows affected (0.77 sec)
Chèn dữ liệu
mysql> insert into DemoTable696 values(100, 'Mike'); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable696 values(101, 'Sam'); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable696 values(102, 'Adam'); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable696 values(103, 'Carol'); Query OK, 1 row affected (0.20 sec)
Hiển thị dữ liệu
mysql> select * from DemoTable696;
Kết quả
+------+-------+ | Id | Name | +------+-------+ | 100 | Mike | | 101 | Sam | | 102 | Adam | | 103 | Carol | +------+-------+ 4 rows in set (0.00 sec)
Tạo Stored Procedure trả về result set
mysql> DELIMITER //
mysql> CREATE PROCEDURE getResultSet(IN studId INT)
-> BEGIN
-> SELECT * FROM DemoTable696 WHERE Id = studId;
-> END
-> //
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;
Gọi Procedure
mysql> call getResultSet(103);
Kết quả - Trả về bảng (result set)
+------+-------+ | Id | Name | +------+-------+ | 103 | Carol | +------+-------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
So sánh Function vs Procedure:
| Đặc điểm | FUNCTION | PROCEDURE |
|---|---|---|
| Trả về | Giá trị đơn (scalar) | Result set (bảng) hoặc OUT params |
| Gọi trong SELECT | Được: SELECT func() | Không (gọi bằng CALL proc()) |
| DML (INSERT/UPDATE) | Không cho phép | Cho phép |
| Transaction | Không | Có |
Kết luận: Cần trả về bảng → dùng Stored Procedure.