Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Loại dữ liệu bản ghi dựa trên con trỏ với con trỏ trả về nhiều giá trị trong cơ sở dữ liệu Oracle

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!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tổng hợp chuỗi Oracle

  2. Làm thế nào bạn có thể biết nếu một giá trị không phải là số trong Oracle?

  3. Đếm số lần xuất hiện của một ký tự trong Oracle SQL

  4. Sự khác biệt giữa hàm RANK () và DENSE_RANK () trong oracle là gì?

  5. Sự khác biệt giữa LockModeType Jpa