Oracle Con trỏ PL/SQL: Vòng lặp ngầm, rõ ràng, vòng lặp For với ví dụ
⚡ Tóm tắt thông minh
Con trỏ trong Oracle PL/SQL là các con trỏ đến vùng ngữ cảnh chứa các hàng được trả về bởi một câu lệnh SQL. Có hai loại: con trỏ ngầm định, được tạo tự động cho các thao tác DML, và con trỏ tường minh, được khai báo và điều khiển bởi lập trình viên.

CURSOR trong PL/SQL là gì?
Con trỏ là một điểm trỏ đến vùng ngữ cảnh. Oracle tạo ra một khu vực ngữ cảnh để xử lý một SQL Đây là một tuyên bố, và khu vực này chứa tất cả thông tin về tuyên bố đó.
PL / SQL Cho phép lập trình viên kiểm soát vùng ngữ cảnh thông qua con trỏ. Con trỏ lưu giữ các hàng được trả về bởi câu lệnh SQL, và tập hợp các hàng mà con trỏ lưu 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 để có thể tham chiếu đến chúng từ một vị trí khác trong mã.
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 Thao tác DML Khi một thao tác xảy ra trong cơ sở dữ liệu, một con trỏ ngầm định được tạo ra để lưu giữ các hàng bị ảnh hưởng trong thao tác 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 trong mã. Chúng ta chỉ có thể tham chiếu đến con trỏ gần nhất thông qua các thuộc tính của con trỏ.
Con trỏ rõ ràng
Lập trình viên được phép tạo vùng ngữ cảnh được đặt tên để thực hiện các thao tác DML và kiểm soát nó tốt hơn. Con trỏ tường minh cần được định nghĩa trong phần khai báo của đối tượng. Khối PL/SQLVà nó được tạo ra cho câu lệnh SELECT cần được sử dụng trong mã.
Dưới đây là các bước thực hiện khi làm việc với con trỏ tường minh:
- Khai báo con trỏ: Việc khai báo con trỏ đơn giản có nghĩa là tạo ra một vùng ngữ cảnh được đặt tên cho câu lệnh SELECT được định nghĩa trong phần khai báo. Tên của vùng ngữ cảnh này giống với tên con trỏ.
- Mở con trỏ: Việc mở con trỏ hướng dẫn PL/SQL cấp phát bộ nhớ cho con trỏ này. Điều này giúp con trỏ sẵn sàng truy xuất các bản ghi.
- Đang lấy 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 truy xuất sẽ được lưu trữ trong bộ nhớ đã cấp phát. Chúng được gọi là các tập hợp hoạt động. Việc truy xuất dữ liệu từ con trỏ là một hoạt động ở cấp độ bản ghi, có nghĩa là chúng ta có thể truy cập dữ liệu theo từng bản ghi một. Mỗi câu lệnh truy xuất sẽ truy xuất một tập hợp hoạt động và lưu giữ thông tin của bản ghi cụ thể đó. Câu lệnh này giống như một câu lệnh SELECT truy xuất bản ghi và gán 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. trường hợp ngoại lệ.
- Đóng con trỏ: Sau khi tất cả các bản ghi được truy xuất, chúng ta cần đóng con trỏ để giải phóng bộ nhớ được cấp phát cho vùng ngữ cảnh này.
cú pháp
DECLARE CURSOR <cursor_name> IS <SELECT statement>; <cursor_variable declaration>; BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
Trong cú pháp trên, phần khai báo chứa khai báo con trỏ và biến con trỏ mà dữ liệu được truy xuất sẽ được gán vào. Con trỏ được tạo cho câu lệnh SELECT được cung cấp trong phần khai báo con trỏ. Trong phần thực thi, con trỏ đã khai báo được mở, truy xuất và đóng.
Thuộc tính con trỏ
Cả con trỏ ngầm định và con trỏ tường minh đều có một số thuộc tính nhất định có thể truy cập được. Các thuộc tính này cung cấp thêm thông tin về các thao tác của con trỏ. Dưới đây là các thuộc tính khác nhau của con trỏ và cách sử dụng chúng.
| Thuộc tính con trỏ | Mô tả Chi tiết |
|---|---|
| %THÀNH LẬP | Hàm này trả về giá trị Boolean TRUE nếu thao tác truy xuất gần nhất đã truy xuất thành công một bản ghi; ngược lại, nó trả về FALSE. |
| %KHÔNG TÌM THẤY | Chức năng này hoạt động ngược lại với %FOUND. Nó trả về TRUE nếu thao tác truy xuất gần nhất không tìm thấy bản ghi nào. |
| %ISOMỞ | Hàm này trả về giá trị Boolean TRUE nếu con trỏ được chỉ định đã được mở; ngược lại, nó trả về FALSE. |
| %ĐẾM SỐ HÀNG | Trả về một giá trị số cho biết số lượng thực tế các bản ghi bị ảnh hưởng hoặc được truy xuất bởi thao tác này. |
Ví dụ về con trỏ tường minh: Trong ví dụ này, chúng ta sẽ xem cách khai báo, mở, truy xuất và đóng một con trỏ tường minh. Chúng ta sẽ chiếu tất cả tên nhân viên từ bảng emp bằng cách sử dụng con trỏ. Chúng ta cũng sẽ sử dụng thuộc tính con trỏ để thiết lập vòng lặp nhằm truy xuất tất cả các bản ghi từ con trỏ.
Ảnh chụp màn hình bên dưới hiển thị ví dụ con trỏ cụ thể này và kết quả đầu ra của nó trong Oracle.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line('Employee Fetched:'||lv_emp_name); END LOOP; Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT); CLOSE guru99_det; END; /
Đầu ra
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code Giải thích
- Code dòng 2: Khai báo con trỏ guru99_det cho câu lệnh 'SELECT emp_name FROM emp'.
- Code dòng 3: Khai báo biến lv_emp_name với %kiểu được neo vào emp.emp_name.
- Code dòng 5: Mở con trỏ guru99_det.
- Code dòng 6: Thiết lập câu lệnh vòng lặp cơ bản để lấy tất cả các bản ghi trong bảng emp.
- Code dòng 7: Truy xuất dữ liệu guru99_det và gán giá trị cho lv_emp_name.
- Code dòng 8: Sử dụng thuộc tính con trỏ %NOTFOUND để kiểm tra xem tất cả các bản ghi trong con trỏ đã được truy xuất hay chưa. Nếu đã truy xuất, nó trả về TRUE và vòng lặp kết thúc; ngược lại, nó tiếp tục truy xuất dữ liệu từ con trỏ và in ra.
- Code dòng 10: Điều kiện EXIT cho câu lệnh vòng lặp.
- Code dòng 12: In tên nhân viên được tìm nạp.
- Code dòng 14: Sử dụng thuộc tính con trỏ %ROWCOUNT để tìm tổng số bản ghi được con trỏ truy xuất.
- Code dòng 15: Sau khi thoát khỏi vòng lặp, con trỏ được đóng lại và vùng nhớ đã cấp phát được giải phóng.
Câu lệnh con trỏ vòng lặp FOR
Một con trỏ vòng lặp FOR Có thể sử dụng vòng lặp FOR để làm việc với con trỏ. Chúng ta có thể cung cấp 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ỏ, việc mở con trỏ, việc lấy dữ liệu và việc đóng con trỏ đều được thực hiện một cách ngầm định bởi vòng lặp FOR.
cú pháp
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
Trong cú pháp trên, phần khai báo chứa khai báo con trỏ. Con trỏ được tạo cho câu lệnh SELECT được cung cấp 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' hoạt động như biến con trỏ trong trường hợp này.
Oracle Ví dụ về con trỏ trong vòng lặp: Trong ví dụ này, chúng ta sẽ trích xuất tất cả tên nhân viên từ bảng emp bằng cách sử dụng vòng lặp FOR con trỏ.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name); END LOOP; END; /
Đầu ra
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code Giải thích
- Code dòng 2: Khai báo con trỏ guru99_det cho câu lệnh 'SELECT emp_name FROM emp'.
- Code dòng 4: Xây dựng vòng lặp FOR cho con trỏ với biến vòng lặp lv_emp_name.
- Code dòng 6: In tên nhân viên trong mỗi lần lặp của vòng lặp.
- Code dòng 7: Thoát khỏi vòng lặp (END LOOP).
Lưu ý: Trong vòng lặp FOR với con trỏ, các thuộc tính của con trỏ không thể được sử dụng, vì việc mở, lấy và đóng con trỏ được thực hiện một cách ngầm định bởi vòng lặp FOR.

