Implicit cursor và SQL cursor attributes
Oracle tự tạo implicit cursor tên SQL cho mỗi câu DML và SELECT INTO; các attributes của nó cho biết câu lệnh gần nhất đã làm gì.
Implicit cursor
Khi chạy INSERT, UPDATE, DELETE, MERGE hoặc SELECT INTO, Oracle tự mở và đóng cursor nội bộ. Lập trình viên không viết OPEN, FETCH, CLOSE.
Cursor này được truy cập qua tên SQL.
Bốn attributes quan trọng
SQL%ROWCOUNT: số dòng DML gần nhất tác động.SQL%FOUND: TRUE nếu DML tác động ít nhất một dòng.SQL%NOTFOUND: TRUE nếu không có dòng nào bị tác động.SQL%ISOPEN: luôn FALSE vì Oracle tự đóng implicit cursor sau statement.
Phải đọc attributes ngay sau statement cần đo. Một statement SQL khác chạy sau đó sẽ thay trạng thái cursor SQL.
Với SELECT INTO
SELECT INTO thành công thì ROWCOUNT = 1. Nếu 0 dòng hoặc nhiều dòng, exception xảy ra trước khi code phía sau đọc attributes.
SQL%ROWCOUNT tốt để trả affected rows cho API và phát hiện optimistic update không tìm thấy record.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Implicit cursor
Khi chạy INSERT, UPDATE, DELETE, MERGE hoặc SELECT INTO, Oracle tự mở và đóng cursor nội bộ. Lập trình viên không viết OPEN, FETCH, CLOSE.
Cursor này được truy cập qua tên SQL.
Bốn attributes quan trọng
SQL%ROWCOUNT: số dòng DML gần nhất tác động.SQL%FOUND: TRUE nếu DML tác động ít nhất một dòng.SQL%NOTFOUND: TRUE nếu không có dòng nào bị tác động.SQL%ISOPEN: luôn FALSE vì Oracle tự đóng implicit cursor sau statement.
Phải đọc attributes ngay sau statement cần đo. Một statement SQL khác chạy sau đó sẽ thay trạng thái cursor SQL.
Với SELECT INTO
SELECT INTO thành công thì ROWCOUNT = 1. Nếu 0 dòng hoặc nhiều dòng, exception xảy ra trước khi code phía sau đọc attributes.
SQL%ROWCOUNT tốt để trả affected rows cho API và phát hiện optimistic update không tìm thấy record.
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…
Tạo procedure mark_hanoi_adults(p_count OUT NUMBER): UPDATE users SET age = age + 1 WHERE city = 'Hanoi' AND age >= 18, rồi gán SQL%ROWCOUNT vào p_count.
Đang tải trình soạn thảo…
Sau một DELETE, nếu SQL%NOTFOUND thì phát lỗi -20030 'Không có dòng để xóa'.
Đ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)