上面我说过游标与游标变量的区别。游标变量类似于指针,它指向一块内存地址,而不是地址中的内容本身。因此利用ref cursor来进行创建。
在上面我们看到,游标总是指向同一个查询工作区,即is后面的那个查询,而游标变量则不同,它可以指向不同的工作区。特别注意的是,游标和游标变量不能交互使用,即不能在使用游标的地方使用游标变量,也不能在使用游标变量的地方使用游标。
游标变量的声明利用上面我们将的变量声明的第二种,即先声明类型,再将类型赋于游标变量。
类型有强类型和弱类型,强类型需要指定返回类型。因此强类型在编译时会检查类型兼容,继而避免发生错误;而弱类型包容性更强。
强弱类型的游标变量定义如下:
declare
type cv_type is ref cursor return users%rowtype; --强类型
type cv1_type is ref cursor; --弱类型
cv cv_type; --声明游标变量
cv cv1_type;
声明后我们需要打开游标变量。这个操作与游标稍有不同。还记得游标使用open打开吗?而游标变量则使用open for打开的。原因是游标变量是一个指针,你可以将其指定到任意一个查询打开,而游标只能固定地指向一个查询。因此游标变量可以在不关闭的前提下反复打开,只不过之前的查询结果会被抹掉;而游标则不行,需要先关闭再打开。
open cv for select * from users;
下面我写一个存储过程,当为其传不同的值时,游标变量执行不同的查询ÿ