在Oracle数据库编程中,REF Cursor(参考游标)是一种数据类型,它并不保存具体数据,而是保存一个指向查询结果的指针。通过REF Cursor,存储过程或函数可以把一个打开的查询结果集返回给调用者,调用者再按需读取数据。这种方式比直接返回固定表结构更加灵活,常用于报表接口或复杂查询封装。

什么是REF Cursor
REF Cursor在Oracle中属于游标变量类型,使用REF CURSOR关键字声明。它分为强类型和弱类型两种:强类型REF Cursor指定了返回记录的结构,弱类型则不指定。通常我们会用TYPE ... IS REF CURSOR来自定义一种游标变量类型。
如何声明和使用REF Cursor
下面通过一个简单的PLSQL示例,展示如何声明REF Cursor类型、打开游标并返回给调用者。
-- 定义弱类型REF Cursor
DECLARE
TYPE emp_cur_type IS REF CURSOR;
v_emp_cur emp_cur_type;
v_empno NUMBER;
v_ename VARCHAR2(50);
BEGIN
-- 打开游标,关联查询语句
OPEN v_emp_cur FOR
SELECT empno, ename FROM emp WHERE deptno = 10;
-- 循环获取数据
LOOP
FETCH v_emp_cur INTO v_empno, v_ename;
EXIT WHEN v_emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' - ' || v_ename);
END LOOP;
CLOSE v_emp_cur;
END;
/
在存储过程中返回REF Cursor
实际开发中,常把REF Cursor作为存储过程输出参数,供外部程序调用。示例如下:
CREATE OR REPLACE PROCEDURE get_emp_by_dept(
p_deptno IN NUMBER,
p_result OUT SYS_REFCURSOR
) AS
BEGIN
OPEN p_result FOR
SELECT empno, ename, sal FROM emp WHERE deptno = p_deptno;
END get_emp_by_dept;
/
上述过程使用SYS_REFCURSOR作为弱类型REF Cursor的快捷类型,调用方可以是PLSQL块,也可以是Java的JDBC程序。
Java中通过JDBC调用REF Cursor
在Java里,Oracle的REF Cursor会被当作ResultSet处理。下面给出简化示例:
import java.sql.*;
public class RefCursorDemo {
public static void main(String[] args) throws Exception {
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");
CallableStatement cs = conn.prepareCall("{call get_emp_by_dept(?, ?)}");
cs.setInt(1, 10);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(2);
while (rs.next()) {
System.out.println(rs.getInt("empno") + " " + rs.getString("ename"));
}
rs.close();
cs.close();
conn.close();
}
}
使用注意事项
- 打开REF Cursor后必须关闭,否则会占用数据库资源。
- 弱类型REF Cursor灵活但缺少编译期检查,强类型更安全。
- 在存储过程返回REF Cursor时,调用环境需要支持游标处理,例如JDBC或ODP.NET。
REF Cursor是Oracle实现数据集返回的重要机制,理解其声明、打开与传递方式,有助于编写更清晰的数据库接口。
OracleREF_CursorPLSQL修改时间:2026-07-30 18:45:30