Cách sử dụng con trỏ trong MySQL / MariaDB

Con trỏ trong MySQL là gì?

Con trỏ trong MySQL giúp bạn duyệt dữ liệu theo hàng, nói cách khác nó giúp ta lấy ra một tập hợp dữ liệu theo từng hàng, từng hàng của một bảng dữ liệu nào đó. Sau đó ta sẽ sử dụng các giá trị đó để thực hiện các nhiệm vụ phức tạp.

Để hiểu rõ hơn ta có thể nhìn hình ảnh ở bên dưới

Con trỏ trong MySQL hỗ trợ sử dụng trong các Stored Programs (thuật ngữ chung để chỉ Stored Procedures, Functions và Triggers) với các đặc tính như:

  • Không thể dùng con trỏ update vào bảng
  • Chỉ chạy theo 1 chiều từ trên xuống dưới, không thể chạy theo chiều ngược lại và cũng không thể bỏ qua hàng

Cách sử dụng con trỏ trong MySQL

CREATE PROCEDURE vidu_contro()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE bienA INT;
  DECLARE bienB CHAR(16);
  DECLARE contro CURSOR FOR SELECT id,ten_sv FROM sinhvien1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN contro;

  read_loop: LOOP
    FETCH contro INTO bienA, bienB;
    IF done THEN
      LEAVE read_loop;
    END IF;
    IF bienA = 2 THEN
      INSERT INTO sinhvien2 VALUES (bienA,bienB);
    END IF;
  END LOOP;

  CLOSE contro;
END;

Mình sẽ giải thích từng dòng lệnh ở bên dưới

– Đầu tiên là khai báo các biến và con trỏ: bienA, bienB và contro

Quảng cáo

Ủng hộ website

– Biến contro sẽ lấy dữ liệu id và tên sinh viên (ten_sv) từ bảng sinhvien1 bằng lệnh bên dưới

DECLARE contro CURSOR FOR SELECT id,ten_sv FROM sinhvien1;

– Khi nào con trỏ phát hiện ra là đã hết dữ liệu? Ta sẽ sử dụng lệnh bên dưới để bắt lỗi “NOT FOUND”, lệnh này có ý nghĩa là khi hết dữ liệu thì chương trình vẫn tiếp tục chạy mà không trả về biến lỗi và nó sẽ đặt biến “done = true

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

– Mở 1 con trỏ bằng lệnh

OPEN contro;

Sau khi mở con trỏ ta sẽ sử dụng vòng lặp LOOP để lấy dữ liệu của từng hàng, với mỗi lần FETCH thì con trỏ sẽ lấy dữ liệu của từng hàng tịnh tiến lên vào trong 2 biến là bienAbienB. Xử lý dữ liệu và lặp cho đến dữ liệu cuối cùng khi nào done = true thì thoát vòng lặp. Cuối cùng là đóng con trỏ bằng lệnh dưới

CLOSE contro;

Bài viết được thực hiện trên MySQL 8.0 và MariaDB 10.2. Mong các bạn góp ý để website ngày càng phát triển

Add Comment