显式游标¶
显式游标是通过用户显式控制的游标。
在使用显式游标之前,必须显示出游标的名称,游标所关联的返回多行结果集的查询。可以通过如下两种方式来使用游标:
通过OPEN语句打开游标,通过FETCH语句来获取游标中的结果集,通过CLOSE语句来关闭游标。
在FOR LOOP循环语句中使用显式游标。
除非通过游标变量,否则在使用显式游标时,不能对其进行赋值操作,不能在表达式中使用,不能将其当成子程序或者宿主变量使用。
与隐式游标不同的是,用户可以通过名称来引用显式游标或者游标变量,因此显式游标或游标变量又被称作命名游标。
声明并定义显示游标¶
在声明显式游标的时候可以定义显式游标,也可将定义放到后面相同的块、子程序、包或声明中去。
语法:
声明显式游标:
cursor_decl ::=
定义显式游标:
cursor_define ::=
参数:
cursor_name 游标名称
parameter_list 游标参数
return_type 游标返回类型
select_statement 定义游标查询语句
说明:
如果将显式游标声明语句放到前面,那么游标定义语句定义游标内容,否则声明和定义在同一条语句中完成。
打开和关闭显式游标¶
可以通过OPEN语句打开一个已经声明并定义的显式游标,用以:
- 分配数据库资源用以处理游标中的查询。
- 处理查询:
- 确认查询结果集:如果查询中引用了查询变量或者游标参数,那么变量或参数的值会对结果集产生影响。
- 如果查询语句中有FOR UPDATE语句,则锁定查询结果集所在的行。
- 将游标指针指向结果集中的第一行。
语法:
打开游标:
open_cursor ::=
关闭游标:
close_cursor ::=
参数:
cursor 显式游标名称
cursor_parameter 游标参数
actual_cursor_parameter 被打开游标的实际参数列表,参数可以是常量、被初始化的变量、字面值或者表达式,实参列表必须和相应的形参列表相兼容
cursor_parameter 一个被打开的游标变量名称
cursor_parameter 在PLOSCAR宿主环境中声明并作为参数被绑定到PLOSCAR中的游标变量名称。
说明:
可以通过CLOSE语句关闭一个已经打开的显式游标,以使其所占用的资源得以被释放并能被重用。游标关闭后,不能再从结果集中提取数据或者引用游标的属性,否则数据库会抛出已定义的异常。
也可以重新打开一个已经关闭的游标,但是在重新打开游标之前,必须确保显式游标已经关闭,否则数据库同样会抛出相应的异常提示。
从显式游标中获取数据¶
在打开显式游标后,可以通过FETCH语句从查询的结果集中提取需要的数据。
语法:
fetch_into ::=
参数:
cursor_name 游标名称
into_clause 用来存储从结果集中筛选的结果,可以是和结果集相兼容的变量列表或者是一个单独的RECORD记录变量。
说明:
在FETCH语句中,可以通过使用%TYPE和%ROWTYPE来保证结果集和参数列表之间的类型兼容。
FETCH取出结果集中的当前行,并将其存储到变量列表或者记录中,与此同时游标自动向下移动一行。
当在LOOP语句中使用FETCH语句时,操作会在FETCH游标移动到结果集的末尾之后结束。此时可以通过游标属性%NOTFOUND来检测退出条件。此时当FETCH语句返回空行时,PLOSCAR不会抛出异常提示。
显式游标查询条件中的变量¶
显式游标的查询语句可以引用任意变量。当打开一个显式游标时,PLOSCAR计算查询语句中的变量值并在计算结果集的时候予以替换。在以后更改变量的值并不会影响当前的查询结果集。
适当的显式游标查询语句列别名¶
当显式游标的查询包含一个需要计算才能获取结果的列,也就是一个表达式的时候,要满足下列情况之一者,该列必须使用列别名:
需要用此游标将结果集提取到一个被%ROWTYPE所声明的记录中。
在程序中引用被计算的列。
接收参数的显式游标¶
可以创建带有参数的显式游标,每次打开游标的时候通过传入不同的实际参数值以获取不同的结果集。在查询语句的内部,可以在任意能够使用常量的地方使用参数。在查询语句之外,不能对游标中的参数进行引用。
参数带有默认值
当创建参数带有默认值的显式游标时,参数的实际参数值是可选的,如果提供,则默认值被覆盖,如果不提供,则使用默认值。
给游标增加带有默认值的参数
当给游标增加参数,如果增加的参数都带有默认参数值,则不必修改现有的对游标的引用,他们会使用参数的默认值。
显式游标的属性¶
语法:
cursor_attr ::=
参数:
cursor_name 显式游标的名称
cursor_attribute 显式游标的属性
说明:
显式游标和游标变量具有相同的属性,如果游标没有被打开,那么对游标的任意属性的访问都会引起数据库异常的抛出。
显式游标的属性主要有如下几种:
%ISOPEN Attribute: 游标是否打开;
如果游标处于打开状态,其返回值为TRUE,否则返回值为FALSE。
主要用于以下情况:
- 当试图打开一个游标之前检测游标是否已经被打开。
- 当试图关闭一个游标之前检测游标是否已经被打开。
%FOUND Attribute: 是否有结果被提取
主要用于检测是否有被提取出需要处理的行。
- 在显式游标被打开后,在首次提取数据之前,其返回值为NULL;
- 如果最近的提取能够返回一行数据,那么其返回值为TRUE;
- 上诉情况以外的其他情况返回值为FALSE;
%NOTFOUND Attribute: 是否没有结果被提取;
在逻辑上和%FOUND处于相反状态。
主要用于在FETCH语句提取失败的时候推出LOOP循环语句。
- 显式游标被打开之后,在首次提取数据之前,其返回值为NULL;
- 如果最近的提取能够返回一行数据,那么其返回值为FALSE;
- 上诉情况以外的其他情况返回值为TRUE;
%ROWCOUNT Attribute: 提取的结果集有多少行;
在显式游标被打开后,在首次提取数据之前,其返回值为零;其他情况下,其返回值为具体提取的结果集的行数。