返回首页

gbase数据、南大通用产品文档:GBase8s修改环境变量设置

更新日期:2024年09月11日

有时必须向已设置的环境变量添加信息。
例如,
在 UNIX™ 中始终会设置 PATH 环境
变量。在使用 GBase 8s 产品时,必须向 PATH 设置添加存储 GBase 8s 产品的可执行文
件的目录的名称。
在以下示例中,GBASEDBTDIR 为 /usr/gbasedbt。(即,在安装期间,GBase
8s 产品
安装在 /usr
/gbasedbt 目录中。

可执行文件在 bin 子目录中,
即 /usr/gbasedbt/bin。
要将此目录添加在 C shell PATH 环境变量之前,使用以下命令:
setenv PATH /usr/gbasedbt/bin:$PATH
可使用 GBASEDBTDIR 环境变量的值
(表示为 $GBASEDBTDIR)
而不是输入显式路径名,
如以下示例所示:
setenv GBASEDBTDIR /usr/gbasedbt
setenv PATH $GBASEDBTDIR/bin:$PATH
您可能更倾向于使用此版本以确保 PATH 条目不会与在 GBASEDBTDIR 中设置的搜索
路径相冲突,这样您无需在每次更改 GBASEDBTDIR 时重置 PATH。如果在 C
shell 命令行
上设置 PATH 环境变量,
那么可能需要为现有的 GBASEDBTDIR 和 PATH 加上花括号 (
{}
),
如以下命令所示:
setenv PATH ${GBASEDBTDIR}/bin:${PATH}
有关如何设置和修改环境变量的更多信息,请参阅操作系统的出版物。

您必须首先决定您正在创建的例程是否返回值。如果例程不返回值,则使用 CREATE
PROCEDURE 语句来创建一个 SPL 过程。如果例程返回一个值,则使用 CREATE
FUNCTION 语句来创建一个 SPL 函数。
要创建 SPL 例程,请使用一个 CREATE PROCEDURE 或 CREATE FUNCTION 语句来
编写该例程体,并注册它。

开始和结束例程
要创建不返回值的 SPL 例程,请使用 CREATE PROCEDURE 语句开始,并以 END
PROCEDURE 关键字结束。下图展示如何开始和结束 SPL 过程。
图: 开始和结束 SPL 例程。
CREATE PROCEDURE new_price( per_cent REAL )
. . .
END PROCEDURE;
要获取关于命名约定的更多信息,
请参阅
《GBase 8s SQL 指南:
语法》
中的
“标识符”
段。

要创建返回一个或多个值的 SPL 函数,请使用 CREATE FUNCTION 语句开始,并以
END FUNCTION 关键字结束。 下图展示如何开始和结束 SPL 函数。
图: 开始和结束 SPL 函数。
CREATE FUNCTION discount_price( per_cent REAL)

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 258 -

RETURNING MONEY;
. . .
END FUNCTION;
在 SPL 例程中,END PROCEDURE 或 END FUNCTION 关键字是必需的。
重要: 为了与较早的 GBase 8s 产品相兼容,您可使用带有 RETURNING 子句的 CREATE
PROCEDURE 来创建返回值的用户定义的例程。
然而,
如果您对于不返回值的 SPL 例程
(SPL
过程)使用 CREATE PROCEDURE,而对于返回一个或多个值的 SPL 例程(SPL 函数)使用
CREATE FUNCTION,则您的代码会更易于阅读和维护,

指定例程名称
紧跟在 CREATE PROCEDURE 或 CREATE FUNCTION 语句之后,且在参数列表之前为
SPL 例程指定名称,如图所示。
图: 为 SPL 例程指定名称。
CREATE PROCEDURE add_price (arg INT )
GBase 8s 允许您以相同的名称但以不同的参数创建多个 SPL 例程。此特性称为例程重载。
例如,您可能在您的数据库中创建下列每一 SPL 例程:
CREATE PROCEDURE multiply (a INT, b FLOAT)
CREATE PROCEDURE multiply (a INT, b SMALLINT)
CREATE PROCEDURE multiply (a REAL, b REAL)
如果您以名称 multiply() 调用例程,
则数据库服务器评估该例程的名称和它的参数来确定执
行哪个例程。
例程解析是数据库服务器在其中搜索它可使用的例程签名,给定例程的名称和参数列表的
过程。每个例程都有一个基于下列信息唯一地标识该例程的签名:

例程的类型(过程或函数)

例程名称

参数的数目

参数的数据类型

参数的顺序
如果您输入该例程的完整参数列表,则在 CREATE、DROP 或 EXECUTE 语句中使用该
例程签名。例如,下图中的每一语句都使用例程签名。
图: 例程签名。
CREATE FUNCTION multiply(a INT, b INT);

DROP PROCEDURE end_of_list(n SET, row_id INT);

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 259 -


EXECUTE FUNCTION compare_point(m point, n point);

添加特定的名称
由于 GBase 8s 支持例程重载,因此,不可能单独通过 SPL 例程的名称来唯一地标识它。
然而,可通过特定的名称来唯一地标识例程。除了例程名称之外,特定的名称是您在
CREATE PROCEDURE 或 CREATE FUNCTION 语句中定义的唯一的标识符。使用
SPECIFIC 关键字来定义特定的名称,
且该名称在数据库中是唯一的。
在同一数据库中,

可有两个相同的特定的名称,即使它们有不同的所有者也不行。
特定的名称最长可达 128 字节。下图展示如何在创建 calculate() 函数的 CREATE
FUNCTION 语句中定义特定的名称 calc1。
图: 定义特定的名称。
CREATE FUNCTION calculate(a INT, b INT, c INT)
RETURNING INT
SPECIFIC calc1;
. . .
END FUNCTION;
由于所有者 bsmith 已给定了 SPL 函数特定的名称 calc1,因此任何其他用户都不可使用特
定的名称 calc1 来定义例程——SPL 或外部的。现在,您可引用该例程为 bsmith.calculate,
或在任何需要 SPECIFIC 关键字的语句中使用 SPECIFIC 关键字 calc1。

添加参数列表
当您创建 SPL 例程时,您可定义参数列表,以便当调用例程时,它接受一个或多个参数。
参数列表是可选的。
SPL 例程的参数必须有名称,且可使用缺省值来定义。下列是参数可指定的数据类型的种
类:

内建的数据类型

Opaque 数据类型

Distinct 数据类型

Row 类型

集合类型

智能大对象(CLOB 和 BLOB)
参数列表不可直接地指定任一下列数据类型:

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 260 -


SERIAL

SERIAL8

BIGSERIAL

TEXT

BYTE
然而,对于序列数据类型,例程可返回在数值上对等的值,将它们强制转型为对应的整数
类型(INT、INT8 或 BIGINT)。类似地,对于支持简单大对象数据类型的例程,参数列
表可包括 REFERENCES 关键字来返回指向 TEXT 或 BYTE 对象的存储位置的描述符。

下图展示参数列表的示例。
图: 不同的参数列表的示例。
CREATE PROCEDURE raise_price(per_cent INT);

CREATE FUNCTION raise_price(per_cent INT DEFAULT 5);

CREATE PROCEDURE update_emp(n employee_t);
CREATE FUNCTION update_nums( list1 LIST(ROW (a
VARCHAR(10),
b VARCHAR(10),
c INT) NOT NULL ));
当您定义参数时,同时完成两个任务:

当执行例程时,您请求用户提供值。

您隐式地定义您可在例程体中用作本地变量的变量
(带有与参数名称相同的名称)


如果您以缺省值定义参数,
则用户可使用或不用对应的参数来执行该 SPL 例程。
如果用户
执行不带参数的 SPL 例程,则数据库服务器指定参数的缺省值作为参数。
当您调用 SPL 例程时,
您可对参数给定 NULL 值。
在缺省情况下,
SPL 例程处理 NULL
值。然而,如果参数为集合元素,则您不可对该参数给定 NULL 值。
简单大对象作为参数
虽然您不可使用简单大对象(包含 TEXT 或 BYTE 数据类型的大对象)来定义参数,但
您可使用 REFERENCES 关键词来定义指向简单大对象的参数,如下图所示。
图: REFERENCES 关键字的使用。
CREATE PROCEDURE proc1(lo_text REFERENCES TEXT)

CREATE FUNCTION proc2(lo_byte REFERENCES BYTE DEFAULT
NULL)

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 261 -

REFERENCES 关键字意味着将包含指向简单大对象的指针的描述符传给 SPL 例程,
而不
是传对象本身。
未定义的参数
当您调用 SPL 例程时,
您可指定全部或部分已定义的参数,
或不指定参数。
如果您未指定
参数,
且如果它的对应的参数没有缺省值,
则给定在 SPL 例程内作为变量使用的该参数的
状态为未定义的。
未定义是为没有值的 SPL 变量使用的特殊的状态。
只要您在该例程体中不尝试使用状态为
未定义的变量,该 SPL 例程就不会出错。
未定义的状态与 NULL 值不一样。(NULL 值意味着该值为未知的,或不存在,或不适
用。)

添加返回子句
如果您使用 CREATE FUNCTION 来创建 SPL 例程,您必须指定返回一个或多个值的返
回子句。
提示: 如果您使用 CREATE PROCEDURE 语句来创建 SPL 例程,则您有指定返回子句的选
项。然而,如果您使用 CREATE FUNCTION 语句来创建返回值的例程,则您的代码会比较易
读且易于维护。
要指定返回子句,请使用带有该例程将返回的数据类型的列表的 RETURNING 或
RETURNS 关键字。
数据类型可为除了 SERIAL、
SERIAL8、
TEXT 或 BYTE 之外的任何
SQL 数据类型。
下图中的返回子句指定,该 SPL 例程将返回 INT 值和 REAL 值。
图: 指定返回子句。
FUNCTION find_group(id INT)
RETURNING INT, REAL;
. . .
END FUNCTION;
在您指定返回子句之后,您还必须在例程体中指定 RETURN 语句,显式地返回调用例程
的值。要获取关于编写 RETURN 语句的更多信息,请参阅从 SPL 函数返回值。
要指定应返回简单大对象(TEXT 或 BYTE 值)的函数,您必须使用 REFERENCES 子
句,如下图所示,这是因为 SPL 例程仅返回指向该对象的指针,而不是该对象本身。
图: 使用 REFERENCES 子句。
CREATE FUNCTION find_obj(id INT)
RETURNING REFERENCES BYTE;


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 262 -

添加显示标签
您可使用 CREATE FUNCTION 来创建例程,其为返回的值指定显示标签的名称。如果您
未为显示标签指定名称,则该标签会显示为 expression。
此外,虽然对于返回值的例程推荐使用 CREATE FUNCTION,但您可使用 CREATE
PROCEDURE 来创建返回值的例程,并指定返回的值的显示标签。
如果您选择为一个返回值指定显示标签,则您必须为每个返回值指定显示标签。此外,每
一返回值必须有唯一的显示标签。
要添加显示标签,
您必须指定返回子句,
请使用 RETURNING 关键字。
下图中的返回子句
指定该例程将返回一个带有 serial_num 显示标签的 INT 值,一个带有 name 显示标签的
CHARE 值,以及一个带有 points 显示标签的 INT 值。您可使用下图中的 CREATE
FUNCTION 或 CREATE PROCEDURE。
图: 指定返回子句。
CREATE FUNCTION p(inval INT DEFAULT 0)
RETURNING INT AS serial_num, CHAR (10) AS name, INT AS points;
RETURN (inval + 1002), "Newton", 100;
END FUNCTION;
在下图中展示返回的值和它们的显示标签。
图: 返回的值和它们的显示标签。
serial_num name points

1002 Newton 100
提示:
由于您可在 SELECT 语句中直接地为返回值指定显示标签,
因此,
当在 SELECT 语
句中使用 SPL 例程时,该标签会显示为 expression。要获取关于在 SELECT 语句中为返
回值指定显示标签的更多内容,请参阅 编写 SELECT 语句。

指定 SPL 函数是否为变体
当您创建 SPL 时,在缺省情况下,该函数为变体。当使用相同的参数调用函数时,如果它
返回不同的结果,或如果它修改数据库或变量状态,则该函数为变体。例如,返回当前的
日期或时间的函数是变体函数。
虽然在缺省情况下,
SPL 函数为变体,
但如果当您创建函数时指定 WITH NOT VARIANT,
则该函数不可包含任何 SQL 语句。您仅可在非变体函数上定义函数索引。

添加修饰符

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 263 -

当您编写 SPL 函数时,
您可使用 WITH 子句来将修饰符添加到 CREATE FUNCTION 语
句。在 WITH 子句中,您可指定 COMMUTATOR 或 NEGATOR 函数。其他修饰符是用
于外部例程的。
限制: 您仅可以 SPL 函数使用 COMMUTATOR 或 NEGATOR 修饰符。您不可以 SPL 过
程使用任何修饰符。
COMMUTATOR 修饰符
COMMUTATOR 修饰符允许您指定 SPL 函数为您正在创建的 SPL 函数的转换函数。转
换函数接受相同的参数作为您正在创建的 SPL 函数,
但以相反的顺序,
并返回相同值。

于 SQL 优化器的执行,转换函数的成本效益比更高。
例如,如果 a 小于 b,则函数 lessthan(a,b) 返回 TRUE, 而如果 b 大于或等于 a,
则 greaterthan(b,a) 返回 TRUE,
二者是转换函数。
下图使用 WITH 子句来定义转换函数。

图: 定义转换函数。
CREATE FUNCTION lessthan( a dtype1, b dtype2 )
RETURNING BOOLEAN
WITH ( COMMUTATOR = greaterthan );
. . .
END FUNCTION;
如果 greaterthan(b,a) 的执行成本低于 lessthan(a,b),则优化器可能使用 greaterthan(b,a)。要
指定转换函数,
您必须同时拥有该转换函数和您正在编写的 SPL 函数。
您还必须将两个函
数的 Execute 权限授予您的 SPL 函数的用户。
要了解授予权限的详细描述,请参阅《GBase 8s SQL 指南:语法》 中的 GRANT 语句的
描述。
NEGATOR 修饰符
NEGATOR 修饰符是用于布尔函数的变量。如果两个布尔函数的参数相同,顺序相同,且
返回互补的布尔值,则它们是否定函数。
例如,如果 a 等于 b,则函数 equal(a,b) 返回 TRUE,而如果 a 等于 b,则 notequal(a,b) 返
回 FALSE,二者是否定函数。如果您指定的否定函数的执行成本低于原始的函数,则优化
器可能选择执行该否定函数。
下图展示如何使用 CREATE FUNCTION 语句的 WITH 子句来指定否定函数。
图: 指定否定函数。
CREATE FUNCTION equal( a dtype1, b dtype2 )
RETURNING BOOLEAN
WITH ( NEGATOR = notequal );
. . .
END FUNCTION;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 264 -

提示:
在缺省情况下,
任何 SPL 例程都可处理在参数列表中传给其的 NULL 值。
换言之,
对于 SPL 例程,将 HANDLESNULLS 修饰符设置为 YES,且您不可更改它的值。
要获取关于 COMMUTATOR 和 NEGATOR 修饰符的更多信息,请参阅《GBase 8s SQL
指南:语法》 中的 Routine Modifier 段。

指定 DOCUMENT 子句
DOCUMENT 和 WITH LISTING IN 子句跟在 END PROCEDURE 或 END FUNCTION
语句之后。
DOCUMENT 子句允许您将注释添加到您的 SPL 例程,另一例程可从系统目录表选择它,
如果需要的话。下图中的 DOCUMENT 子句包含展示用户如何运行该 SPL 例程的用法语
句。
图: 展示用户如何运行 SPL 例程的用法语句。
CREATE FUNCTION raise_prices(per_cent INT)
. . .
END FUNCTION
DOCUMENT "USAGE: EXECUTE FUNCTION raise_prices (xxx)",
"xxx = percentage from 1 - 100";
请记住在文字的子句两头放置单引号或双引号。如果文字的子句跨过一行,则在每一行的
两头放置引号。

指定清单文件
WITH LISTING IN 选项允许您将任何可能发生的编译时警告定向到文件。
当您在 UNIX™ 上工作时,下图展示如何将编译时警告记录在 /tmp/warn_file 中。
图: 在 UNIX 上记录编译时警告。
CREATE FUNCTION raise_prices(per_cent INT)
. . .
END FUNCTION
WITH LISTING IN '/tmp/warn_file'
当您在 Windows™ 上工作时,下图展示如何将编译时警告记录在 \tmp\listfile 中。
图: 在 Windows 上记录编译时警告。
CREATE FUNCTION raise_prices(per_cent INT)
. . .
END FUNCTION
WITH LISTING IN 'C:\tmp\listfile'

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 265 -

请始终记住在文件名称或路径名称两头放置单引号或双引号。

添加注释
您可将注释添加到 SPL 例程的任何行,即使是空行也行。
要添加注释,请使用任一下列注释说明类型:

在注释的左边放置双连字符(--)。

将注释文本括在一对大括号之间({ . . . })。

在 C 类型的“斜杠和星号”注释指示符之间定界注释(/* . . . */)。
要添加多行注释,请执行下列操作之一:

在每一行注释前放置双连字符

将全部注释括在一对大括号之内。

在注释的第一行的左边放置 /*,并在注释的最后一行的末尾放置 */。
以大括号作为注释指示符是 GBase 8s 对 SQL 语言的 ANSI/ISO 标准的扩展。在 SPL 例
程中,全部三种注释类型也是有效的。
如果您使用大括号或 C 类型注释指示符来定界注释的文本,
则开头的指示符必须与结尾的
指示符是同一类型。
下图中的所有实例都是有效的注释。
图: 有效的注释实例。
SELECT * FROM customer -- Selects all columns and rows

SELECT * FROM customer
-- Selects all columns and rows
-- from the customer table

SELECT * FROM customer
{ Selects all columns and rows
from the customer table }

SELECT * FROM customer
/* 从 customer 表选择所有的列和行 */
重要: 大括号({ })可用于定界注释,也用于定界集合中元素的列表。要确保解析器正确地识
别注释的结束或集合中元素列表的结束,
请在处理集合数据类型的 SPL 例程中为注释使用连字
符(--)。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 266 -

GBase 8s 产品支持多种处理器平台,除国际主流的 x86_64 处理器(包括 Intel 和
AMD)外,全面支持飞腾、鲲鹏、兆芯、海光等国产处理器。
GBase 8s 产品可以运行于多款操作系统,包括:RHEL 和 CentOS 等 Linux 操作系
统、统信 UOS 、麒麟V10 等国产操作系统。