MySQL Cursors: A Beginner's Guide

Xin chào, những người yêu thích cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của MySQL Cursors. Đừng lo lắng nếu bạn chưa bao giờ viết một dòng mã trước đây - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ khám phá chủ đề này từng bước một. Vậy, hãy lấy một cốc đồ uống yêu thích của bạn, và cùng tôi nhảy vào nhé!

MySQL - Cursor

MySQL Cursors là gì?

Hãy tưởng tượng bạn đang ở một buổi tiệc tự chọn (tôi biết, tôi đang làm bạn đói bụng rồi!). Bạn có một đĩa, và bạn di chuyển dọc theo quầy tự chọn, chọn một món ăn một lần. Trong thế giới cơ sở dữ liệu, một con trỏ hoạt động tương tự. Nó giống như đĩa của bạn, cho phép bạn xử lý một hàng trong một tập kết quả.

Con trỏ đặc biệt hữu ích khi bạn cần thực hiện các thao tác trên từng hàng, thay vì trên toàn bộ tập kết quả một lần. Chúng giống như trợ lý cá nhân của bạn, lấy dữ liệu cho bạn từng phần một.

Vòng đời của MySQL Cursor

Giống như chúng ta làm theo một quy trình nhất định tại buổi tiệc tự chọn (lấy đĩa, đầy đĩa, ăn, trả đĩa), con trỏ cũng có vòng đời riêng. Hãy cùng phân tích nó:

  1. Khai báo con trỏ
  2. Mở con trỏ
  3. Lấy dữ liệu từ con trỏ
  4. Đóng con trỏ

Bây giờ, hãy cùng khám phá từng bước chi tiết.

Khai báo một con trỏ

Đầu tiên, chúng ta cần thông báo cho MySQL biết rằng chúng ta muốn sử dụng một con trỏ. Điều này giống như thông báo cho nhân viên tiệc tự chọn rằng bạn đã sẵn sàng đầy đĩa.

Dưới đây là cách chúng ta khai báo một con trỏ:

DECLARE cursor_name CURSOR FOR SELECT_statement;

Hãy xem một ví dụ thực tế. Giả sử chúng ta có một bảng叫做 employees và chúng ta muốn tạo một con trỏ để lấy tên tất cả nhân viên:

DECLARE employee_cursor CURSOR FOR
SELECT first_name, last_name FROM employees;

Trong ví dụ này, employee_cursor là tên chúng ta đã đặt cho con trỏ, và câu lệnh SELECT xác định dữ liệu mà con trỏ sẽ lấy.

Mở một con trỏ

Bây giờ chúng ta đã khai báo con trỏ, đã đến lúc mở nó. Điều này giống như thực sự lấy đĩa tại buổi tiệc tự chọn.

Dưới đây là cách chúng ta mở một con trỏ:

OPEN cursor_name;

Sử dụng ví dụ trước:

OPEN employee_cursor;

Lệnh này thông báo cho MySQL thực hiện câu lệnh SELECT liên quan đến con trỏ và chuẩn bị lấy kết quả.

Lấy dữ liệu từ con trỏ

Đây là phần kỳ diệu! Bây giờ chúng ta có thể bắt đầu lấy dữ liệu, một hàng một. Điều này giống như lấy từng món ăn tại buổi tiệc tự chọn.

Dưới đây là cú pháp cơ bản để lấy dữ liệu:

FETCH cursor_name INTO variable1, variable2, ...;

Hãy tiếp tục với ví dụ nhân viên:

DECLARE v_first_name VARCHAR(50);
DECLARE v_last_name VARCHAR(50);

FETCH employee_cursor INTO v_first_name, v_last_name;

Trong đoạn mã này, chúng ta đang khai báo hai biến để lưu trữ tên và họ, sau đó lấy hàng tiếp theo từ con trỏ vào các biến này.

