Parameterized cursor và cursor FOR LOOP
Parameterized cursor biến query cursor thành template có input, còn cursor FOR LOOP loại bỏ phần lifecycle boilerplate.
Cursor có tham số
CURSOR c_department(p_dept VARCHAR2) IS SELECT ... WHERE department = p_dept;.
Tham số cursor chỉ dùng lúc OPEN hoặc trong cursor FOR LOOP và có scope bên trong query cursor.
Có thể mở cùng cursor nhiều lần với giá trị khác nhau, miễn đã CLOSE lần trước.
Cursor FOR LOOP
FOR r IN c_department('Sales') LOOP ... END LOOP; tự động:
- OPEN cursor.
- FETCH từng dòng vào record
rcó field theo tên cột. - EXIT khi hết dòng.
- CLOSE cursor kể cả khi loop kết thúc hoặc exception truyền ra.
Không cần khai báo biến cho từng cột; dùng r.name, r.salary.
Query FOR LOOP
Có thể bỏ declaration: FOR r IN (SELECT ... ) LOOP. Cách này hợp với query chỉ dùng một lần.
Ưu tiên cursor FOR LOOP cho việc duyệt toàn bộ result set. Dùng explicit OPEN/FETCH khi cần fetch có kiểm soát hoặc truyền handle.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Cursor có tham số
CURSOR c_department(p_dept VARCHAR2) IS SELECT ... WHERE department = p_dept;.
Tham số cursor chỉ dùng lúc OPEN hoặc trong cursor FOR LOOP và có scope bên trong query cursor.
Có thể mở cùng cursor nhiều lần với giá trị khác nhau, miễn đã CLOSE lần trước.
Cursor FOR LOOP
FOR r IN c_department('Sales') LOOP ... END LOOP; tự động:
- OPEN cursor.
- FETCH từng dòng vào record
rcó field theo tên cột. - EXIT khi hết dòng.
- CLOSE cursor kể cả khi loop kết thúc hoặc exception truyền ra.
Không cần khai báo biến cho từng cột; dùng r.name, r.salary.
Query FOR LOOP
Có thể bỏ declaration: FOR r IN (SELECT ... ) LOOP. Cách này hợp với query chỉ dùng một lần.
Ưu tiên cursor FOR LOOP cho việc duyệt toàn bộ result set. Dùng explicit OPEN/FETCH khi cần fetch có kiểm soát hoặc truyền handle.
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_city(p_city VARCHAR2) chọn name, age từ users theo city; dùng FOR r IN c_city('Hanoi') LOOP để in r.name.
Đang tải trình soạn thảo…
Dùng query FOR LOOP trực tiếp để duyệt orders total >= 100 và cộng vào v_sum. Không khai báo cursor riê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)