• CURSOR 类型的变量是指向Oracle Server 中用PL/SQL 定义并打开的一个游标。
• 使用CURSOR 类型变量具有以下优点:
Ø 容易管理
ü 查询过程集中化,在数据库服务器的PL/SQL 中打开游标变量,如果需要改变查询过程,只需改变PL/SQL 语句即可,无需改动每个应用程序。
Ø 安全
ü 对特殊的应用,只需给应用程序连接到数据库用户执行存储过程的权限,通过具有访问权限的存储过程访问该数据库用户没有权限访问的表
定义cursor变量:
• 采用SQL_CURSOR 关键字定义cursor 变量
• SQL_CURSOR 要么全部大写,要么全部小写。如:
EXEC SQL BEGIN DECLARE SECTION;
sql_cursor emp_cursor;
SQL_CURSOR dept_cursor;
sql_cursor *ecp;
EXEC SQL END DECLARE SECTION;
ecp=&emp_cursor;
• SQL_CURSOR类型经过proc预编译处理后,也将转换成C语言的一个结构类型
• 可以像VARCHAR类型那样进行函数参数传递等操作
分配cursor变量:
• 在可以使用(OPEN/FETCH)一个CURSOR 变量前,需要用一个ALLOCATE 语句对该变量进行资源分配。例如前面中提到的变量emp_cursor:
Ø EXEC SQL ALLOCATE :emp_cursor;
• ALLOCATE 语句在预编译时给cursor 变量分配堆内存空间,在CLOSE 语句或连接关闭时收回所分配的堆空间
Ø EXEC SQL CLOSE :emp_cursor;
打开cursor变量:
• 打开cursor 变量有两种模式,示例如下:
Ø 使用一个命名的PL/SQL 存储过程
Ø 在Pro*C/C++中使用匿名的PL/SQL 语句块
EXEC SQL EXECUTE
BEGIN
OPEN :emp_cursor FOR SELECT ename FROM emp
WHERE deptno = :dept_num;
END;
END-EXEC;
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;)
{
EXEC SQL FETCH :emp_cursor INTO :emp_name;
printf("%s/n", emp_name);
}
关闭/释放cursor变量:
• 调用“EXEC SQL CLOSE :变量名”语句关闭不需要用的CURSOR
Ø EXEC SQL CLOSE :emp_cursor;
• 可以在应用程序中任意多次的OPEN、FETCH、CLOSE 游标变量,但如果用户断开数据库连接后重新连接到数据库,则必须调用ALLOCATE 对游标变量进行重新的资源分配。
• 释放关闭了的SQL_CURSOR 变量资源,采用EXEC SQL FREE 语句
Ø EXEC SQL FREE :emp_cursor;
• 释放后的游标,如果需要重新使用,需要重新进行ALLOCATE。
cursor变量使用限制:
• 动态SQL 语句中不能使用SQL_CURSOR 类型变量
• 只能对SQL_CURSOR 变量使用ALLOCATE、FETCH、FREE 和CLOSE
• DELCARE CURSOR 命令并不提供SQL_CURSOR 类型的变量
• 不能对一个CLOSE/FREE 的SQL_CURSOR 变量进行FETCH
• 如果预编译器参数MODE=ANSI,则CLOSE 一个已经CLOSE 的游标将引发一个错误产生
• 对ALLOCATE 语句不能采用AT 子句,同理根这个SQL_CURSOR 变量关联的FETCH 和CLOSE 语句也不能采用AT 子句
• SQL_CURSOR 变量不能保存到数据库表中