DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第3部分
2010-02-18 15:01:14 来源:WEB开发网可以看到,这种形式的CREATE FUNCTION语句包含几个在前一种形式中没有出现的子句。在许多情况下,这些子句传达的信息不太直观,所以我们先详细讨论这些子句,然后再看一个示例。
<LANGUAGE SQL>指定函数是用SQL 编写的。
<DETERMINISTIC | NOT DETERMINISTIC>表示在用相同的参数值调用函数时,函数是否总是返回相同的标量值、表或行(DETERMINISTIC 代表确定性函数,NOT DETERMINISTIC表示非确定性函数)。如果没有指定这两个子句,那么在用相同的参数值调用函数时函数可能返回不同的结果。
<EXTERNAL ACTION | NO EXTERNAL ACTION>表示函数执行的操作是否会改变不由 DB2 管理的对象的状态(EXTERNAL ACTION表示会改变,NO EXTERNAL ACTION表示不改变)。外部操作包括发送电子邮件或在外部文件中写记录等。如果没有指定这两个子句,那么意味着函数可能执行某种外部操作。
<CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA>表示在UDF 体中编写的SQL语句的类型。有三个值可用:
CONTAINS SQL:UDF 体包含的可执行SQL语句既不读数据,也不修改数据。
READS SQL DATA:UDF 体包含的可执行SQL语句读数据,但是不修改数据。
MODIFIES SQL DATA:UDF 体包含的可执行SQL语句既可以读数据,也可以修改数据。
<STATIC DISPATCH>表示在函数解析时 DB2 根据函数参数的静态类型(声明的类型)选择函数。
<CALLED ON NULL INPUT>表示无论任何参数是否包含 null值,都调用此函数。
因此,如果希望创建一个名为JULIAN_DATE()的标量 SQL函数,用于将 DB2 日期转换为儒略日期(自公元前 4713 年 1 月 1 日以来的天数),那么可以执行下面的CREATE FUNCTION语句:
清单 3. 标量 SQL函数
CREATE FUNCTION julian_date(in_date DATE)
RETURNS CHAR(7)
LANGUAGE SQL
RETURN RTRIM(CHAR(YEAR(in_date))) ||
SUBSTR(DIGITS(DAYOFYEAR(in_date)), 8)
外部标量函数
外部标量函数是用C、C++或Java™ 等高级编程语言编写的返回单一值的函数。创建和实现有源函数或SQL函数的过程非常简单,但创建和使用外部标量函数(或任何外部函数)的过程就复杂多了。要想创建任何外部函数,必须执行以下步骤:
使用支持的高级编程语言编写 UDF 体。
编译 UDF。
链接 UDF 以创建库(或动态链接库)。
调试 UDF 并重复第 2 到第 4 步,直到解决所有问题。
把包含 UDF的库存储在服务器工作站上。另外,必须修改包含 UDF的库文件的系统权限,让所有用户都可以执行它。例如,在UNIX 环境中,使用chmod 命令让一个文件可由所有用户执行;在Windows 环境中,使用attrib 完成此任务。
使用适当形式的CREATE FUNCTION SQL语句向 DB2数据库注册UDF。
完成这些步骤之后,就可以按照使用任何标量函数或表函数的方式使用生成的UDF。
一定要注意一点:因为外部标量函数是用高级编程语言编写的,而不是SQL,所以提供给函数参数的每个值必须由 SQL数据类型转换为适当的高级编程语言数据类型,然后才能使用。(如果函数的参数之一需要用户定义的数据类型,那么应该先把参数值转换为适当的内置数据类型,然后再传递给外部函数)。同样,函数返回的任何值必须由高级编程语言数据类型转换为适当的SQL数据类型,然后才能返回它。另外,如果在外部函数中动态地分配了内存,那么应该在函数返回之前释放内存。
用来注册(已经按以上说明创建的)外部标量函数的CREATE FUNCTION语句形式的基本语法如下:
清单 4. 用来注册外部标量函数的CREATE FUNCTION语句
CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
RETURNS [OutputDataType]
<SPECIFIC [SpecificName]>
EXTERNAL <NAME [ExternalName] | [Identifier]>
LANGUAGE [C | JAVA | CLR | OLE]
PARAMETER STYLE [DB2GENERAL | JAVA | SQL]
<DETERMINISTIC | NOT DETERMINISTIC>
<FENCED | NOT FENCED>
<RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT>
<NO SQL | CONTAINS SQL | READS SQL DATA>
<STATIC DISPATCH>
<EXTERNAL ACTION | NO EXTERNAL ACTION>
<SCRATCHPAD <[100 | [SPSize]]> | NO SCRATCHPAD>
<DBINFO | NO DBINFO>
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接