Explicit cursor — OPEN / FETCH / CLOSE
Explicit cursor cho phép PL/SQL đọc một query nhiều dòng từng record một, nhưng lập trình viên phải quản lý đúng OPEN, FETCH và CLOSE.
Lifecycle
1. CURSOR c IS SELECT ... khai báo query nhưng chưa chạy.
2. OPEN c chạy query và tạo active result set.
3. FETCH c INTO ... đọc dòng hiện tại rồi tiến con trỏ.
4. EXIT WHEN c%NOTFOUND dừng sau lần FETCH không còn dòng.
5. CLOSE c giải phóng cursor.
Cursor attributes
c%ISOPEN: cursor đang mở hay không.c%ROWCOUNT: số lần FETCH thành công.c%FOUND/c%NOTFOUND: trạng thái của FETCH gần nhất.
Phải FETCH trước rồi mới kiểm tra %NOTFOUND. Nếu kiểm tra trước FETCH, loop có thể xử lý sai hoặc chạy vô hạn.
Khi nào dùng?
Dùng explicit cursor khi cần kiểm soát lifecycle hoặc fetch theo batch. Nếu chỉ loop đơn giản, cursor FOR LOOP ngắn và an toàn hơn.
Luôn CLOSE cursor ở mọi đường đi, kể cả khi exception. Cursor FOR LOOP giúp tránh phần cleanup thủ công này.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Lifecycle
1. CURSOR c IS SELECT ... khai báo query nhưng chưa chạy.
2. OPEN c chạy query và tạo active result set.
3. FETCH c INTO ... đọc dòng hiện tại rồi tiến con trỏ.
4. EXIT WHEN c%NOTFOUND dừng sau lần FETCH không còn dòng.
5. CLOSE c giải phóng cursor.
Cursor attributes
c%ISOPEN: cursor đang mở hay không.c%ROWCOUNT: số lần FETCH thành công.c%FOUND/c%NOTFOUND: trạng thái của FETCH gần nhất.
Phải FETCH trước rồi mới kiểm tra %NOTFOUND. Nếu kiểm tra trước FETCH, loop có thể xử lý sai hoặc chạy vô hạn.
Khi nào dùng?
Dùng explicit cursor khi cần kiểm soát lifecycle hoặc fetch theo batch. Nếu chỉ loop đơn giản, cursor FOR LOOP ngắn và an toàn hơn.
Luôn CLOSE cursor ở mọi đường đi, kể cả khi exception. Cursor FOR LOOP giúp tránh phần cleanup thủ công này.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Oracle PL/SQL. Browser không có Oracle Server; editor dùng dialect PL/SQL và nút bên dưới chạy mô phỏng trên dữ liệu mẫu.
Đang tải trình soạn thảo…
Khai báo cursor c_hanoi chọn id, name từ users WHERE city = 'Hanoi'; OPEN, FETCH vào v_id/v_name rồi CLOSE.
Đang tải trình soạn thảo…
Hoàn thiện loop explicit cursor: FETCH c_orders INTO v_id, EXIT WHEN c_orders%NOTFOUND và tăng v_count sau mỗi dòng.
Đang tải trình soạn thảo…
- Chạy thử truy vấn mẫu
- Hoàn thành bài tập (0/2)