用户自定义函数

用户自定义函数(User-Defined Function,UDF)是由程序或环境的用户所提供的函数。通常在这种语境下,系统默认函数是程序或环境原生内置的。UDF通常是根据创建者的特定需求而编写的。
数据库
在关系数据库管理系统中,用户自定义函数(UDF)提供了一种扩展数据库服务器机制的方式。通过添加函数,用户可以在标准查询语言(通常是SQL)语句中对其进行调用。SQL标准将函数分为标量函数(Scalar Functions)和表函数(Table Functions)。标量函数仅返回单个值(或NULL),而表函数则返回一个由零行或多行组成的(关系)表,每行包含一列或多列。

创建与使用SQL中的UDF使用CREATE FUNCTION语句声明。例如,一个将摄氏度转换为华氏度的UDF声明如下:

CREATE FUNCTION dbo.CtoF(Celsius FLOAT)
RETURNS FLOAT
RETURN (Celsius * 1.8) + 32

创建后,UDF可用于SQL语句的表達式中。例如,它可以在大多数内置函数允许出现的地方被调用,包括SELECT语句。在这种用法中,从概念上讲,函数会对每一行数据执行一次。假设有一个名为的表,存储了化学元素的信息,其中列记录了摄氏度沸点。以下查询:

SELECT Name, CtoF(BoilingPoint)
FROM Elements

将检索每个元素的名称及其转换后的华氏度沸点。

SQL标准定义了UDF的以下属性:
*语言 (Language):定义实现函数的编程语言(如SQL、C、C#或Java)。
*参数风格 (Parameter style):定义在函数实现与数据库系统之间传递参数和结果的约定(仅适用于非SQL语言)。
*特定名称 (Specific name):在数据库中唯一的函数名。
*确定性 (Determinism):指明函数是否为“确定性”的。这会影响查询优化器编译SQL语句时的决策。
*SQL数据访问 (SQL-data access):告知系统函数的操作类型:不含 SQL(NO SQL)、含SQL但不访问表(CONTAINS SQL)、读取数据(READS SQL DATA)或修改数据(MODIFIES SQL DATA)。

UDF不应与存储过程(Stored Procedures)混淆。存储过程允许用户将一组SQL命令分组。存储过程可以接受参数并执行SQL语句,但它不是表达式,因此不能像UDF那样嵌入在SQL表达式中使用。

部分系统支持使用非SQL语言创建UDF。例如,Microsoft SQL Server支持.NET语言(如C#),DB2和Oracle支持C或Java。
SQL Server
在Microsoft SQL Server中,用户自定义函数(UDF)分为三类:标量函数、内联表值函数(inline table-valued function)以及多语句表值函数(multistatement table-valued function)。

标量函数 (Scalar Functions):通过RETURNS子句返回单个数据值(而非表格)。标量函数可以使用除timestamp和用户定义数据类型以外的所有标量数据类型。

内联表值函数 (Inline Table-valued Functions):返回单个SELECT语句的结果集。

多语句表值函数 (Multistatement Table-valued Functions):返回一个通过多条Transact-SQL语句构建的表格。

用户自定义函数可以像内置函数(如 OBJECT_ID、LEN、DATEDIFF)一样从查询中调用,也可以像存储过程一样通过 EXECUTE 语句执行。

在Microsoft SQL Server中,一个“封装”了视图的表值函数可能比视图本身快得多。下面的MyFunction示例展示了一个比其底层视图MyView运行速度更快的“函数封装器”:

CREATE FUNCTION MyFunction()
RETURNS @Tbl TABLE
(
StudentID VARCHAR(255),
SAS_StudentInstancesID INT,
Label VARCHAR(255),
Value MONEY,
CMN_PersonsID INT
)
AS
BEGIN
INSERT @Tbl
(
StudentID,
SAS_StudentInstancesID,
Label,
Value,
CMN_PersonsID
)
SELECT
StudentID,
SAS_StudentInstancesID,
Label,
Value,
CMN_PersonsID
FROM MyView -- where MyView selects (with joins) the same columns from large table(s)

RETURN
END

用户自定义函数(UDF)是由一条或多条Transact-SQL语句组成的子程序,可用于封装代码以实现重用。它接受零个或多个参数,并计算出一个返回值。其主体部分与存储过程类似,既包含控制流语句(如 IF...ELSE、WHILE),也包含 DML 语句(数据操纵语言,如 SELECT)。不允许更改任何全局会话状态,例如修改数据库数据或操作外部资源(如文件或网络)。不支持输出参数(OUTPUT parameters)。如果需要传递参数的默认值,必须显式指定 DEFAULT 关键字。UDF中发生的错误会导致函数中止,进而导致调用该UDF的整个SQL语句中止。

CREATE FUNCTION CubicVolume
-- Input dimensions in centimeters
(
@CubeLength decimal(4,1),
@CubeWidth decimal(4,1),
@CubeHeight decimal(4,1)
)
RETURNS decimal(12,3)
AS
BEGIN
RETURN(@CubeLength @CubeWidth @CubeHeight)
END

参考文献
外部链接
*[http://msdn2.microsoft.com/en-us/library/aa258261(SQL.80).aspx Microsoft SQL Server reference for CREATE FUNCTION]
*[http://dev.mysql.com/doc/refman/5.5/en/adding-functions.html MySQL manual section on UDFs]
*[http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0000917.html DB2 CREATE FUNCTION statement]

评论 (0)

  • 还没有评论,来抢沙发吧。