Một thủ tục được lưu trữ trong MySQL hoạt động như một phương thức được lưu trữ trong cơ sở dữ liệu. Nó có tên và chấp nhận một tập hợp các đối số và có thể được gọi thông qua câu lệnh
1
2
3
4
5
8. Trong bài đăng này, chúng tôi sẽ xem xét cách chúng tôi có thể xác định thủ tục được lưu trữ, cách các tham số và biến hoạt động và cuối cùng là cách chúng tôi có thể xác định các giao dịch và xử lý các ngoại lệ tương ứng- Tạo thủ tục lưu trữ
- Thông số
- Biến
- Giao dịch
Tạo thủ tục lưu trữ
Các thủ tục được lưu trữ trong MySQL có định dạng sau
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
1
2
3
4
5
9 theo sau với tên thủ tục và các tham số của nó. Phần thân của thủ tục được xác định trong câu lệnh ghép bắt đầu bằng CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
0 và kết thúc bằng CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
1. Một câu lệnh ghép cho phép chúng ta chỉ định nhiều câu lệnh sẽ được thực hiện theo thứ tự. Sau này chúng ta sẽ xem làm thế nào chúng ta có thể đảm bảo tính nguyên tử của thay đổi bằng cách sử dụng một giao dịchBởi vì chúng ta thêm thủ tục lưu sẵn bằng cách thực thi câu lệnh SQL, nên chúng ta phải thay đổi dấu phân cách, ban đầu là
CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
2 thành một thứ khác, ví dụ ở đây là CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
3 để các câu lệnh trong CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
4 có thể có dấu phân cách phù hợp. Cuối cùng, chúng tôi đặt lại dấu phân cách thành CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
2Thông số
Các tham số có thể được cung cấp cho một thủ tục, ví dụ
1
2
3
4
5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1Các tham số bắt đầu bằng chế độ tham số tùy chọn
CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
6 trong đó CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
7 chỉ định đầu vào giá trị. Đầu vào giá trị được sao chép trước khi vào quy trình, nếu tham số được sửa đổi trong quy trình, nó sẽ không được phản ánh ở phía người gọi. Ví dụ với thủ tục được lưu trữ sau1
2
3
4
5
CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
Nếu chúng ta gọi
CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
81
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
7____18Lựa chọn của
CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
9 sẽ vẫn trả về 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
70. Trái ngược với 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71 chỉ định tham số 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
711
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
7____18CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
9 ở đây sẽ là 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74. Tham số 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71 có giá trị là 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
76 khi nhập thủ tục được lưu trữCuối cùng,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
77 chỉ định một tham số nhận giá trị của nó được chuyển bởi người gọi và cho phép thủ tục được lưu trữ sửa đổi nó1
2
3
4
5
DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
1Sau đó gọi bằng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
741
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
7____23sẽ đặt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
79 trên CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
9CREATE PROCEDURE `mysproc`[IN pValue INT]
BEGIN
SET pValue = 10;
END
7 được sử dụng làm mặc định khi chế độ tham số không được cung cấpBiến
Trong ví dụ trước của chúng tôi khi gọi thủ tục được lưu trữ, chúng tôi đã sử dụng các biến do người dùng xác định với
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
82. Đối với thủ tục lưu sẵn, chúng ta có thể sử dụng 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
83 để khai báo các biến cục bộ. Chúng phải được xác định ở đầu trước, bất kỳ câu lệnh nào khácDELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
4DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
5Ví dụ ở đây, chúng tôi thực hiện hai lần chèn, lần chèn đầu tiên thêm khách hàng, trong khi lần chèn thứ hai chèn vào bảng địa chỉ. Lúc đầu, chúng tôi khai báo một biến cục bộ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
84, sau đó chúng tôi đặt thành 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
85 để sử dụng nó trong lần chèn tiếp theoGiá trị mặc định cũng có thể được thêm vào với
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
86 chẳng hạn như 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
87Giao dịch
Chúng tôi thấy rằng một thủ tục được lưu trữ có thể bao gồm nhiều câu lệnh [e. g.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
88, 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
89, 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
70, 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71]. Trong ví dụ trước của chúng tôi, nơi chúng tôi chèn khách hàng sau đó chèn địa chỉ, nếu xảy ra lỗi khi chèn địa chỉ, khách hàng sẽ vẫn được chèn. Để duy trì tính nguyên tử của hoạt động, chúng ta có thể sử dụng một giao dịchChúng tôi có thể xác định một giao dịch với
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
72 và sử dụng 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
73 hoặc 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
6DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
7
Chúng tôi bắt đầu giao dịch và hoàn thành giao dịch với
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
73 hoặc 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74Lưu ý rằng nếu chúng ta quên kết thúc giao dịch, sẽ có một giao dịch mở sau khi gọi thủ tục được lưu trữ. Ví dụ: nếu chúng tôi bắt đầu một giao dịch trong một thủ tục và không bao giờ hoàn thành nó
DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
8DELIMITER //
CREATE PROCEDURE insertcustomer [
pFirstName VARCHAR[255],
pLastName VARCHAR[255],
pAge INT
]
BEGIN
INSERT INTO Customer
[
FirstName,
LastName,
Age
]
VALUES
[
pFirstName,
pLastName,
pAge
];
END //
DELIMITER ;
9Sẽ có một giao dịch được mở mà chúng ta có thể thấy bằng cách gọi bảng giao dịch
1
2
3
4
5
01
2
3
4
5
1Điều này rất quan trọng vì bất kỳ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74 nào sau lệnh gọi của thủ tục sẽ khôi phục các thay đổi được thực hiện bên trong thủ tục này. Vì vậy, để hoàn thành một giao dịch, chúng tôi phải xử lý cả 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
73 và 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74Đối với
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74, chúng tôi xác định trình xử lý thoát bằng cách sử dụng 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
81 được sử dụng để thoát khỏi thủ tục được lưu trữ_______03
Bên trong trình xử lý, chúng tôi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74 giao dịch và sử dụng 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
83 để ném lại ngoại lệ. Nếu chúng tôi bỏ qua để từ chức ngoại lệ, thủ tục được lưu trữ sẽ trở lại thành côngVà điều đó kết thúc bài viết ngày hôm nay
Sự kết luận
Trong bài viết hôm nay, chúng ta đã xem xét cách tạo thủ tục lưu sẵn trong MySQL. Chúng tôi đã bắt đầu bằng cách xem cách quy trình được lưu trữ được định nghĩa bằng một ví dụ, sau đó chúng tôi chuyển sang xem cách các tham số được truyền vào một quy trình được lưu trữ và cách chúng tôi cũng có thể sử dụng các biến cục bộ bên trong một quy trình được lưu trữ. Và chúng tôi đã hoàn thành bài viết bằng cách xem xét các giao dịch. Tôi hy vọng bạn thích bài đăng này và hẹn gặp lại bạn ở bài tiếp theo
Chúng tôi có thể sử dụng giao dịch trong thủ tục được lưu trữ không?
Có, thủ tục được lưu trữ có thể chạy bên trong giao dịch .
Ví dụ về giao dịch trong MySQL là gì?
Một giao dịch là một nhóm tuần tự các hoạt động thao tác cơ sở dữ liệu, được thực hiện như thể nó là một đơn vị công việc duy nhất . Nói cách khác, một giao dịch sẽ không bao giờ hoàn thành trừ khi từng hoạt động riêng lẻ trong nhóm thành công.
Các giao dịch được xử lý trong MySQL như thế nào?
Một giao dịch trong MySQL bắt đầu với câu lệnh SQL thực thi đầu tiên và kết thúc khi tìm thấy một cam kết hoặc được khôi phục rõ ràng hoặc ngầm định . Nó sử dụng rõ ràng câu lệnh COMMIT hoặc ROLLBACK và ngầm định khi sử dụng câu lệnh DDL.
Chúng ta có thể sử dụng thủ tục được lưu trữ trong MySQL không?
Trong thực tế, các hàm được lưu trữ có xu hướng sử dụng các câu lệnh ghép, trừ khi phần thân bao gồm một câu lệnh RETURN duy nhất. MySQL cho phép các thường trình chứa các câu lệnh DDL, chẳng hạn như CREATE và DROP. MySQL cũng cho phép các thủ tục được lưu trữ [chứ không phải các hàm được lưu trữ] chứa các câu lệnh giao dịch SQL như CAM KẾT .