南大通用GBase 8s 的静态游标介绍
在数据库应用开发中,游标是实现结果集逐行处理的机制。本文介绍GBase 8s中的静态游标,帮助开发者掌握其原理与使用方法。
静态游标是只读游标,它总是按照打开游标时的原样显示结果集,在编译时就能确定静态游标使用的查询。
静态游标又分为两种:隐式游标和显式游标。
隐式游标无需用户进行定义,每当用户在 PL/SQL 程序中执行一个 DML 语句(INSERT、UPDATE、DELETE)或者 SELECT...INTO 语句时,会自动声明一个隐式游标并管理这个游标。
1.隐式游标
1) 隐式游标的特点
- 隐式游标是由PL/SQL 来管理的, 即不需要声明游标语句, 也不需要OPEN,FETCH,CLOSE 操作
- 隐式游标中必须要有select cur_name into [ 变量名或其他数据类型]. 此句完成OPEN,FETCH,CLOSE 操作.
- 隐式游标只能返回一行记录, 如果无符合条件的记录将会出现NO_DATA_FOUND 异常. 如果出现多条记录将出现TOO_MANY_ROWS 异常.
- 隐式游标只能用SQL% 判断其游标属性
- 对于任何位置使用SQL%ISOPEN 结果都是FALSE, 隐式游标由PL/SQL 管理
- 对于在隐式游标位置前使用SQL%FOUND 或SQL%NOTFOUND, SQL%ROWCOUNT 结果值是NULL( 不确定值)
2) 隐式游标支持的属性
SQL%ISOPEN(1)游标是否打开。
(2)始终返回false,因为隐式游标在关联语句执行完后永远是关闭的。
SQL%FOUND(1)是否有行受影响。
(2)返回NULL:没有select或dml运行
(3)返回TRUE:有返回,影响一行或多行
(4)返回FALSE:其它情况
SQL%NOTFOUND(1)是否没有受影响的行
(2)返回NULL:没有select或dml运行
(3)返回TRUE:其它情况
(4)返回FALSE:有返回,影响一行或多行
SQL%ROWCOUNT(1)返回被影响的行数
(2)返回NULL:没有select或dml运行
(3)其它值:影响的行数
2.显示游标
1) 显示游标的特点:
(1)显式游标由用户构造和管理。
(2)必须声明显示游标,并给他命名和关联一个查询语句。
(3)显示游标不支持赋值,不能在表达式中使用,不能作为子程序的参数或宿主变量使用。
(4)如不得不使用,则选择使用游标变量来实现。
2) 使用显示游标的步骤
(1)定义游标:声明游标及其关联的查询语句;
(2)打开游标:执行游标关联的语句,将查询结果装入游标工作区,将游标定位到结果集的第一行之前;
(3)拨动游标:根据应用需要将游标位置移动到结果集的合适位置;
(4)关闭游标:游标使用完后应关闭,以释放其占有的资源。
3) 游标的使用
(1)游标声明和定义
DECLARE
--声明c1
CURSOR c1 RETURN departments%ROWTYPE;
--声明并定义c2
CURSOR c2 IS SELECT employee_id, job_id, salary FROM employees WHERE salary > 2000;
--定义c1
CURSOR c1 RETURN departments%ROWTYPE IS SELECT * FROM departments WHERE department_id = 110;
--声明c3
CURSOR c3;
--定义c3
CURSOR c3 IS SELECT * FROM locations WHERE country_id = 'JP';
BEGIN
NULL;
END;
/(2)into到普通变量
--创建表
create table t(id int,name varchar(10));
insert into t values(1,'jack');
insert into t values(2,'jerry');
declare
v1 int;
v2 varchar(10);
cursor c1 is select id, name from t;
begin
open c1;
loop
fetch c1 into v1,v2;
exit when c1%notfound;
dbms_output.put_line('id = '||v1);
dbms_output.put_line('name = '||v2);
end loop;
close c1;
end;
/(3)into到record类型变量
--创建表
create table t(id int,name varchar(10));
insert into t values(1,'jack');
insert into t values(2,'jerry');
declare
v t%rowtype;
cursor c1 is select id, name from t;
begin
open c1;
loop
fetch c1 into v;
exit when c1%notfound;
dbms_output.put_line('id = '||v.id);
dbms_output.put_line('name = '||v.name);
end loop;
close c1;
end;
/(4)带参数的游标(调用前open)
--创建表
create table t(id int,name varchar(10));
insert into t values(1,'jack');
insert into t values(2,'jerry');
declare
cursor c (c_id int) is select name from t where id = c_id;
--定义存储过程
procedure p1 is
p_name varchar(10);
begin
loop
fetch c into p_name;
exit when c%notfound;
dbms_output.put_line('result is: '||p_name);
end loop;
end;
begin
open c(2); --打开游标
p1; --调用存储过程
close c; --关闭游标
end;
/以上总结,合理选择游标类型,能够提升GBase 8s存储过程的执行效率和代码可读性。建议开发者根据实际业务场景,灵活运用隐式游标的简洁性和显式游标的可控性。欢迎访问南大通用技术社区,获取更多GBase 8s开发技巧与最佳实践!
评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526