GBase 8s
其他
文章

南大通用GBase 8s 的静态游标介绍

发表于2026-06-10 16:15:07166次浏览19个评论

在数据库应用开发中,游标是实现结果集逐行处理的机制。本文介绍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开发技巧与最佳实践!

评论

登录后才可以发表评论
GBase用户21143发表于 1个月前
隐式显式游标都讲透了,实操案例很实用。
GBase用户50900发表于 1个月前
写得很好,学习了!
GBase用户51966发表于 1个月前
分析得很透彻,学习了。
塔山发表于 1个月前
内容详实,值得收藏。
GBase用户51510发表于 1个月前
写得很好,学习了!
一个老汉发表于 1个月前
写得很好,学习了!
佛洛伊得发表于 1个月前
内容详实,值得收藏。
GBase用户51511发表于 1个月前
不错的文章,受益匪浅。
GBase用户21182发表于 1个月前
讲解了 GBase 8s 静态游标的分类、属性与实操代码,内容详实,很适合入门学习!
GBase用户51829发表于 1个月前
写的很棒,把显示和隐式分析的透彻,学习收藏
gbase0001发表于 1个月前
写的很好,收藏学习
GBase用户51966发表于 1个月前
好文章,支持一下!
GBase用户50900发表于 1个月前
写得真不错,赞一个!
GBase用户51510发表于 1个月前
感谢分享,非常有帮助。
塔山发表于 1个月前
写得很好,学习了!
一个老汉发表于 1个月前
内容详实,值得收藏。
GBase用户51511发表于 1个月前
好文章,支持一下!
佛洛伊得发表于 1个月前
总结得很到位,学习。
用户头像
XX发表于 1个月前
感谢分享