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