Trong hầu hết các trường hợp, khi thực hiện các truy vấn SQL bằng cách sử dụng MySQL shell hoặc MySQL workbench, chúng tôi không lưu kết quả, mặc dù chúng tôi có chức năng lưu kết quả do máy chủ xử lý bằng quy trình được lưu trữ
Trong hướng dẫn này, tôi sẽ không thảo luận về các thủ tục, chức năng hoặc trình kích hoạt được lưu trữ. Thay vào đó, tôi sẽ chỉ đi sâu vào việc chỉ cho bạn cách bạn có thể sử dụng các con trỏ MySQL để chạy các kết quả trong các thủ tục được lưu trữ
Trước khi bắt đầu tạo và sử dụng con trỏ với các ví dụ, chúng ta hãy dành một chút thời gian để thảo luận về một số điểm chính về con trỏ mà bạn nên biết
Các tính năng của một con trỏ MySQL
- Con trỏ ở chế độ chỉ đọc và không thể cập nhật hoặc xóa dữ liệu trong tập kết quả khỏi quy trình
- Một con trỏ cần được khai báo trước khi nó có thể được sử dụng. Định nghĩa con trỏ chỉ là một bước để nói với MySQL rằng một con trỏ như vậy tồn tại và không truy xuất và dữ liệu
- Bạn chỉ có thể truy xuất dữ liệu theo thứ tự được chỉ định bởi câu lệnh chọn và không theo bất kỳ thứ tự đảo ngược nào, thường được gọi là không thể cuộn
- Bạn sử dụng một con trỏ bằng cách mở nó và sau đó thực hiện các thao tác tìm nạp trên dữ liệu được lưu trữ
- Bạn phải đóng con trỏ sau khi thao tác tìm nạp hoàn tất
Bây giờ chúng ta đã biết ý nghĩa của con trỏ, chúng ta có thể bắt đầu minh họa cách nó hoạt động bằng các ví dụ thực tế
Sử dụng cơ bản
Cú pháp chung để khai báo con trỏ trong MySQL rất đơn giản. Chúng tôi bắt đầu bằng cách sử dụng từ khóa KHAI THÁC như được hiển thị trong truy vấn mẫu bên dưới
Cách khai báo con trỏ
KHAI BÁO tên_con trỏ CON TRỎ CHO SELECT_expression;
Tên_con_trỏ là tên đặt cho con trỏ khi khai báo. Lưu ý rằng việc khai báo con trỏ phải sau bất kỳ biến nào được khai báo để ngăn MySQL dẫn đến lỗi
Tiếp theo là biểu thức SELECT, lưu câu lệnh SELECT liên kết với con trỏ
Làm thế nào để mở một con trỏ
Khi chúng tôi đã khai báo một con trỏ và MySQL biết rằng con trỏ tồn tại, chúng tôi có thể bắt đầu sử dụng nó, yêu cầu phải mở con trỏ
Cú pháp chung để mở một con trỏ như trong truy vấn bên dưới
MỞ tên_con_trỏ;
Lệnh này mở các con trỏ được tham chiếu theo tên của nó và người ta có thể bắt đầu sử dụng nó
Cách lấy dữ liệu
Mở con trỏ cho phép bạn tìm nạp thông tin được lưu trữ trong thủ tục, chức năng hoặc trình kích hoạt
Cú pháp chung để tìm nạp dữ liệu bằng con trỏ như được hiển thị
FETCH cursor_name VÀO các biến;
GHI CHÚ. Như đã đề cập, đảm bảo rằng con trỏ được sử dụng sau khi các biến được khai báo để tránh lỗi
Cách đóng và nhả con trỏ
Sau khi hoàn thành các thao tác yêu cầu con trỏ đã xác định, tốt nhất là đóng con trỏ để giải phóng bộ nhớ được liên kết với nó
Sau khi đóng con trỏ, người dùng cần mở lại con trỏ bằng từ khóa OPEN [hình trên] trước khi sử dụng con trỏ
Bạn không cần khai báo con trỏ sau câu lệnh close
Cú pháp chung để đóng con trỏ như trong truy vấn bên dưới
ĐÓNG tên_con_trỏ;
Xử lý lỗi
Con trỏ MySQL hoạt động bằng cách đọc đệ quy hàng tiếp theo trong tập kết quả. Nếu không có hàng tiếp theo, con trỏ sẽ đóng và không trả về dữ liệu trừ khi được chỉ định. Đây có thể là một vấn đề, đặc biệt là sau khi con trỏ đi đến cuối kết quả
Là một giải pháp, một trình xử lý KHÔNG TÌM KIẾM được xác định. Điều này chỉ định hành động sẽ được thực hiện nếu không tìm thấy hàng tiếp theo
Cú pháp chung để xử lý lỗi khi sử dụng con trỏ là
KHAI BÁO TIẾP TỤC XỬ LÝ KHÔNG TÌM KIẾM SET chấm dứt = true;
Giá trị kết thúc là một biến được sử dụng để xác định rằng con trỏ đã đi đến cuối kết quả. Tên biến có thể là bất kỳ tên nào miễn là phù hợp với quy ước đặt tên biến của MySQL
GHI CHÚ. Giống như tất cả các biến được sử dụng trong con trỏ, nó phải được xác định trước khi được sử dụng trong con trỏ
Trường hợp sử dụng ví dụ
Hãy để chúng tôi tạo một con trỏ thu thập email của khách hàng có sẵn trong bảng khách hàng của cơ sở dữ liệu mẫu Sakila
Tài nguyên để tải xuống và cài đặt cơ sở dữ liệu Sakila bên dưới
https. // nhà phát triển. mysql. com/doc/sakila/en/
Phần sau đây minh họa quy trình sử dụng con trỏ để tìm nạp email
SỬ DỤNG sakila;
PHÂN BIỆT $$
THỦ TỤC TẠO createNewsletter[
INOUT email VARCHAR[4000]
]
BẮT ĐẦU
KHAI BÁO chấm dứt INT DEFAULT FALSE;
KHAI BÁO emailAddr VARCHAR[255] MẶC ĐỊNH "";
KHAI BÁO coll_email CON TRỎ ĐỂ CHỌN email TỪ sakila. khách hàng WHERE [address_id > 100 AND address_id < 200];
KHAI BÁO TIẾP TỤC XỬ LÝ CHO KHÔNG TÌM KIẾM SET chấm dứt = TRUE;
MỞ thu_email;
nhậnEmail. VÒNG
TẢI coll_email VÀO emailAddr;
NẾU chấm dứt = TRUE THEN
ĐỂ LẠI getEmail;
KẾT THÚC NẾU;
ĐẶT email = CONCAT[emailAddr, ". ", email];
END LOOP getEmails;
ĐÓNG thu_email;
HẾT$$
PHÂN BIỆT ;
BỘ @email = "";
GỌI createNewsLetter[@collect_email];
CHỌN @collect_email;
Khi truy vấn thực thi, bạn sẽ nhận được kết quả như hình bên dưới
Phần kết luận
Trong hướng dẫn này, chúng tôi đã hướng dẫn sử dụng con trỏ MySQL để phân tích cú pháp dữ liệu được lưu trữ trong tập kết quả. Xem xét tài liệu để nắm vững cách thực hiện các con trỏ