南大通用GBase8s 常用SQL语句(四十六)
重载函数名
因为 GBase 8s 支持例程重载,所有您可以用同一名称定义多个函数,但有不同的参数列表。您可能希望在以下情况中重载函数:
您使用与内置函数相同的名称创建用户定义函数(如 equal( )),以处理新拥有定义的数据类型。
您创建类型层次结构,其中子类型从超类型继承数据表示法和函数。
您创建 distinct 类型,它是用于与现有数据类型具有相同的内部存储表示的数据类型,但是名称不同。并且在没有强制转型的情况下无法与源类型相比较。Distinct 类型从其源类型继承支持函数。
有关唯一标识每个用户定义函数的例程特征符的简短描述,请参阅例程重载以及例程签名 。
示例
重载函数通过名称和输入参数列表来唯一标识。除了提供一个长的唯一标识符,还可以通过特定名称从而在之后使用它。以下示例显示了一个重载函数,它的标识符是 getArea,具有特定名称 getSquareArea 和 getRectangleArea :
CREATE FUNCTION getArea
(i INT DEFAULT 0)
RETURNING INT SPECIFIC getSquareArea;
DEFINE j INT;
LET j = i * i;
RETURN j;
END FUNCTION;
CREATE FUNCTION getArea
(i INT DEFAULT 0, j INT DEFAULT 0)
RETURNING INT SPECIFIC getRectangleArea;
DEFINE k INT;
LET k = i * j;
RETURN k;
END FUNCTION;
现在您可以使用特定名称,如下所示:
GRANT EXECUTE ON SPECIFIC FUNCTION getSquareArea TO gbasedbt;
GRANT EXECUTE ON SPECIFIC FUNCTION getRectangleArea TO gbasedbt;
若没有特定名称,则您可能需要发出下列语句:
GRANT EXECUTE ON FUNCTION getArea (INTEGER) TO gbasedbt;
GRANT EXECUTE ON FUNCTION getArea (INTEGER,INTEGER) TO gbasedbt;
使用 SPECIFIC 子句指定特定名称
可以为一个用户定义函数声明一个在数据库中独一无二的特定名称。当您重载函数时,特定名称就很有用。
DOCUMENT 子句
DOCUMENT 子句中带引号的字符串提供对 UDR 的摘要和描述。该字符串存储在 sysprocbody 系统目录表中,适用于 UDR 的用户。拥有对数据库访问特权的任何人均可查询 sysprocbody 系统目录表,以获取对存储在数据库中的一个或全部 UDR 的描述。
例如,以下查询获取对 SPL 函数 所显示的 SPL 函数 update_by_pct 的描述:
SELECT data FROM sysprocbody b, sysprocedures p
WHERE b.procid = p.procid
–join between the two catalog tables
AND p.procname = ‘update_by_pct’
– look for procedure named update_by_pct
AND b.datakey = ‘D’-- want user document;
先前的查询返回以下文本:
USAGE: Update a price by a percentage
Enter an integer percentage from 1 - 100
and a part id number
UDR 或者应用程序可查询系统目录表来取出 DOCUMENT 子句并为用户显示它。
对于 C 和 Java™ 语言函数,无论您指定是否使用 END FUNCTION 关键字,均可以在 CREATE FUNCTION 语句末尾包含 DOCUMENT 子句。
WITH LISTING IN 子句
WITH LISTING IN 子句指定编译时发送警告的文件名。编译 UDR 之后,此文件包含一条或多条警告消息。
如果您不使用 WITH LISTING IN 子句,则编译器不生成警告列表。
在 UNIX™ 平台上,如果您指定文件名而非目录,将在数据库驻留的计算机上的主目录中创建此列表文件。如果您在此计算机上没有主目录,则在根目录 (名为 “/”的目录)创建此文件。
在 Windows™ 系统中,如果您指定文件名而非目录,则在数据库位于本地计算机的情况下,在当前工作目录中创建此列表文件。否则,缺省目录为 %GBASEDBTDIR%\bin。
SPL 函数
SPL 函数是用 SPL 编写的 UDR ,可返回一个或多个值。要编写并注册 SPL 函数,请使用 CREATE FUNCTION 语句。在 CREATE FUNCTION 和 END FUNCTION 关键字之间嵌入适当的 SQL 和 SPL 语句。还可以将 DOCUMENT 和 WITH FILE IN 选项放在该函数后面。
分析 SPL 函数,(尽可能)优化函数f,并以可执行文件的形式存储在系统目录表中。SPL 函数的主体存储在 sysprocbody 系统目录表中。关于该函数的其它信息存储在其它系统目录表中,包括 sysprocedures 、sysprocplan 和 sysprocauth。有关这些系统目录表的更多信息,请参阅 GBase 8s SQL 参考指南。
END FUNCTION 关键字在每个 SPL 函数中是必需的,并且在紧邻语句块之前的子句后面要加上分号(;)。以下代码示例创建了 SPL 函数:
CREATE FUNCTION update_by_pct ( pct INT, pid CHAR(10))
RETURNING INT;
UPDATE inventory SET price = price + price * (pct/100)
WHERE part_id = pid;
return (select price from inventory where part_id = pid);
END FUNCTION
DOCUMENT “USAGE: Update a price by a percentage”,
“Enter an integer percentage from 1 - 100”,
“and a part id number”
WITH LISTING IN ‘/tmp/warn_file’;
有关如何编写 SPL 函数的更多信息,请参阅 GBase 8s SQL 教程指南 中关于 SPL 的章节。
另见 SPL 例程中的事务 一节。
您可以在 SPL 函数中包含有效的 SQL 或 SPL 语言语句。但是,请参阅 其它语法段 中的以下各节,这些节描述了 SPL 例程中 SQL 和 SPL 语句上的限制:SPL 语句的子集在语句块中有效 、 SQL 语句在 SPL 语句块中有效 和 在数据操纵语句中 SPL 例程的限制 。