返回首页

gbase数据、南大通用产品文档:GBase8sRETURN

更新日期:2024年09月11日

使用 RETURN 语句来指定 SPL 函数将哪些值(如果有的话)返回给调用上下
文。
语法

用法
在 GBase 8s 中,对于向后兼容性,您可以在 CREATE PROCEDURE 语句中使
用 RETURN 语句创建 SPL 函数。然而,通过在 CREATE FUNCTION 语句中

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1237
只使用 RETURN ,您可以保留使用 CREATE FUNCTION 来定义返回值的例程
的约定,并为其它例程保留 CREATE PROCEDURE。
SPL 函数中的所有 RETURN 语句必须和定义该函数的 CREATE FUNCTION
(或 CREATE PROCEDURE)语句的 RETURNING 子句相一致。表达式的任何
RETURN 列表在基数上必须与函数定义的 RETURNING 子句的数据类型的有序
列表相匹配,并且在数据类型方面必须与其兼容。
或者,即使 RETURNING 子句列出了一个或多个数据类型,RETURN 语句也不
能指定表达式。在这种情况下,没有指定表达式的 RETURN 语句等于将预期的
NULL 值的数目返回给调用上下文。只有将 SPL 函数声明为不返回任何值时,
不带有任何表达式的 RETURN 语句才可以存在。否则,它返回 NULL 值。
以下 SPL 函数有两个有效的 RETURN 语句:
CREATE FUNCTION two_returns (stockno INT) RETURNING CHAR (15);
DEFINE des CHAR(15);
ON EXCEPTION (-272) -- if user does not have select privilege
RETURN; -- return no values.
END EXCEPTION;
SELECT DISTINCT descript INTO des FROM stock
WHERE stock_num = stockno;
RETURN des;
END FUNCTION;
在前面的示例中调用函数的程序应测试是否没有返回值并进行相应的操作。
WITH RESUME 关键字
如果使用 WITH RESUME 关键字,则在执行 RETURN 语句后,SPL 函数的下
一个调用(对下一个 FETCH 或 FOREACH 语句)从跟随 RETURN 语句的语
句开始。任何执行 RETURN WITH RESUME 语句的函数必须在 FOREACH 循
环或 SELECT 的 FROM 子句中被调用。如果 SPL 例程执行 RETURN WITH
RESUME 语句,则 GBase 8s ESQL/C 应用程序中的 FETCH 语句可以调用 SPL
例程。
以下示例显示另一个 UDR 可调用的游标函数。在 RETURN WITH RESUME 语句将每
个值返回到调用的 UDR 或程序后,在下一次调用 series 时执行 series 的下一

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1238
行。如果变量 backwards 等于零(0),则没有值返回给调用的 UDR 或程序,并
停止 series 的执行:
CREATE FUNCTION series (limit INT, backwards INT) RETURNING INT;
DEFINE i INT;
FOR i IN (1 TO limit)
RETURN i WITH RESUME;
END FOR;
IF backwards = 0 THEN
RETURN;
END IF;
FOR i IN (limit TO 1 STEP -1)
RETURN i WITH RESUME;
END FOR;
END FUNCTION; -- series
从另一个数据库返回值
如果 SPL 函数使用 Return 子句从本地 GBase 8s 实例的另一个数据库返回值,
则支持将以下数据类型作为返回的数据类型:

不透明的内置数据类型

大多数内置透明数据类型,在跨数据库事务中的数据类型 中列出

以上两行中引用的内置类型的 DISTINCT

此列表中任何 DISTINCT 数据类型的 DISTINCT

显式转换为此列表中某个内置数据类型的任何不透明用户定义类型
(UDT)。
UDF 以及类型层次结构、转型、DISTINCT 类型和 UDT 的定义在每个参与数据
库中必须完全相同。相同的数据类型限制适用于外部函数从本地 GBase 8s 实例
的另一个数据库返回的值。有关跨同一数据库服务器的两个或多个数据库的分布
式操作中支持的数据类型的详细信息,请参阅跨数据库事务中的数据类型。
UDR 从另一个数据库服务器的表中只能返回以下数据类型:

