UDF 鼓励代码重用,这样可以提高应用程序开发人员的生产率。如果您有很多实现相同逻辑的程序,那么可以通过 UDF 标准化该逻辑,并让所有这些程序使用相同的实现。一旦在 DB2 中定义好一个 UDF,便可以像使用内置 DB2 函数那样,在 SQL 语句中使用这个 UDF。如果是在应用程序中编写这个函数,而不是将其定义为 UDF,那么 SQL 查询工具 (例如 CLP)的用户将不能访问这个函数。UDF 允许任何前端,包括 Java™ 程序,访问这个标准逻辑。
直接从数据库引擎(而不是从应用程序代码)中调用 UDF 还可以使性能获得极大的提高,尤其是在将数据发送回应用程序进行进一步处理之前,可以使用 UDF 来过滤数据。
由于UDF是预先编译的,性能普遍优于一般的查询,UDF使用的存取计划一经编译就会相对稳定。我在开发中曾多次发现,使用UDF 代替查询或视图中的复杂部分会提高几倍甚至几十倍的性能,主要原因是迫使DB2使用指定的存取计划来充分利用index或者调整其访问过程(如Join 顺序、Filter位置等)。使用UDF 进行优化的基本思路是:将复杂查询分解为多个部分执行,针对每个部分优化处理,将各部分组合时能够避免存取计划的一些不必要变化,优化整体性能。
当然了,有一个小问题。自定义函数(UDB)只能包含那些不会改变数据库状态的语句(诸如INSERT、UPDATE或DELETE语句是不允许的)。并且只允许完整SQL PL语言的子集出现在SQL函数中(不能是CALL语句、游标和条件处理)。
自定义函数语法
CREATE FUNCTION 函数名(传入参数名 datatype, ……)
RETURNS datatype –返回值类型
BEGIN ATOMIC
函数体
END
例子
create function ADD(a int ,b int)
returns int
LANGUAGE SQL
BEGIN ATOMIC
DECLARE sum int default 0
set sum = a + b
return sum
END
调用测试:VALUES (ADD(1, 2))
CREATE FUNCTION 函数名( 参数名 数据类型, …)
RETURNS {数据类型 | ROW (列名数据类型, …) | TABLE}
[SPECIFIC 别名]
[LANGUAGE SQL]
[NOT DETERMINISTIC | DETERMINISTIC]
[EXTERNAL ACTION | NO EXTERNAL ACTION]
[READS SQL DATA | CONTAINS SQL | MODIFIES SQL DATA]
[STATIC DISPATCH]
[CALLED ON NULL INPUT]
[INHERIT SPECIAL REGISTERS]
[PREDICATES--(--| predicate-specification |--)]
函数体
例如,创建一个标量函数,去掉字符串两端的空格。
CREATE FUNCTION trim_both ( p_varVARCHAR(100) )
RETURNS VARCHAR(100) -
LANGUAGE SQL
SPECIFIC trim
RETURN LTRIM(RTRIM(p_var))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)