Chúng ta đã thấy trong hướng dẫn trước về cách tạo Biến loại bản ghi dựa trên con trỏ dựa trên Con trỏ đơn giản trả về một hàng dữ liệu. Bây giờ câu hỏi đặt ra ở đây là chúng ta có thể sử dụng cùng một biến kiểu dữ liệu bản ghi duy nhất với con trỏ trả về nhiều hàng dữ liệu không? Để biết câu trả lời, hãy đọc và tìm hiểu cách xử lý nhiều giá trị được trả về bởi một con trỏ bằng cách sử dụng một biến kiểu dữ liệu bản ghi dựa trên con trỏ.
Vì chúng ta đang xử lý các bản ghi Dựa trên con trỏ, do đó, cần phải có một chút kiến thức về con trỏ. Vì mục đích đơn giản và để làm cho khái niệm này dễ hiểu, tôi sẽ sử dụng Con trỏ tường minh đơn giản để trình diễn.
Bước 1:Khai báo con trỏ tường minh đơn giản
Kiểu dữ liệu bản ghi dựa trên con trỏ yêu cầu một con trỏ đã được tạo. Con trỏ này sẽ trở thành cơ sở cơ bản cho biến kiểu bản ghi của chúng ta. Tất cả các trường của biến kiểu bản ghi được tạo bằng con trỏ này sẽ có cùng tên và kiểu dữ liệu với tên và kiểu dữ liệu của các cột được sử dụng trong Danh sách CHỌN của con trỏ.
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
Không giống như con trỏ từ hướng dẫn trước đó trả về một hàng dữ liệu, con trỏ này sẽ trả về nhiều hàng. Tất cả các hàng này sẽ bao gồm tên và mức lương của tất cả nhân viên có id nhân viên lớn hơn 200.
Bước2:Khai báo biến loại dữ liệu bản ghi dựa trên con trỏ
Khi chúng ta đã tạo con trỏ, bây giờ chúng ta đã sẵn sàng khai báo biến bản ghi của mình bằng cách sử dụng con trỏ này.
var_emp cur_RebellionRider%ROWTYPE;
Var_emp là biến kiểu bản ghi và vì nó dựa trên con trỏ cur_RebellionRider nên chúng ta có thể tự hào gọi nó là biến kiểu bản ghi Dựa trên con trỏ. Bây giờ chúng ta phải xem liệu biến bản ghi duy nhất này có khả năng giữ tất cả dữ liệu được trả về bởi con trỏ bên dưới cur_RebellionRider hay không.
Bước 3:Khởi tạo biến bản ghi con trỏ
Như chúng ta đã thảo luận trong hướng dẫn PL / SQL 34 rằng việc khởi tạo biến bản ghi là quá trình gán một số giá trị cho nó. Trong trường hợp Con trỏ, câu lệnh FETCH-INTO thực hiện công việc này. Nhưng chúng ta phải đảm bảo rằng chúng ta đã tuân theo đúng Vòng đời của con trỏ.
Nếu bạn không biết Vòng đời con trỏ này là gì và các bước liên quan đến việc tạo Con trỏ, hãy xem blog này về “Giới thiệu về Con trỏ cơ sở dữ liệu”.
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
Phần thực thi ở trên của khối PL / SQL mà chúng tôi đang tạo ở đây đã được giải thích từng dòng trong video hướng dẫn trên kênh YouTube của tôi. Hãy kiểm tra xem.
Vậy là xong. Đó là tất cả những gì chúng ta phải làm. Bây giờ, hãy kết hợp tất cả các đoạn mã này mà chúng ta đã thấy trong các bước khác nhau ở trên thành một khối PL / SQL ẩn danh duy nhất.
Biến kiểu dữ liệu bản ghi dựa trên con trỏ trong cơ sở dữ liệu Oracle
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
Khi bạn biên dịch và chạy đoạn mã trên, bạn sẽ nhận được tất cả dữ liệu mà câu lệnh FETCH-INTO đã lấy từ con trỏ cur_RebellionRider và được lưu trữ trong biến Bản ghi dựa trên con trỏ var_emp. Điều này ngụ ý rằng chúng tôi thực sự có thể xử lý nhiều hàng dữ liệu bằng cách sử dụng một Bản ghi dựa trên con trỏ.
Trong video hướng dẫn PL / SQL của mình, tôi đã hỏi rằng chúng ta có thể đơn giản hóa mã này không hay có cách nào khác để thực hiện tác vụ tương tự. Câu trả lời là có, có nhiều cách để đạt được cùng một kết quả và một trong số đó là sử dụng “Con trỏ For-Loop”. Đây là một loại vòng lặp đặc biệt khai báo biến bản ghi cũng như Mở, Tìm nạp và Đóng con trỏ bên dưới một cách ngầm định trong nền cho bạn. Bạn có thể đọc thêm Cursor For-Loop tại đây.
Sách tham khảo dành cho liên kết liên kết Chuyên gia SQL 1z0-047
Hướng dẫn Kiểm tra Chuyên gia được Chứng nhận về Cơ sở dữ liệu Oracle về SQL (Bài kiểm tra 1Z0-047)
Đây là đoạn mã được thực hiện bằng cách sử dụng Cursor For-Loop, tương đương với đoạn mã trên. Như bạn có thể thấy, nó ít phức tạp hơn nhiều với một số Dòng mã (LOC).
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
Cả hai mã sẽ trả về cùng một kết quả vì cả hai đều đang thực hiện cùng một nhiệm vụ.
Hy vọng bạn thích hướng dẫn PL / SQL chi tiết này. Hãy nhớ chia sẻ điều này trên mạng xã hội của bạn và gắn thẻ tôi vì tôi đang tặng hàng hóa của RebellionRider hàng tháng cho một người dùng được chọn ngẫu nhiên. Cũng theo dõi tôi trên Mạng xã hội [Twitter / Facebook / Instagram] của tôi để cập nhật thường xuyên.
Cảm ơn &Chúc một ngày tốt lành!