南大通用GBase 8s数据库游标变量解析:提升数据库操作效率

举报
yd_270852549 发表于 2024/11/27 10:50:02 2024/11/27
【摘要】 南大通用GBase 8s兼容oracle的PL/SQL编程语言,PL/SQL 语法需要显式设置环境变量SQLMODE为’ORACLE’后才能生效,默认情况下8s的SQLMODE为’GBASE’,此时不支持 PL/SQL 语法。本文将介绍GBase 8s的Oracle兼容模式中的游标变量,包括它们的使用场景、特点以及如何有效利用它们来提高数据库操作的效率。首先,游标变量和游标是两个不同的概念。...

南大通用GBase 8s兼容oracle的PL/SQL编程语言,PL/SQL 语法需要显式设置环境变量SQLMODE为’ORACLE’后才能生效,默认情况下8s的SQLMODE为’GBASE’,此时不支持 PL/SQL 语法。本文将介绍GBase 8s的Oracle兼容模式中的游标变量,包括它们的使用场景、特点以及如何有效利用它们来提高数据库操作的效率。

首先,游标变量和游标是两个不同的概念。与游标相似,游标变量是指向多行游标查询的结果集的当前行。游标是静态的,游标变量是动态的,同时游标变量并不参与与特定的查询绑定,所以可以为任何兼容的查询打开游标变量,从而提高灵活性。

游标变量的特点
一个游标变量非常像一个显式游标。但也有自己的特性:

游标变量不限于一个查询 。
可以给游标变量赋值 。
可以在表达式中使用游标变量 。
可以作为子程序的参数,可以使用游标变量在子程序之间传递结果集。只限于SYS_REFCURSOR 。
不能接收参数,查询能够包括变量。
创建游标变量
创建游标变量:

定义游标类型,然后声明该类型的变量。
声明SYS_REFCURSOR的变量,一个游标变量被称为REF CURSOR(引用游标)。
REF CURSOR类型基本的语句定义:

TYPE type_name IS REF CURSOR [ RETURN return_type ]
如果指定了return_type,则定义的引用游标变量和声明该类型的变量就是强类型,否则为弱类型。SYS_REFCURSOR类型和他的变量都为弱类型。对于强类型的游标变量,可以把返回指定类型的查询和他关联。对于弱类型的游标变量,可以与任何查询关联。弱类型的引用游标可以互相转换,也可以与SYS_REFCURSOR互相转换。可以将一个强类型的游标变量赋值给一个弱类型的游标变量;只有当2个强类型游标变量具有相同的类型,可以进行赋值。

open for的说明
当其他OPEN FOR 语句使用游标变量时,可以重新打开该游标变量,无需关闭游标变量。重新打开游标变量后,之前与其关联的查询将丢失。当不再需要游标变量时,无须使用CLOSE语句将其关闭,会自动关闭。关闭游标变量后,无法从其结果集中获取数据或引用其属性。可以重新打开已关闭的游标变量。

fetch游标变量获取数据
打开游标变量后,可以使用FETCH语句获取查询结果集的行。

语法格式:

FETCH cursor_variable INTO into_clause
FETCH cursor_variable bulk_collect_into_clause [ LIMIT numeric_expression ]
参数说明:

1) into_clause是变量列表或单个记录变量。对于查询返回的每一列,变量列表或记录必须具有兼容的数据类型。

2) bulk_collect_into_clause 指定一个或多个集合,用于存储FETCH语句返回多行。LIMIT numeric_expression 限制FETCH语句一次检索的行数。FETCH语句检索结果集的当前行,将该行的值存储到变量或记录中,然后将光标前进到下一行。

游标变量的使用
用到的基础表:

create table t (id int, name varchar(10));
insert into t values(1,'Jerry');
insert into t values(2,'Jack');
游标变量声明
DECLARE
   TYPE tcurtyp IS REF CURSOR RETURN t%ROWTYPE;  -- 强游标类型
   TYPE genericcurtyp IS REF CURSOR;               --弱游标类型
   cursor1   tcurtyp;       -- 强游标变量
   cursor2   genericcurtyp;   -- 弱游标变量
   my_cursor SYS_REFCURSOR;  -- 弱游标变量
BEGIN
   NULL;
END;
/


与动态sql结合使用

declare  
   cv SYS_REFCURSOR;
   v_name varchar(10);
   query_1 varchar(200) := 'select name from t';
begin
   open cv for query_1;
   fetch cv into v_name;
    dbms_output.put_line('name = '||v_name);
end;
/


fetch游标到记录类型

declare
   TYPE ty_1 IS REF CURSOR;
   v1 t.id%type;
   v2 t.name%type;
   cursor1 ty_1;
begin
open cursor1 for select * from t;
loop
   fetch cursor1 into v1,v2;
exit when cursor1%notfound;
dbms_output.put_line('id = '||v1||', name = '||v2);
end loop;
close cursor1;    
end;
/


作为存储过程的出入参
注意:只有SYS_REFCURSOR游标变量支持。REF CURSOR不支持。

--当声明一个游标变量作为打开游标变量子程序的参数时 , 必须定义 IN OUT 模式 . 也就是说 , 子程序可以将一个打开的游标变量传递给调用者 。

CREATE OR REPLACE PACKAGE t_data AS
   PROCEDURE open_t_cv (t_cv IN OUT SYS_REFCURSOR);
END t_data;
/

CREATE OR REPLACE PACKAGE BODY t_data AS
   PROCEDURE open_t_cv (t_cv IN OUT SYS_REFCURSOR) IS
   BEGIN
       OPEN t_cv FOR SELECT * FROM t;
   END open_t_cv;
END t_data;
/


游标变量是GBase 8s数据库系统中一个特性,它不仅提高了数据库操作的灵活性和效率,还为开发者提供了更多的编程选项。通过本文的深入解析,我们希望您能够更好地理解和利用游标变量,以提升您的数据库编程技能。如果您对GBase 8s游标变量有更深入的需求或疑问,欢迎继续探索和咨询,我们将为您提供更多的支持和资源。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。