Trong MySQL, thủ tục lưu trữ là một nhóm các câu lệnh MySQL được thực thi cùng nhau khi bạn gọi thủ tục
Một thủ tục được lưu trữ có phần giống với một chức năng. Sự khác biệt chính là thủ tục được lưu trữ chỉ có thể được gọi bằng từ khóa CALL
, trong khi hàm có thể được đưa vào câu lệnh MySQL
Một hàm cần trả về một giá trị, nhưng một thủ tục chỉ thực thi các câu lệnh để thao tác với dữ liệu của bạn mà không trả về một giá trị nào
Hãy tìm hiểu cách bạn tạo và gọi một thủ tục được lưu trữ. Đầu tiên, tạo một bảng ví dụ có tên Cities
với câu lệnh sau
CREATE TABLE `Cities` [
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar[100],
PRIMARY KEY [`id`]
]
Để tạo thủ tục lưu trữ, bạn sử dụng câu lệnh
CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
0 theo sau với tên thủ tục như sauCREATE PROCEDURE getCities[]
SELECT * FROM Cities;
Đoạn mã SQL trên sẽ tạo một thủ tục
CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
1 truy xuất tất cả các hàng và cột của bảng Cities
Để gọi thủ tục, sử dụng từ khóa CALL
như hình bên dưới
CALL getCities[];
Bạn cũng có thể khai báo các tham số để truyền vào thủ tục trong khi gọi bằng cách thêm chúng vào dấu ngoặc đơn sau tên thủ tục
Ví dụ sau yêu cầu bạn chuyển một thủ tục
CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
4 cho thủ tục CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
5CREATE PROCEDURE insertCity[cityName VARCHAR[100]]
INSERT INTO `Cities` VALUES [NULL, cityName];
Sau đó, bạn có thể gọi thủ tục
CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
5 và chuyển đối số CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
4 như thế nàyCALL insertCity['York'];
Đối với thủ tục lưu trữ đơn giản chỉ có một dòng, bạn có thể viết ngay câu lệnh bên dưới câu lệnh
CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
0Nhưng nếu bạn có một thủ tục lưu trữ phức tạp với nhiều dòng, thì bạn cần thêm mệnh đề
CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
9 và câu lệnh ghép CALL getCities[];
0 vào cú pháp CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
0 của mìnhXem xét ví dụ sau
DELIMITER //
CREATE PROCEDURE insertCity[cityName VARCHAR[100]]
BEGIN
INSERT INTO `Cities` VALUES [NULL, cityName];
SELECT * FROM `Cities`;
END; //
Quy trình trên sẽ chèn một hàng mới vào bảng Cities
, sau đó lấy tất cả dữ liệu từ bảng dưới dạng đầu ra
Bởi vì thủ tục có nhiều hơn một câu lệnh, dấu phân cách được thay đổi từ dấu chấm phẩy mặc định
CALL getCities[];
3 thành dấu gạch chéo kép CALL getCities[];
4 bằng cách sử dụng từ khóa CREATE PROCEDURE getCities[]
SELECT * FROM Cities;
9Việc thay đổi ký hiệu dấu phân cách khiến MySQL xem xét toàn bộ các câu lệnh trên bên trong câu lệnh
CALL getCities[];
0Nếu không xác định ký hiệu dấu phân cách, MySQL sẽ diễn giải lần lượt từng câu lệnh phía trên, gây ra lỗi
Đây là kết quả của việc gọi thủ tục
CALL insertCity['Bristol'];
+----+----------+
| id | name |
+----+----------+
| 1 | York |
| 2 | Bristol |
+----+----------+
Và đó là cách hoạt động của thủ tục lưu trữ MySQL. Bạn có thể thêm bất kỳ câu lệnh MySQL hợp lệ nào bên trong quy trình và chạy chúng cùng nhau bằng cách sử dụng câu lệnh CALL
Bằng cách lưu trữ các câu lệnh của bạn bên trong một thủ tục, bạn có thể thực hiện các câu lệnh bao nhiêu lần tùy ý mà không cần phải viết chúng trong dòng lệnh
Cuối cùng, để loại bỏ một thủ tục lưu sẵn, bạn có thể sử dụng câu lệnh
CALL getCities[];
8 như sauDROP PROCEDURE IF EXISTS insertCity;
Mệnh đề
CALL getCities[];
9 được thêm vào để ngăn MySQL đưa ra lỗi khi thủ tục không tồn tại