CURSOR trong PL / SQL là gì?
Con trỏ là một con trỏ đến vùng ngữ cảnh này. Oracle tạo vùng ngữ cảnh để xử lý một câu lệnh SQL chứa tất cả thông tin về câu lệnh.
PL / SQL cho phép lập trình viên điều khiển vùng ngữ cảnh thông qua con trỏ. Một con trỏ giữ các hàng được trả về bởi câu lệnh SQL. Tập hợp các hàng mà con trỏ giữ được gọi là tập hợp hoạt động. Các con trỏ này cũng có thể được đặt tên để chúng có thể được tham chiếu từ một vị trí khác của mã.
Trong hướng dẫn này, bạn sẽ học-
- Con trỏ ngầm
- Con trỏ rõ ràng
- Thuộc tính con trỏ
- Câu lệnh FOR Loop Cursor
Con trỏ có hai loại.
- Con trỏ ngầm
- Con trỏ rõ ràng
Con trỏ ngầm
Bất cứ khi nào bất kỳ hoạt động DML nào xảy ra trong cơ sở dữ liệu, một con trỏ ngầm được tạo ra để giữ các hàng bị ảnh hưởng, trong hoạt động cụ thể đó. Các con trỏ này không thể được đặt tên và do đó chúng không thể được điều khiển hoặc tham chiếu từ một nơi khác của mã. Chúng ta chỉ có thể đề cập đến con trỏ gần đây nhất thông qua các thuộc tính của con trỏ.
Con trỏ rõ ràng
Các lập trình viên được phép tạo vùng ngữ cảnh được đặt tên để thực thi các hoạt động DML của họ để có nhiều quyền kiểm soát hơn đối với nó. Con trỏ rõ ràng phải được định nghĩa trong phần khai báo của khối PL / SQL và nó được tạo cho câu lệnh 'SELECT' cần được sử dụng trong mã.
Dưới đây là các bước liên quan đến làm việc với con trỏ rõ ràng.
- Khai báo con trỏ
Khai báo con trỏ chỉ có nghĩa là tạo một vùng ngữ cảnh được đặt tên cho câu lệnh 'SELECT' được xác định trong phần khai báo. Tên của vùng ngữ cảnh này giống như tên con trỏ.
- Mở con trỏ
Mở con trỏ sẽ chỉ dẫn PL / SQL cấp phát bộ nhớ cho con trỏ này. Nó sẽ làm cho con trỏ sẵn sàng để tìm nạp các bản ghi.
- Tìm nạp dữ liệu từ con trỏ
Trong quá trình này, câu lệnh 'SELECT' được thực thi và các hàng được tìm nạp được lưu trữ trong bộ nhớ được cấp phát. Bây giờ chúng được gọi là tập hợp hoạt động. Tìm nạp dữ liệu từ con trỏ là một hoạt động ở mức bản ghi có nghĩa là chúng ta có thể truy cập dữ liệu theo cách từng bản ghi.
Mỗi câu lệnh tìm nạp sẽ tìm nạp một tập hợp đang hoạt động và giữ thông tin của bản ghi cụ thể đó. Câu lệnh này giống như câu lệnh 'SELECT' tìm nạp bản ghi và gán cho biến trong mệnh đề 'INTO', nhưng nó sẽ không ném ra bất kỳ ngoại lệ nào.
- Đóng con trỏ
Khi tất cả bản ghi được tìm nạp ngay bây giờ, chúng ta cần đóng con trỏ để bộ nhớ được cấp cho vùng ngữ cảnh này sẽ được giải phóng.
Cú pháp:
DECLARECURSORIS
- Trong cú pháp trên, phần khai báo chứa phần khai báo của con trỏ và biến con trỏ trong đó dữ liệu được tìm nạp sẽ được gán.
- Con trỏ được tạo cho câu lệnh 'SELECT' được đưa ra trong phần khai báo con trỏ.
- Trong phần thực thi, con trỏ đã khai báo được mở, tìm nạp và đóng.
Thuộc tính con trỏ
Cả con trỏ ngầm và con trỏ rõ ràng đều có các thuộc tính nhất định có thể được truy cập. Các thuộc tính này cung cấp thêm thông tin về các hoạt động của con trỏ. Dưới đây là các thuộc tính con trỏ khác nhau và cách sử dụng chúng.
Thuộc tính con trỏ | Sự miêu tả |
%TÌM | Nó trả về kết quả Boolean 'TRUE' nếu thao tác tìm nạp gần đây nhất đã tìm nạp một bản ghi thành công, nếu không nó sẽ trả về FALSE. |
%KHÔNG TÌM THẤY | Điều này hoạt động trái ngược với% FOUND, nó sẽ trả về 'TRUE' nếu thao tác tìm nạp gần đây nhất không thể tìm nạp bất kỳ bản ghi nào. |
% ISOPEN | Nó trả về kết quả Boolean 'TRUE' nếu con trỏ đã cho đã được mở, nếu không nó sẽ trả về 'FALSE' |
%ĐẾM SỐ HÀNG | Nó trả về giá trị số. Nó cung cấp số lượng bản ghi thực tế bị ảnh hưởng bởi hoạt động DML. |
Ví dụ 1 : Trong ví dụ này, chúng ta sẽ xem cách khai báo, mở, tìm nạp và đóng con trỏ rõ ràng.
Chúng tôi sẽ chiếu tất cả tên của nhân viên từ bảng emp bằng con trỏ. Chúng tôi cũng sẽ sử dụng thuộc tính con trỏ để thiết lập vòng lặp tìm nạp tất cả bản ghi từ con trỏ.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;END IF;Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name);END LOOP;Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT);CLOSE guru99_det;END:/
Đầu ra
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Giải thích mã:
- Dòng mã 2 : Khai báo con trỏ guru99_det cho câu lệnh 'SELECT emp_name FROM emp'.
- Dòng mã 3 : Khai báo biến lv_emp_name.
- Dòng mã 5 : Mở con trỏ guru99_det.
- Dòng mã 6: Đặt câu lệnh vòng lặp Cơ bản để tìm nạp tất cả các bản ghi trong bảng 'emp'.
- Dòng mã 7: Tìm nạp dữ liệu guru99_det và gán giá trị cho lv_emp_name.
- Dòng mã 9: Sử dụng thuộc tính con trỏ '% NOTFOUND' để tìm xem tất cả bản ghi trong con trỏ có được tìm nạp hay không. Nếu được tìm nạp thì nó sẽ trả về 'TRUE' và điều khiển sẽ thoát khỏi vòng lặp, nếu không điều khiển sẽ tiếp tục tìm nạp dữ liệu từ con trỏ và in dữ liệu.
- Dòng mã 11: Điều kiện EXIT cho câu lệnh lặp.
- Dòng mã 12: In tên nhân viên đã tìm nạp.
- Dòng mã 14: Sử dụng thuộc tính con trỏ '% ROWCOUNT' để tìm tổng số bản ghi bị ảnh hưởng / tìm nạp trong con trỏ.
- Dòng mã 15: Sau khi thoát khỏi vòng lặp, con trỏ được đóng lại và bộ nhớ được cấp phát được đặt trống.
Câu lệnh FOR Loop Cursor
Câu lệnh "FOR LOOP" có thể được sử dụng để làm việc với con trỏ. Chúng ta có thể đặt tên con trỏ thay vì giới hạn phạm vi trong câu lệnh vòng lặp FOR để vòng lặp hoạt động từ bản ghi đầu tiên của con trỏ đến bản ghi cuối cùng của con trỏ. Biến con trỏ, mở con trỏ, tìm nạp và đóng con trỏ sẽ được thực hiện ngầm bởi vòng lặp FOR.
Cú pháp:
DECLARECURSORIS
- Trong cú pháp trên, phần khai báo chứa phần khai báo của con trỏ.
- Con trỏ được tạo cho câu lệnh 'SELECT' được đưa ra trong phần khai báo con trỏ.
- Trong phần thực thi, con trỏ đã khai báo được thiết lập trong vòng lặp FOR và biến vòng lặp 'I' sẽ hoạt động như biến con trỏ trong trường hợp này.
Ví dụ 1 : Trong ví dụ này, chúng ta sẽ chiếu tất cả tên nhân viên từ bảng emp bằng vòng lặp con trỏ-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Đầu ra
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Giải thích mã:
- Dòng mã 2 : Khai báo con trỏ guru99_det cho câu lệnh 'SELECT emp_name FROM emp'.
- Dòng mã 4 : Xây dựng vòng lặp 'FOR' cho con trỏ với biến vòng lặp lv_emp_name.
- Dòng mã 5: In tên nhân viên trong mỗi lần lặp của vòng lặp.
- Dòng mã 8: Thoát khỏi vòng lặp
Lưu ý: Trong vòng lặp Cursor-FOR, không thể sử dụng các thuộc tính con trỏ vì việc mở, tìm nạp và đóng con trỏ được thực hiện ngầm bởi vòng lặp FOR.