Thứ Tư, 26 tháng 10, 2022

PL / SQL - Con trỏ (cursor)

Trong chương này, chúng ta sẽ thảo luận về các con trỏ trong PL/SQL. Oracle tạo một vùng bộ nhớ, được gọi là vùng ngữ cảnh, để xử lý một câu lệnh SQL, vùng này chứa tất cả thông tin cần thiết để xử lý câu lệnh; ví dụ: số lượng hàng được xử lý, v.v.

Con trỏ là một con trỏ đến vùng ngữ cảnh này. PL/SQL điều khiển vùng ngữ cảnh thông qua một con trỏ. Một con trỏ giữ các hàng (một hoặc nhiều) được trả về bởi một câu lệnh SQL. Tập hợp các hàng mà con trỏ giữ được gọi là tập hoạt động .

Bạn có thể đặt tên cho một con trỏ để nó có thể được tham chiếu đến trong một chương trình để tìm nạp và xử lý các hàng được trả về bởi câu lệnh SQL, từng hàng một. Có hai loại con trỏ -

  • Con trỏ ngầm

  • Con trỏ tục tĩu

Con trỏ ngầm

Các con trỏ ngầm được Oracle tự động tạo bất cứ khi nào một câu lệnh SQL được thực thi, khi không có con trỏ rõ ràng cho câu lệnh. Người lập trình không thể kiểm soát các con trỏ ngầm và thông tin trong đó.

Bất cứ khi nào một câu lệnh DML (INSERT, UPDATE và DELETE) được đưa ra, một con trỏ ngầm được liên kết với câu lệnh này. Đối với các thao tác INSERT, con trỏ giữ dữ liệu cần được chèn vào. Đối với các hoạt động UPDATE và DELETE, con trỏ xác định các hàng sẽ bị ảnh hưởng.

Trong PL/SQL, bạn có thể tham khảo con trỏ ngầm gần đây nhất là con trỏ SQL , con trỏ này luôn có các thuộc tính như % FOUND,% ISOPEN,% NOTFOUND và % ROWCOUNT . Con trỏ SQL có các thuộc tính bổ sung, % BULK_ROWCOUNT và % BULK_EXCEPTIONS , được thiết kế để sử dụng với câu lệnh FORALL . Bảng sau cung cấp mô tả về các thuộc tính được sử dụng nhiều nhất:

STT

Thuộc tính & Mô tả

1

%FOUND

Trả về TRUE nếu câu lệnh INSERT, UPDATE hoặc DELETE ảnh hưởng đến một hoặc nhiều hàng hoặc câu lệnh SELECT INTO trả về một hoặc nhiều hàng. Nếu không, nó trả về FALSE.

2

%NOTFOUND

Đối lập hợp lý với% FOUND. Nó trả về TRUE nếu một câu lệnh INSERT, UPDATE hoặc DELETE không ảnh hưởng đến không có hàng nào hoặc một câu lệnh SELECT INTO trả về không có hàng nào. Nếu không, nó trả về FALSE.

3

% ISOPEN

Luôn trả về FALSE cho các con trỏ ngầm, vì Oracle tự động đóng con trỏ SQL sau khi thực hiện câu lệnh SQL được liên kết của nó.

4

%ROWCOUNT

Trả về số hàng bị ảnh hưởng bởi câu lệnh INSERT, UPDATE hoặc DELETE hoặc được trả về bởi câu lệnh SELECT INTO.

Bất kỳ thuộc tính con trỏ SQL nào sẽ được truy cập dưới dạng sql% thuộc tính_name như được hiển thị bên dưới trong ví dụ.

Thí dụ

Chúng ta sẽ sử dụng bảng CUSTOMERS mà chúng ta đã tạo và sử dụng trong các chương trước.

Select * from customers;  


+----+----------+-----+-----------+----------+ 

| ID | NAME     | AGE | ADDRESS   | SALARY   | 

+----+----------+-----+-----------+----------+ 

|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 

|  2 | Khilan   |  25 | Delhi     |  1500.00 | 

|  3 | kaushik  |  23 | Kota      |  2000.00 | 

|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 

|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 

