Nếu bạn đã từng muốn tìm hiểu cách viết con trỏ MySQL hoặc vòng lặp MySQL, bạn đã đến đúng nơi. Hãy lặp đi lặp lại
một năm trước • 4 phút đọc
Mục lục
Nếu bạn đã từng muốn tìm hiểu cách viết con trỏ MySQL hoặc vòng lặp MySQL, bạn đã đến đúng nơi. Hãy lặp đi lặp lại
Xem xét các vòng lặp trong lập trình chung. Chúng giúp bạn thực hiện lặp đi lặp lại một chuỗi lệnh cụ thể cho đến khi một điều kiện cụ thể phá vỡ vòng lặp. MySQL cũng cung cấp một cách để thực hiện các lệnh trên các hàng riêng lẻ bằng cách sử dụng con trỏ. Các con trỏ trong MySQL sẽ thực thi một tập hợp các hướng dẫn trên các hàng được trả về từ các truy vấn SQL
Thuộc tính của con trỏ MySQL
- Không thể cuộn. Bạn chỉ có thể lặp qua các hàng theo một hướng. Bạn không thể bỏ qua một hàng;
- Chỉ đọc. Bạn không thể cập nhật hoặc xóa hàng bằng con trỏ
- nhạy cảm. Con trỏ MySQL trỏ đến dữ liệu cơ bản. Nó chạy nhanh hơn một con trỏ không nhạy. Con trỏ không nhạy trỏ đến ảnh chụp nhanh của dữ liệu cơ bản, làm cho dữ liệu chậm hơn so với con trỏ không nhạy
Để tạo một con trỏ MySQL, bạn sẽ cần làm việc với các câu lệnh
DECLARE CURSOR FOR
0, DECLARE CURSOR FOR
1, DECLARE CURSOR FOR
2 và DECLARE CURSOR FOR
3Tuyên bố tuyên bố
Câu lệnh
DECLARE CURSOR FOR
0 có thể khai báo biến, con trỏ và trình xử lý. Có một chuỗi các khai báo cần được tuân thủ- Biến
- con trỏ
- xử lý
Trước tiên, bạn phải khai báo ít nhất một biến để sử dụng sau này với câu lệnh
DECLARE CURSOR FOR
2 sau nàyDECLARE
Khai báo một biếnKhi khai báo [các] con trỏ phải kèm theo câu lệnh
DECLARE CURSOR FOR
6. Bất kỳ câu lệnh DECLARE CURSOR FOR
6 hợp lệ nào cũng sẽ hoạt động. Bạn cũng phải khai báo ít nhất một con trỏDECLARE CURSOR FOR
Khai báo con trỏ cho câu lệnh DECLARE CURSOR FOR
6Bạn cũng phải khai báo một trình xử lý
DECLARE CURSOR FOR
9. Khi con trỏ lặp lại và đến hàng cuối cùng, nó sẽ đưa ra một điều kiện sẽ được xử lý bằng trình xử lý DECLARE CURSOR FOR
9. Bạn cũng có thể khai báo các trình xử lý khác tùy theo nhu cầu của bạn. Ví dụDECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
Sử dụng trình xử lý DECLARE CURSOR FOR
9Tuyên bố mở
Câu lệnh
DECLARE CURSOR FOR
1 khởi tạo kết quả từ câu lệnh con trỏ DECLARE CURSOR FOR
0OPEN
Cú pháp câu lệnh DECLARE CURSOR FOR
1Tuyên bố tìm nạp
Câu lệnh
DECLARE CURSOR FOR
2 hoạt động như một trình vòng lặp. Nó tìm nạp hàng tiếp theo từ các hàng được liên kết với câu lệnh DECLARE CURSOR FOR
6 trong phần khai báo con trỏFETCH INTO
Cú pháp câu lệnh DECLARE CURSOR FOR
2DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
8 là một hoặc nhiều biến từ các biến đã khai báo trước đóFETCH INTO a, b, c
Danh sách biến ví dụNếu hàng tiếp theo tồn tại, các biến sẽ lưu trữ nó; . Bạn có thể sử dụng trình xử lý NOT FOUND để xử lý SQLSTATE này
Tuyên bố Đóng
Câu lệnh này đóng con trỏ được mở trong câu lệnh `OPEN`
CLOSE
Cú pháp câu lệnh DECLARE CURSOR FOR
3Sử dụng con trỏ MySQLSẵn sàng để bắt đầu sử dụng con trỏ MySQL? . Trong bản trình diễn này, chúng tôi sẽ điền vào một bảng có dữ liệu từ tệp CSV này
Chúng ta sẽ tạo một con trỏ
- Vòng qua bàn bóng đá
- Tính số bàn thắng trung bình mà một đội chủ nhà đã thắng trong một trận đấu được ghi vào giờ nghỉ giải lao
Đây là quy trình MySQL sẽ như thế nào để thực hiện điều này
Thủ tục MySQL
DELIMITER $$ CREATE PROCEDURE cursordemo[INOUT average_goals FLOAT]
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE matches int DEFAULT[0];
DECLARE goals int DEFAULT[0];
DECLARE half_time_goals INT;
DECLARE team_cursor CURSOR FOR
SELECT
HTHG
FROM
epl.football
WHERE
[FTR = "H"];
DECLARE
CONTINUE HANDLER FOR NOT FOUND
SET
done = TRUE;
OPEN team_cursor;
teams_loop:
LOOP
FETCH team_cursor INTO half_time_goals;
IF done THEN LEAVE teams_loop;
END IF;
SET
goals = goals + half_time_goals;
SET
matches = matches + 1;
END
LOOP
teams_loop;
SET
average_goals = goals / matches;
CLOSE team_cursor;
END $$ DELIMITER;
Thủ tục MySQLMột thủ tục trong MySQL giống như một thùng chứa một chuỗi các hướng dẫn. Các thủ tục được viết bằng MySQL và được lưu trữ trong cơ sở dữ liệu. Chúng tôi đang xác định con trỏ bên trong một thủ tục vì các thủ tục có thể tái sử dụng. Việc thực thi thủ tục SQL trên sẽ lưu trữ thủ tục trong cơ sở dữ liệu. Chúng ta có thể gọi thủ tục bằng tên của nó, như hình bên dưới
SET @average_goals = 0.0;
CALL cursordemo[@average_goals];
SELECT @average_goals;
Thực hiện thủ tục chúng tôi vừa tạoĐầu ra của hoạt động này là
1.080954670906067
Nhìn kỹ vào ví dụ sẽ thấy rằng một truy vấn SQL như
OPEN
0 sẽ đạt được kết quả tương tự. Sẽ là tốt nhất nếu bạn chỉ sử dụng con trỏ khi xử lý một hàng tại một thời điểm. Ví dụ là kiểm tra tính toàn vẹn, xây dựng lại chỉ mục. Lưu ý rằng mỗi khi con trỏ tìm nạp một hàng, nó sẽ dẫn đến các chuyến đi vòng quanh mạng. Vì vậy, nó có thể làm chậm máy chủ MySQL của bạn tùy thuộc vào quy mô của hoạt độngPhần kết luậnTrong bài viết này, chúng ta đã thấy cách sử dụng con trỏ MySQL và vòng lặp for, có chức năng giống như vòng lặp lặp trong lập trình nói chung. Chúng tôi cũng đề cập đến khai báo biến, con trỏ và trình xử lý
Sử dụng con trỏ có thể tốn kém về mặt tính toán. Tốt nhất là chỉ sử dụng chúng khi MySQL không cung cấp bất kỳ cách nào khác để đạt được kết quả tương tự bằng cách sử dụng các truy vấn tiêu chuẩn hoặc các hàm do người dùng xác định. Nhưng, nếu đúng như vậy, chúng là những công cụ rất mạnh
Bạn đã sẵn sàng để thử con trỏ cho chính mình chưa?