任何不透明的内置数据类型

BOOLEAN

LVARCHAR

不透明数据类型 DISTINCT

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1239

BOOLEAN DISTINCT

LVARCHAR DISTINCT

此列表中出现的任何 DISTINCT 类型的 DISTINCT
只有在 DISTINCT 类型显式转换为内置类型时,UDR 才能从其它 GBase 8s 实
例的数据库返回这些 DISTINCT 类型。DISTINCT 数据类型的定义,它们的类型
层次结构,以及它们的强制转型在参与分布式操作的数据库中必须完全相同。对
于使用上一列表中的数据类型作为参数或返回数据类型的跨服务器 UDR 中的查
询或其它 DML 操作,必须在每个参与数据库中定义 UDR ,参与的 GBase 8s
实例必须支持数据类型为跨服务器操作中的返回值。
有关 GBase 8s 可在分布式操作中访问的数据类型的其它信息,请参阅分布式查
询中的数据类型。
外部函数和迭代器函数
在 SPL 程序中,如果外部函数不是迭代器函数,则可以使用 C 或 Java™ 语言
外部函数作为 RETURN 语句的表达式。迭代器函数是返回一行或多行数据的外
部函数(因而需要游标来执行)。
SPL 迭代函数必须包含 RETURN WITH RESUME 语句。有关在查询的 FROM
子句中通过虚拟表接口使用迭代器函数的信息,请参阅迭代器函数。

使用负载均衡连接池
若要使用负载均衡连接池功能,需要在连接串中配置相关的关键字。有关
更详细的关键字信息在5.1.1 章节“表5-1 连接参数表”中介绍。
假设存在如下场景:

现有集群中存在4 个节点:

如果需要将大量数据赋值给变量,建议使用带BULK COLLECT的SELECT INTO 语句。
该语句或者整个结果集到一个或多个集合变量中。
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
DROP TABLE IF EXISTS t4;
DROP TABLE IF EXISTS t5;
DROP TABLE IF EXISTS t6;

CREATE TABLE t1(id INT, col VARCHAR(30));
CREATE TABLE t2(id INT, col VARCHAR(30));
CREATE TABLE t3(id INT, col VARCHAR(30));
CREATE TABLE t4(id INT, col VARCHAR(100), nid INT);
CREATE TABLE t5(id int, col1 VARCHAR(100), col2 DATE, col3 FLOAT);

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 106 -

CREATE TABLE t6(id int, col1 VARCHAR(100), col2 DATE, col3 FLOAT, nid INT);

INSERT INTO t5 VALUES(1, 'abc123', '2018-04-13', 3.14);
INSERT INTO t5 VALUES(1, 'def123def', '2018-04-17', 4.14);
INSERT INTO t5 VALUES(5, 'order by test', '2018-04-15', 6.28);
INSERT INTO t5 VALUES(12, 'testwhere', '2018-04-15', 12.56);

DROP PROCEDURE IF EXISTS pro4;

CREATE OR REPLACE PROCEDURE p_6_16 AS
TYPE ty1 IS TABLE OF INT INDEX BY PLS_INTEGER;
TYPE ty2 IS TABLE OF VARCHAR(30) INDEX BY PLS_INTEGER;
TYPE ty3 IS TABLE OF DATE INDEX BY PLS_INTEGER;
TYPE ty4 IS TABLE OF FLOAT INDEX BY PLS_INTEGER;
v_id ty1;
v_col1 ty2;
v_col2 ty3;
v_col3 ty4;
i int :=1;
BEGIN
SELECT id,col1,col2,col3 bulk collect INTO v_id,v_col1,v_col2,v_col3 FROM t5;
while i<=v_id.count loop
insert into t6 values(v_id(i),v_col1(i),v_col2(i),v_col3(i),1000);
i:=i+1;
end loop;
exception
when too_many_rows then
insert into t2 values(1,'too many rows');
when no_data_found then
insert into t2 values(1,'no data found');
end;

DELETE FROM t6;
DELETE FROM t2;
CALL pro4();
SELECT COUNT(*) FROM t6;
SELECT * FROM t6;
SELECT * FROM t2;
END;