SYS_REFCURSOR — trả result set cho caller
SYS_REFCURSOR là weak ref cursor thường dùng để trả một result set nhiều dòng từ PL/SQL sang application hoặc block gọi.
Ref cursor khác explicit cursor
Explicit cursor gắn với query cố định trong declaration. Ref cursor là biến/handle có thể được OPEN ... FOR một query lúc runtime.
SYS_REFCURSOR là weak type: nhiều query có shape khác nhau có thể gắn vào cùng kiểu handle.
Ownership
Procedure mở cursor và trả handle qua OUT. Caller sở hữu handle sau đó: FETCH cho tới %NOTFOUND và CLOSE.
Nếu caller quên CLOSE, session giữ tài nguyên và có thể chạm giới hạn OPEN_CURSORS.
Static và dynamic OPEN FOR
- Static:
OPEN p_result FOR SELECT ... WHERE city = p_city;. - Dynamic:
OPEN p_result FOR v_sql USING p_value;với bind variables.
Không nối trực tiếp input vào dynamic SQL; luôn dùng bind để tránh SQL Injection.
Application integration
Oracle drivers thường map SYS_REFCURSOR thành ResultSet/DataReader. Transaction và connection phải còn sống trong lúc consumer đọc.
Ref cursor phù hợp khi API database cần trả nhiều dòng. Với một scalar, OUT parameter hoặc function đơn giản hơn.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Ref cursor khác explicit cursor
Explicit cursor gắn với query cố định trong declaration. Ref cursor là biến/handle có thể được OPEN ... FOR một query lúc runtime.
SYS_REFCURSOR là weak type: nhiều query có shape khác nhau có thể gắn vào cùng kiểu handle.
Ownership
Procedure mở cursor và trả handle qua OUT. Caller sở hữu handle sau đó: FETCH cho tới %NOTFOUND và CLOSE.
Nếu caller quên CLOSE, session giữ tài nguyên và có thể chạm giới hạn OPEN_CURSORS.
Static và dynamic OPEN FOR
- Static:
OPEN p_result FOR SELECT ... WHERE city = p_city;. - Dynamic:
OPEN p_result FOR v_sql USING p_value;với bind variables.
Không nối trực tiếp input vào dynamic SQL; luôn dùng bind để tránh SQL Injection.
Application integration
Oracle drivers thường map SYS_REFCURSOR thành ResultSet/DataReader. Transaction và connection phải còn sống trong lúc consumer đọc.
Ref cursor phù hợp khi API database cần trả nhiều dòng. Với một scalar, OUT parameter hoặc function đơn giản hơn.
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 open_big_orders(p_min_total IN NUMBER, p_result OUT SYS_REFCURSOR) mở p_result cho orders total >= p_min_total.
Đang tải trình soạn thảo…
Viết caller nhận v_result từ open_big_orders(100), FETCH id/product/total trong LOOP, EXIT WHEN %NOTFOUND và CLOSE.
Đ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)