Các thủ tục được lưu trữ là các câu lệnh SQL do người dùng định nghĩa được lưu trữ trong cơ sở dữ liệu MySQL và được thực thi theo yêu cầu để thực hiện một hoạt động cơ sở dữ liệu cụ thể. Các chương trình con được xác định trước này giúp chuyển logic nghiệp vụ sang cơ sở dữ liệu, mang lại một số lợi ích:
- Các chuyến đi khứ hồi do một ứng dụng thực hiện đến máy chủ cơ sở dữ liệu được giảm thiểu.
- Khả năng bảo trì mã được nâng cao, vì các ứng dụng khác nhau có thể chia sẻ quy trình được lưu trữ.
- Hiệu suất cơ sở dữ liệu được cải thiện vì các thủ tục được lưu trữ được biên dịch một lần và được thực thi rất nhanh chóng và hiệu quả.
Trong hướng dẫn này, bạn sẽ:
-
Tìm hiểu cú pháp để tạo các thủ tục được lưu trữ và khai báo thủ tục đầu tiên của bạn.
-
Thực hiện quy trình mẫu sau khi bạn đã khai báo.
-
Tìm hiểu cách xóa thủ tục khi bạn không cần nữa.
Trước khi bạn bắt đầu
Đảm bảo bạn có những thứ sau:
-
Nếu bạn chưa làm như vậy, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo phiên bản Máy tính của chúng tôi.
-
Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Máy tính của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, định cấu hình tên máy chủ của mình, tạo tài khoản người dùng hạn chế và tăng cường quyền truy cập SSH.
-
Máy chủ và máy khách MySQL được cài đặt trên máy chủ Linode. Hướng dẫn cài đặt cho MySQL có sẵn cho các bản phân phối khác nhau trong phần MySQL của chúng tôi.
Chuẩn bị Cơ sở dữ liệu
Bạn sẽ bắt đầu bằng cách tạo cơ sở dữ liệu mẫu, bảng và người dùng để truy cập cơ sở dữ liệu. Bạn cũng sẽ điền vào bảng dữ liệu mẫu cho mục đích thử nghiệm.
Tạo Cơ sở dữ liệu, Bảng và Người dùng
-
Đăng nhập vào máy chủ MySQL:
mysql -u root -p
Bạn sẽ được nhắc nhập mật khẩu gốc của cơ sở dữ liệu MySQL của mình. Sau đó, nhấn Enter để tiếp tục.
-
Tiếp theo, bạn sẽ thấy một lời nhắc MySQL tương tự như lời nhắc bên dưới.
mysql >
-
Nhập lệnh bên dưới để tạo
test_db
cơ sở dữ liệu:CREATE DATABASE test_db;
Đầu ra:
Query OK, 1 row affected (0.01 sec)
-
Tạo người dùng cơ sở dữ liệu và cấp toàn quyền truy cập vào
test_db
cơ sở dữ liệu. Thay thếPASSWORD
với một giá trị phức tạp và duy nhất tuân theo các nguyên tắc dành cho mật khẩu MySQL:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Đầu ra:
Query OK, 1 row affected (0.01 sec)
-
Cấp cho
test_user
các đặc quyền đầy đủ đối vớitest_db
cơ sở dữ liệu;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Đầu ra:
Query OK, 1 row affected (0.01 sec)
-
Đặc quyền tuôn ra:
FLUSH PRIVILEGES;
Đầu ra:
Query OK, 0 rows affected (0.01 sec)
Điền vào Cơ sở dữ liệu
-
Tiếp theo, chuyển sang cơ sở dữ liệu test_db:
USE test_db;
Đầu ra:
Database changed
-
Tạo một
products
bảng lưu hồ sơ mẫu:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Đầu ra:
Query OK, 0 rows affected (0.01 sec)
-
Giờ đây, bạn có thể thêm một vài sản phẩm vào bảng sản phẩm bằng cách thực hiện từng lệnh bên dưới:
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
Bạn sẽ nhận được đầu ra bên dưới sau khi thực hiện mỗi
Insert
tuyên bố:Query OK, 1 row affected (0.00 sec)
-
Kế tiếp. xác nhận xem sản phẩm mẫu đã được chèn thành công vào cơ sở dữ liệu hay chưa bằng cách chạy
Select
lệnh bên dưới:SELECT * FROM products;
Các sản phẩm mẫu của bạn sẽ được liệt kê như hình dưới đây:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec)
-
Thoát khỏi máy chủ MySQL.
QUIT;
Đầu ra:
Bye!
-
Khi bạn đã tạo
test_db
cơ sở dữ liệu,products
bảng, mộttest_user
và đã thêm một số sản phẩm mẫu, bây giờ bạn có thể chuyển sang tạo quy trình được lưu trữ đầu tiên.
Tạo một thủ tục đã lưu trữ
Cú pháp Thủ tục Đã Lưu trữ
Cú pháp cơ bản của việc tạo một thủ tục được lưu trữ trong cơ sở dữ liệu MySQL được hiển thị bên dưới:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
DELIMITER &&
ở đầu dòng cho máy chủ MySQL xử lý các câu lệnh SQL sau đây như một câu lệnh duy nhất, thay vì thực thi chúng riêng lẻ.&&
khác được đưa vào một dòng sau đó để đánh dấu phần cuối của tuyên bố này. -
PROCEDURE_NAME
là nơi khai báo tên của thủ tục đã lưu trữ của bạn. -
Tên thủ tục được theo sau bởi một tập hợp các dấu ngoặc đơn và chúng bao gồm các tham số cho thủ tục của bạn. Các thủ tục được lưu trữ hỗ trợ các tham số được phân tách bằng dấu phẩy và tính năng này làm cho chúng linh hoạt hơn. Xem phần tham số để biết thêm chi tiết.
-
BEGIN...END
các lệnh bao gồm câu lệnh SQL mà bạn muốn được thực thi bằng thủ tục được lưu trữ. -
Cuối cùng, câu lệnh
DELIMITER ;
được cấp lại để thay đổi dấu phân cách trở lại giá trị mặc định của;
Các Tham số Thủ tục Đã Lưu trữ
Mỗi tham số cho một thủ tục có một kiểu, tên và kiểu dữ liệu, được phân tách bằng dấu cách:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Ví dụ:để tạo một tham số kiểu IN
, được đặt tên là category
, với VARCHAR
loại dữ liệu có độ dài 50 ký tự, sử dụng cú pháp này:
IN category VARCHAR(50)
MySQL hỗ trợ ba loại tham số:
-
IN
:Giá trị của tham số phải được chỉ định bởi ứng dụng khách đang gọi. Không thể thay đổi giá trị này bằng quy trình được lưu trữ .Ví dụ:nếu bạn chuyển biến phiên aMySQL dưới dạng
IN
tham số cho một thủ tục và thủ tục sửa đổi giá trị này trong các câu lệnh của nó, biến phiên của bạn sẽ vẫn không được sửa đổi sau khi thủ tục thoát. -
OUT
:Loại tham số này cũng được chỉ định bởi chương trình gọi, nhưng giá trị của nó có thể được thay đổi bởi thủ tục được lưu trữ và được chương trình gọi truy xuất.Lưu ý rằng thủ tục được lưu trữ không thể truy cập giá trị ban đầu của một biến được chuyển dưới dạng
OUT
tham số. -
INOUT
:Một tham số kiểu này kết hợp các hành vi củaIN
vàOUT
thông số:-
Thủ tục được lưu trữ có thể đọc giá trị ban đầu của tham số.
-
Tham số có thể được thay đổi trong quá trình thực thi thủ tục được lưu trữ.
-
Giá trị đã thay đổi có thể được trả lại cho chương trình gọi, nếu chương trình gọi đã chuyển một biến làm tham số.
-
Ví dụ về Thủ tục được Lưu trữ
Sau khi hiểu cú pháp cơ bản, hãy tạo một quy trình đơn giản được lưu trữ để lọc sản phẩm theo tên danh mục. Tên danh mục sẽ được cung cấp dưới dạng IN
tham số.
-
Đăng nhập vào máy chủ MySQL bằng
test_user
Thông tin đăng nhập mà bạn đã tạo khi chuẩn bị cơ sở dữ liệu:mysql -u test_user -p
-
Nhập mật khẩu của
test_user
và nhấn Enter để tiếp tục. -
Bạn sẽ nhận được một
mysql >
lời nhắc. Tiếp tục bằng cách chọntest_db
:USE test_db;
Đầu ra:
Database changed.
-
Sau đó, nhập các lệnh SQL bên dưới để tạo
filter_by_category
thủ tục được lưu trữ:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Đầu ra:
Query OK, 0 rows affected (0.00 sec)
-
Thay đổi
DELIMITER
quay lại;
DELIMITER ;
-
Nếu mã để tạo thủ tục được lưu trữ chạy thành công, bây giờ bạn có thể chuyển sang thực thi thủ tục đã lưu trữ.
Thực thi một thủ tục đã lưu trữ
Trong bước này, chúng ta sẽ gọi thủ tục được lưu trữ mà chúng ta đã tạo ở trên. Chúng ta sẽ thực hiện theo cú pháp cơ bản sau:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Để thực thi
filter_by_category
thủ tục được lưu trữ mà chúng tôi đã tạo ở trên, hãy nhập lệnh bên dưới:CALL filter_by_category('COMPUTER ACCESSORIES');
Quy trình được lưu trữ bây giờ sẽ xuất ra tất cả các sản phẩm trong
COMPUTER ACCESSORIES
danh mục vì chúng tôi đã chỉ địnhCOMPUTER ACCESSORIES
dưới dạng một tham số:+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
-
Tương tự, bạn có thể truy xuất danh sách tất cả các sản phẩm từ
ELECTRONICS
phân loại bằng cách thực hiện lệnh bên dưới.CALL filter_by_category('ELECTRONICS') ;
Đầu ra:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Thủ tục được lưu trữ của chúng tôi đã hoạt động như chúng tôi mong đợi. Tiếp theo, chúng ta sẽ tìm hiểu cách loại bỏ các thủ tục đã lưu trữ nếu chúng ta không muốn chúng thực thi nữa.
Xóa thủ tục đã lưu trữ
Bạn có thể xóa một thủ tục được lưu trữ trong MySQL nếu bạn không muốn sử dụng nó nữa hoặc nếu bạn muốn tạo lại nó từ đầu. Cú pháp cơ bản để loại bỏ quy trình đã lưu trữ được hiển thị bên dưới:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Ví dụ:để xóa filter_by_category
của chúng tôi thủ tục được lưu trữ, thực hiện lệnh MySQL bên dưới:
DROP PROCEDURE IF EXISTS filter_by_category;
Nếu thủ tục được lưu trữ tồn tại, bạn sẽ nhận được kết quả hiển thị bên dưới:
Query OK, 0 rows affected (0.00 sec)
Đó là tất cả khi nói đến việc tạo, sử dụng và hủy bỏ các thủ tục được lưu trữ trong MySQL.
Thông tin khác
Bạn có thể muốn tham khảo các nguồn sau đây để biết thêm thông tin về chủ đề này. Mặc dù những điều này được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài.
- Làm việc với các thủ tục được lưu trữ trong MySQL