PL/SQL - Con trỏ: Cánh cửa của bạn đến việc manipulatie dữ liệu

Xin chào các bạn tương lai của các phù thủy 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 các con trỏ PL/SQL. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - 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. Cuối cùng của bài hướng dẫn này, bạn sẽ sử dụng các con trỏ như một chuyên gia!

PL/SQL - Cursors

什么是游标?

Trước khi chúng ta đi sâu vào, hãy hiểu con trỏ 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 (chương trình của bạn) và bạn đang nhìn tất cả các món ăn ngon lành (bảng dữ liệu của bạn). Một con trỏ giống như bàn tay của bạn - nó giúp bạn chọn các mục cụ thể từ tiệc tự chọn và đặt chúng lên đĩa của bạn. Trong thuật ngữ cơ sở dữ liệu, một con trỏ cho phép bạn truy xuất và manipulatie dữ liệu từ cơ sở dữ liệu của bạn, một hàng tại một thời điểm.

Bây giờ, hãy cùng khám phá hai loại con trỏ trong PL/SQL:

Con trỏ T隐形

Con trỏ t隐形 giống như các chức năng tự động trên camera điện thoại của bạn - chúng hoạt động phía sau hậu trường mà bạn không cần phải làm nhiều. Oracle tạo và quản lý các con trỏ này cho bạn khi bạn thực thi các câu lệnh SQL.

Hãy nhìn vào một ví dụ:

BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;

IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employees received a 10% raise!');
ELSE
DBMS_OUTPUT.PUT_LINE('No employees in department 20 found.');
END IF;
END;
/

Trong đoạn mã này:

  1. Chúng ta đang cập nhật lương của nhân viên trong phòng ban 20.
  2. SQL%FOUND là một thuộc tính của con trỏ t隐形 trả về TRUE nếu UPDATE ảnh hưởng đến bất kỳ hàng nào.
  3. Chúng ta sử dụng điều này để in ra một thông báo phù hợp.

Các thuộc tính con trỏ t隐形 hữu ích khác bao gồm:

  • SQL%ROWCOUNT: Số lượng hàng bị ảnh hưởng
  • SQL%ISOPEN: Luôn trả về FALSE cho các con trỏ t隐形
  • SQL%NOTFOUND: Ngược lại với SQL%FOUND

Con trỏ T显性

Con trỏ t显性 giống như chế độ thủ công trên camera của bạn - bạn có nhiều quyền kiểm soát hơn, nhưng bạn cần quản lý chúng một mình. Chúng hoàn hảo khi bạn cần xử lý từng hàng một hoặc khi bạn muốn có nhiều quyền kiểm soát hơn trong quá trình truy xuất dữ liệu.

Hãy phân tích chu kỳ sống của một con trỏ t显性:

Khai báo Con trỏ

Đầu tiên, chúng ta cần cho biết khối PL/SQL của chúng ta muốn làm việc với dữ liệu nào. Điều này giống như quyết định bạn muốn ăn gì tại tiệc tự chọn trước khi bạn bắt đầu đầy đĩa của mình.

DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;

Ở đây, chúng ta đã khai báo một con trỏ tên là c_emp sẽ lấy chi tiết nhân viên từ phòng ban 30.

Mở Con trỏ

Bây giờ chúng ta đã quyết định điều gì chúng ta muốn, đã đến lúc tiếp cận tiệc tự chọn (hoặc trong trường hợp của chúng ta, cơ sở dữ liệu).

OPEN c_emp;

Đoạn mã này yêu cầu Oracle thực thi câu lệnh SELECT và chuẩn bị bộ kết quả.

Lấy Con trỏ

Đây là nơi chúng ta thực sự bắt đầu đặt thức ăn lên đĩa của mình - hoặc trong thuật ngữ lập trình, truy xuất dữ liệu từng hàng một.

DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/

Trong ví dụ này:

  1. Chúng ta khai báo các biến để giữ dữ liệu lấy được.
  2. Chúng ta mở con trỏ.
  3. Chúng ta sử dụng một vòng lặp để lấy từng hàng một.
  4. Chúng ta thoát khỏi vòng lặp khi không còn hàng nào khác (c_emp%NOTFOUND).
  5. Chúng ta in chi tiết của từng nhân viên.

Đóng Con trỏ

Giống như bạn sẽ trả lại đĩa của mình sau khi ăn xong tại tiệc tự chọn, chúng ta cần đóng con trỏ khi chúng ta đã xong.

CLOSE c_emp;

Điều này giải phóng các tài nguyên liên quan đến con trỏ.

Vòng lặp Con trỏ FOR: Một Mẹo

Bây giờ, tôi có một bí mật nhỏ cho bạn. Có một cách để làm việc với các con trỏ dễ dàng hơn - nó được gọi là Vòng lặp Con trỏ FOR. Điều này giống như có một người bạn giúp đỡ tại tiệc tự chọn!

BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/

Vòng lặp ma thuật này làm tất cả công việc cho bạn:

  1. Nó khai báo một biến ghi nhận (emp_rec) để giữ mỗi hàng.
  2. Nó mở con trỏ, lấy từng hàng và đóng con trỏ tự động.
  3. Bạn chỉ cần tập trung vào việc làm gì với mỗi hàng trong vòng lặp.

Phương thức Con trỏ: Bộ công cụ Hữu ích

Hãy tóm tắt các phương thức chúng ta có thể sử dụng với các con trỏ trong một bảng rõ ràng:

Phương thức Mô tả
DECLARE Định nghĩa con trỏ và câu lệnh SELECT của nó
OPEN Thực thi câu lệnh SELECT và chuẩn bị bộ kết quả
FETCH Lấy hàng tiếp theo từ bộ kết quả
CLOSE Đóng con trỏ và giải phóng tài nguyên

Nhớ rằng, với quyền lực lớn đi kèm với trách nhiệm lớn. Luôn đóng con trỏ khi bạn đã xong để giải phóng tài nguyên!

Và thế là bạn đã có nó, các học sinh yêu quý của tôi! Bạn đã thực hiện những bước đầu tiên vào thế giới của các con trỏ PL/SQL. Thực hành với các khái niệm này, thử nghiệm với các kịch bản khác nhau, và sớm bạn sẽ điều hướng qua cơ sở dữ liệu của bạn với sự thanh lịch và chính xác của một lập trình viên có kinh nghiệm.

Nhớ rằng, trong lập trình, cũng như trong cuộc sống, chìa khóa là tiếp tục học hỏi và thử nghiệm. Vậy hãy tiến lên, viết mã, mắc lỗi, và quan trọng nhất là, hãy vui vẻ! Ai biết được? Ứng dụng cơ sở dữ liệu tiếp theo có thể chỉ ở trong tầm tay của bạn. Chúc các bạn lập trình vui vẻ!

Credits: Image by storyset