Sau khi một con trỏ được khai báo, nó có thể được mở và đóng thường xuyên nếu cần. Sau khi mở, các thao tác tìm nạp có thể được thực hiện thường xuyên nếu cần
Tạo con trỏ
Con trỏ được tạo bằng cách sử dụng câu lệnh
OPEN ordernumbers;2.
OPEN ordernumbers;2 đặt tên cho con trỏ và lấy một câu lệnh
OPEN ordernumbers;0, hoàn thành với
OPEN ordernumbers;5 và các mệnh đề khác nếu cần. Ví dụ: câu lệnh này định nghĩa một con trỏ có tên là
OPEN ordernumbers;6 bằng cách sử dụng câu lệnh
OPEN ordernumbers;0 truy xuất tất cả các đơn đặt hàng
CREATE PROCEDURE processorders[] BEGIN DECLARE ordernumbers CURSOR FOR SELECT ordernum FROM orders; END;
Thủ tục được lưu trữ này không làm được gì nhiều. Một câu lệnh
OPEN ordernumbers;2 được sử dụng để xác định và đặt tên cho con trỏ trong trường hợp này là
OPEN ordernumbers;6. Không có gì được thực hiện với con trỏ và ngay sau khi thủ tục được lưu trữ xử lý xong, nó sẽ không còn tồn tại [vì nó là cục bộ của chính thủ tục được lưu trữ]
Bây giờ con trỏ đã được xác định, nó đã sẵn sàng để mở
Mở và đóng con trỏ
Con trỏ được mở bằng câu lệnh
CLOSE ordernumbers;0, như thế này
OPEN ordernumbers;
Khi câu lệnh
CLOSE ordernumbers;1 được xử lý, truy vấn được thực thi và dữ liệu đã truy xuất được lưu trữ để duyệt và cuộn tiếp theo
Sau khi quá trình xử lý con trỏ hoàn tất, con trỏ sẽ được đóng lại bằng cách sử dụng câu lệnh
CLOSE ordernumbers;2, như sau
CLOSE ordernumbers;
CLOSE ordernumbers;2 giải phóng mọi bộ nhớ trong và tài nguyên được sử dụng bởi con trỏ và do đó, mọi con trỏ phải được đóng khi không còn cần thiết.
Sau khi đóng con trỏ, nó không thể được sử dụng lại mà không được mở lại. Tuy nhiên, một con trỏ không cần phải được khai báo lại để được sử dụng;
Nếu bạn không đóng con trỏ một cách rõ ràng, MySQL sẽ tự động đóng nó khi đạt đến câu lệnh
CLOSE ordernumbers;5
Đây là phiên bản cập nhật của ví dụ trước
OPEN ordernumbers;7
Thủ tục được lưu trữ này khai báo, mở và đóng một con trỏ. Tuy nhiên, không có gì được thực hiện với dữ liệu đã truy xuất
Sử dụng dữ liệu con trỏ
Sau khi con trỏ được mở, mỗi hàng có thể được truy cập riêng lẻ bằng cách sử dụng câu lệnh
CLOSE ordernumbers;6.
CLOSE ordernumbers;6 chỉ định những gì sẽ được truy xuất [các cột mong muốn] và nơi lưu trữ dữ liệu đã truy xuất. Nó cũng nâng cao con trỏ hàng bên trong con trỏ để câu lệnh
CLOSE ordernumbers;6 tiếp theo sẽ truy xuất hàng tiếp theo [chứ không phải lặp đi lặp lại cùng một hàng]
Ví dụ đầu tiên truy xuất một hàng từ con trỏ [hàng đầu tiên]
OPEN ordernumbers;1
Ở đây,
CLOSE ordernumbers;6 được sử dụng để truy xuất cột
OPEN ordernumbers;70 của hàng hiện tại [nó sẽ tự động bắt đầu ở hàng đầu tiên] vào một biến được khai báo cục bộ có tên là
OPEN ordernumbers;71. Không có gì được thực hiện với dữ liệu đã truy xuất
Trong ví dụ tiếp theo, dữ liệu đã truy xuất được lặp từ hàng đầu tiên đến hàng cuối cùng
OPEN ordernumbers;5
Giống như ví dụ trước, ví dụ này sử dụng
CLOSE ordernumbers;6 để truy xuất
OPEN ordernumbers;70 hiện tại vào một biến được khai báo có tên là
OPEN ordernumbers;71. Không giống như ví dụ trước,
CLOSE ordernumbers;6 ở đây nằm trong một
OPEN ordernumbers;76 nên nó được lặp đi lặp lại cho đến khi
OPEN ordernumbers;77 là đúng [như được chỉ định bởi
OPEN ordernumbers;78]. Để thực hiện công việc này, biến
OPEN ordernumbers;77 được xác định bằng một
OPEN ordernumbers;10 [false, not done]. Vậy làm thế nào để
OPEN ordernumbers;77 được đặt thành đúng khi thực hiện?
OPEN ordernumbers;6
Câu lệnh này định nghĩa một mã
OPEN ordernumbers;12 sẽ được thực thi khi một điều kiện xảy ra. Ở đây nó xác định rằng khi
OPEN ordernumbers;13 xảy ra, thì
OPEN ordernumbers;14. Và
OPEN ordernumbers;13 là điều kiện không tìm thấy và vì vậy nó xảy ra khi
OPEN ordernumbers;76 không thể tiếp tục vì không còn hàng nào để lặp qua.
OPEN ordernumbers;17 Để biết danh sách đầy đủ các mã lỗi MySQL được sử dụng bởi MySQL 5, hãy xem
OPEN ordernumbers;18
Có thứ tự cụ thể mà các câu lệnh
OPEN ordernumbers;2, nếu được sử dụng, phải được ban hành. Các biến cục bộ được xác định bằng
OPEN ordernumbers;2 phải được xác định trước bất kỳ con trỏ hoặc trình xử lý nào được xác định và các trình xử lý phải được xác định sau bất kỳ con trỏ nào. Việc không tuân theo trình tự này sẽ tạo ra thông báo lỗi
Nếu bạn gọi thủ tục được lưu trữ này, nó sẽ xác định các biến và một
OPEN ordernumbers;12, xác định và mở một con trỏ, lặp lại qua tất cả các hàng rồi đóng con trỏ
Với chức năng này, giờ đây bạn có thể đặt bất kỳ xử lý cần thiết nào bên trong vòng lặp [sau câu lệnh
CLOSE ordernumbers;6 và trước khi kết thúc vòng lặp]
Ngoài câu lệnh
OPEN ordernumbers;76 được sử dụng ở đây, MySQL cũng hỗ trợ câu lệnh
OPEN ordernumbers;54 có thể được sử dụng để lặp lại mã cho đến khi thoát khỏi
OPEN ordernumbers;54 theo cách thủ công bằng cách sử dụng câu lệnh
OPEN ordernumbers;56. Nói chung, cú pháp của câu lệnh
OPEN ordernumbers;76 làm cho nó phù hợp hơn để lặp qua các con trỏ
Để kết hợp tất cả những điều này lại với nhau, đây là một bản sửa đổi nữa của thủ tục được lưu trữ mẫu của chúng tôi với con trỏ, lần này với một số xử lý thực tế của dữ liệu được tìm nạp
OPEN ordernumbers;3
Trong ví dụ này, chúng tôi đã thêm một biến khác có tên là
OPEN ordernumbers;58 [biến này sẽ lưu trữ tổng số cho mỗi đơn đặt hàng]. Thủ tục được lưu trữ cũng nhanh chóng tạo một bảng mới [nếu nó không tồn tại] có tên là
OPEN ordernumbers;59. Bảng này sẽ lưu trữ các kết quả được tạo bởi thủ tục được lưu trữ.
CLOSE ordernumbers;6 tìm nạp từng
OPEN ordernumbers;70 như đã làm trước đó, sau đó sử dụng
OPEN ordernumbers;62 để thực hiện một thủ tục được lưu trữ khác [thủ tục mà chúng ta đã tạo trong hướng dẫn trước] để tính tổng số tiền có thuế cho mỗi đơn hàng [kết quả của thủ tục này được lưu trữ trong
OPEN ordernumbers;58]. Và cuối cùng,
OPEN ordernumbers;64 được sử dụng để lưu số đơn hàng và tổng cộng cho mỗi đơn hàng.
Quy trình được lưu trữ này không trả về dữ liệu, nhưng nó tạo và điền vào một bảng khác mà sau đó có thể được xem bằng cách sử dụng câu lệnh
OPEN ordernumbers;0 đơn giản
CREATE PROCEDURE processorders[] BEGIN DECLARE ordernumbers CURSOR FOR SELECT ordernum FROM orders; END;2
CREATE PROCEDURE processorders[] BEGIN DECLARE ordernumbers CURSOR FOR SELECT ordernum FROM orders; END;3
Và sau đó bạn có nó, một ví dụ hoạt động hoàn chỉnh về các thủ tục được lưu trữ, con trỏ, xử lý từng hàng và thậm chí .