原文链接:https://www.gbase.cn/community/post/4377
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
GBase 8s兼容O的PL/SQL编程语言,包括PL/SOL支持的数据类型,变量声明、赋值语法,顺序、选择、循环分支语法,集合、记录对象的使用,静态SQL、动态SQL语法以及错误处理等。本文主要介绍在数据库编程中,静态游标的使用方法。GBase 8s数据库提供了两种类型的静态游标:隐式游标和显式游标。本文将详细介绍GBase 8s中的静态游标,包括它们的使用场景、特点以及如何有效利用它们来提高数据库操作的效率。
静态游标是只读游标,它总是按照打开游标时的原样显示结果集,在编译时就能确定静态游标使用的查询。
隐式游标:
隐式游标无需用户进行定义,每当用户在兼容O模式 的 PL/SQL 程序中执行一个 DML 语句(INSERT、UPDATE、DELETE)或者 SELECT...INTO 语句时,会自动声明一个隐式游标并管理这个游标。
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)返回其它值:影响的行数。
显示游标
1、显示游标的特点:
(1)显式游标由用户构造和管理;
(2)必须声明显示游标,并给他命名和关联一个查询语句;
(3)显示游标不支持赋值,不能在表达式中使用,不能作为子程序的参数或宿主变量使用;
(4)如不得不使用,则选择使用游标变量来实现。
2、使用显示游标的步骤:
(1)定义游标:声明游标及其关联的查询语句;
(2)打开游标:执行游标关联的语句,将查询结果装入游标工作区,将游标定位到结果集的第一行之前;
(3)拨动游标:根据应用需要将游标位置移动到结果集的合适位置;
(4)关闭游标:游标使用完后应关闭,以释放其占有的资源。
3、游标的使用:
游标声明和定义
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;
/
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;
/
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;
/
带参数的游标(调用前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的游标功能,感谢您的阅读。
原文链接:https://www.gbase.cn/community/post/4377
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。