Nhưng đợi một chút! Thường thì chúng ta muốn lấy tất cả các hàng, không chỉ một. Để làm điều đó, chúng ta thường sử dụng một vòng lặp. Dưới đây là một ví dụ:

DECLARE v_first_name VARCHAR(50);
DECLARE v_last_name VARCHAR(50);
DECLARE v_done INT DEFAULT FALSE;
DECLARE employee_cursor CURSOR FOR SELECT first_name, last_name FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;

OPEN employee_cursor;

read_loop: LOOP
FETCH employee_cursor INTO v_first_name, v_last_name;
IF v_done THEN
LEAVE read_loop;
END IF;
-- Làm điều gì đó với v_first_name và v_last_name ở đây
END LOOP;

CLOSE employee_cursor;

Đoạn mã này thiết lập một vòng lặp tiếp tục lấy hàng cho đến khi không còn hàng nào khác. Điều này giống như quay lại lấy thêm (và thêm, và thêm...) tại buổi tiệc tự chọn cho đến khi bạn đã thử tất cả những gì bạn muốn.

Đóng một con trỏ

Khi chúng ta đã xong với con trỏ, chúng ta cần đóng nó. Điều này giống như trả đĩa tại buổi tiệc tự chọn.

Dưới đây là cách chúng ta đóng một con trỏ:

CLOSE cursor_name;

Và với ví dụ của chúng ta:

CLOSE employee_cursor;

Lệnh này thông báo cho MySQL rằng chúng ta đã xong với con trỏ và nó có thể giải phóng bất kỳ tài nguyên nào liên quan đến nó.

Kết hợp tất cả lại

Bây giờ chúng ta đã học về từng bước, hãy xem một ví dụ đầy đủ sử dụng con trỏ để tăng lương cho tất cả nhân viên:

DELIMITER //

CREATE PROCEDURE give_raises()
BEGIN
DECLARE v_emp_id INT;
DECLARE v_salary DECIMAL(10,2);
DECLARE v_done INT DEFAULT FALSE;
DECLARE emp_cursor CURSOR FOR SELECT employee_id, salary FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;

OPEN emp_cursor;

read_loop: LOOP
FETCH emp_cursor INTO v_emp_id, v_salary;
IF v_done THEN
LEAVE read_loop;
END IF;

UPDATE employees SET salary = salary * 1.05 WHERE employee_id = v_emp_id;
END LOOP;

CLOSE emp_cursor;
END //

DELIMITER ;

Trong thủ tục này, chúng ta sử dụng con trỏ để vòng qua tất cả nhân viên và tăng lương cho từng nhân viên 5%. Điều này giống như đi qua buổi tiệc tự chọn và thêm một chútextra vào đĩa của mỗi người!

Tóm tắt phương thức con trỏ

Dưới đây là bảng tóm tắt các phương thức con trỏ mà chúng ta đã học:

Phương thức Cú pháp Mô tả
DECLARE DECLARE cursor_name CURSOR FOR SELECT_statement; Định nghĩa con trỏ và câu lệnh SELECT liên quan
OPEN OPEN cursor_name; Thực hiện câu lệnh SELECT và chuẩn bị lấy kết quả
FETCH FETCH cursor_name INTO variable1, variable2, ...; Lấy hàng tiếp theo từ con trỏ
CLOSE CLOSE cursor_name; Đóng con trỏ và giải phóng tài nguyên liên quan

Và thế là xong, các bạn! Bạn đã chính thức bước vào thế giới của MySQL Cursors. Nhớ rằng, giống như học cách điều hướng tại buổi tiệc tự chọn, việc làm quen với con trỏ có thể cần một chút thời gian để làm quen. Nhưng với thời gian và sự kiên nhẫn, bạn sẽ xử lý dữ liệu như một chuyên gia. Chúc mừng bạn, và mong rằng cơ sở dữ liệu của bạn luôn được nuôi dưỡng và hiệu quả!

Credits: Image by storyset