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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率

南大通用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游标变量有更深入的需求或疑问,欢迎继续探索和咨询,我们将为您提供更多的支持和资源。

相关文章
|
3天前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
2天前
|
SQL 存储 Oracle
南大通用GBase 8s 静态游标介绍
GBase 8s 数据 兼容Oracle的PL/SQL编程语言,支持多种数据类型、变量声明及控制结构。本文重点介绍静态游标的使用方法,包括隐式和显式游标。隐式游标自动管理,适用于DML操作;显式游标需手动定义与管理,提供更灵活的数据处理方式。通过合理运用游标,可提高数据库操作效率和代码可维护性。
|
2天前
|
存储 SQL Oracle
南大通用GBase 8s数据库的WITH FUNCTION语句详解
南大通用GBase 8s数据库的WITH FUNCTION语句详解
|
1月前
|
SQL 数据处理 数据库
SQL语句优化与查询结果优化:提升数据库性能的实战技巧
在数据库管理和应用中,SQL语句的编写和查询结果的优化是提升数据库性能的关键环节
|
SQL 存储 缓存
【数据库语言SPL】写着简单跑得又快的数据库语言 SPL
【数据库语言SPL】写着简单跑得又快的数据库语言 SPL
65 0
|
存储 安全 数据库
白话数据库存储过程
白话数据库存储过程
49 0
|
存储 SQL 数据库
数据库视频第九章存储过程(一)
数据库视频第九章存储过程(一)
|
SQL 存储 Java
【数据库05】玩转SQL的高阶特性 1
【数据库05】玩转SQL的高阶特性
|
SQL 存储 Oracle
【数据库05】玩转SQL的高阶特性 2
【数据库05】玩转SQL的高阶特性
|
SQL 存储 Kubernetes
「列式数据库」与其他数据库相比较,YugabyteDB太强了
「列式数据库」与其他数据库相比较,YugabyteDB太强了
下一篇
无影云桌面