|  6 | Komal    |  22 | MP        |  4500.00 | 

+----+----------+-----+-----------+----------+


Chương trình sau sẽ cập nhật bảng và tăng lương của mỗi khách hàng thêm 500 và sử dụng thuộc tính ROWCOUNT SQL% để xác định số hàng bị ảnh hưởng -

DECLARE  

   total_rows number(2); 

BEGIN 

   UPDATE customers 

   SET salary = salary + 500; 

   IF sql%notfound THEN 

      dbms_output.put_line('no customers selected'); 

   ELSIF sql%found THEN 

      total_rows := sql%rowcount;

      dbms_output.put_line( total_rows || ' customers selected '); 

   END IF;  

END; 

/     

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

6 customers selected  


PL/SQL procedure successfully completed. 


Nếu bạn kiểm tra các bản ghi trong bảng khách hàng, bạn sẽ thấy rằng các hàng đã được cập nhật -

Select * from customers;  


+----+----------+-----+-----------+----------+ 

| ID | NAME     | AGE | ADDRESS   | SALARY   | 

+----+----------+-----+-----------+----------+ 

|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 

|  2 | Khilan   |  25 | Delhi     |  2000.00 | 

|  3 | kaushik  |  23 | Kota      |  2500.00 | 

|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 

|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 

|  6 | Komal    |  22 | MP        |  5000.00 | 

+----+----------+-----+-----------+----------+


Con trỏ rõ ràng

Con trỏ rõ ràng là con trỏ do người lập trình xác định để giành được nhiều quyền kiểm soát hơn đối với khu vực ngữ cảnh . Một con trỏ rõ ràng nên được định nghĩa trong phần khai báo của Khối PL/SQL. Nó được tạo trên Câu lệnh SELECT trả về nhiều hơn một hàng.

Cú pháp để tạo một con trỏ rõ ràng là:

CURSOR cursor_name IS select_statement; 


Làm việc với một con trỏ rõ ràng bao gồm các bước sau:

  • Khai báo con trỏ để khởi tạo bộ nhớ

  • Mở con trỏ để cấp phát bộ nhớ

  • Tìm nạp con trỏ để truy xuất dữ liệu

  • Đóng con trỏ để giải phóng bộ nhớ được cấp phát

Khai báo con trỏ

Khai báo con trỏ xác định con trỏ với tên và câu lệnh SELECT liên quan. Ví dụ -

CURSOR c_customers IS 

   SELECT id, name, address FROM customers;

Mở con trỏ

Việc mở con trỏ sẽ phân bổ bộ nhớ cho con trỏ và làm cho nó sẵn sàng để tìm nạp các hàng được câu lệnh SQL trả về vào đó. Ví dụ, chúng ta sẽ mở con trỏ được xác định ở trên như sau:

OPEN c_customers;

Tìm nạp con trỏ

Tìm nạp con trỏ liên quan đến việc truy cập từng hàng một. Ví dụ: chúng tôi sẽ tìm nạp các hàng từ con trỏ đã mở ở trên như sau:

FETCH c_customers INTO c_id, c_name, c_addr;

Đóng con trỏ

Đóng con trỏ có nghĩa là giải phóng bộ nhớ được cấp phát. Ví dụ, chúng ta sẽ đóng con trỏ đã mở ở trên như sau:

CLOSE c_customers;

Thí dụ

Sau đây là một ví dụ đầy đủ để minh họa các khái niệm về con trỏ rõ ràng & minua;

DECLARE 

   c_id customers.id%type; 

   c_name customers.name%type; 

   c_addr customers.address%type; 

   CURSOR c_customers is 

      SELECT id, name, address FROM customers; 

BEGIN 

   OPEN c_customers; 

   LOOP 

   FETCH c_customers into c_id, c_name, c_addr; 

      EXIT WHEN c_customers%notfound; 

      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 

   END LOOP; 

   CLOSE c_customers; 

END; 

/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

1 Ramesh Ahmedabad  

2 Khilan Delhi  

3 kaushik Kota     

4 Chaitali Mumbai  

5 Hardik Bhopal   

6 Komal MP  

  

PL/SQL procedure successfully completed.


=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
pl/sql, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master