用户自定义函数

DB2 内部提供了大量的函数,例如求某个字段最大值的 MAX() 函数,求某个日期所在年份的 YEAR() 函数,等等。如果在使用 DB2 的过程中,需要反复使用同一个功能,就可以把这个功能定义成用户自定义函数(User Defined Function,简称 UDF)。可以使用 DB2 自带的 SQL PL 语言设计函数,也可以使用一些高级语言(如 C,C++ 和 Java 等)设计函数,并存储在 DB2 数据库中。

用户自定义函数与存储过程比较相像,都可以接收输入参数,在程序体中操作后返回输出结果。二者的不同点在于,存储过程通常与具体的业务关联比较密切,程序体内部涉及到业务逻辑,与某个业务系统内部的表密切相关,而用户自定义函数通常没有复杂的业务逻辑,也不与具体的表发生关联,通常在函数体内部所做的都是通用的操作,这种操作可以套用在任何表上。另外在调用方式上二者也有不同之处,存储过程通过 CALL 命令直接调用,而函数不能直接调用,而是在 SQL 表达式进行调用。

把使用编程语言编写的函数称为外部函数,把从另一个现有的函数改造继承过来的函数称为有源函数。

用户自定义函数分为三种类型:

(1)标量函数。返回一个单值的函数称为标量函数。例如,DB2 内置的 YEAR() 函数就是一个标量函数。标量 UDF 可以是外部函数或有源函数。

(2)列函数。从表的一列中进行统计返回单值答案的函数称为列函数,有时也称为聚集函数或聚合函数。例如,求某个字段平均值的函数 AVG()。不能对 DB2 数据库管理器定义外部列 UDF,但是可以定义源于一个内置列函数的列 UDF。

(3)表函数。返回结果是一个表的函数称为表函数,它将一个表返回至引用它的 SQL 语句,只能在 SELECT 语句的 FROM 子句中引用表函数。此类函数可用于将 SQL 语言处理能力应用于非 DB2 数据的数据,或将此类数据转换为 DB2 表。

例如,表函数可以提取一个文件并将它转换成表,将来自互联网的样本数据制成表。这些信息可以与该数据库中的其他表连接。

表函数只能是外部函数,它不能是有源函数。

很多用户自定义函数在使用的时候需要使用用户自定义数据类型(User Defined Type,简称 UDT),本节首先介绍用户自定义数据类型的创建方法,然后针对这些类型创建用户自定义函数。

用户自定义数据类型可以用于建表时的数据定义或者用户自定义函数中,它主要分为单值类型和结构化类型两种。单值类型继承自 DB2 现有的数据类型,可以对特定领域进行更具有实际意义的描述,例如可以分别定义身高、体重、年龄等类型,它们都继承自整型,但是分别表示不同的含义。结构化类型类似于 C 语言中的结构体,是由多个单值类型组合而构成的复合类型,使用的时候需要对结构化类型中的每一个分项进行设置。

例 3‑26 用户自定义数据类型、用户自定义函数的创建和使用。

创建一个人民币数据类型,并用它进行建表、插入、更新、查询等操作。

CREATE DISTINCT TYPE RMB AS DEC(12,2) WITH COMPARISONS

创建自定义数据类型使用 CREATE DISTINCT TYPE 语句,接着是新数据类型的名称,然后用 AS 子句指出源类型是什么。本例中指定源数据类型为 12 位宽度、2 位小数的十进制类型,WITH COMPARISONS 表示新创建的数据类型能够和具有相同源类型的值进行比较。

CREATE TABLE teacher

(

id CHAR(10) NOT NULL PRIMARY KEY,

name VARCHAR(20) NOT NULL,

salary RMB

)

创建了一张教师表,包括编号、姓名和薪水字段,其中薪水字段就使用了新定义的人民币数据类型。

INSERT INTO teacher VALUES('COMP000001', 'John', RMB(4026.83))

INSERT INTO teacher VALUES('MNGR000002', 'Rose', 3817.35)

这两条插入语句都能够执行成功,严格的写法是第一种。当创建用户自定义数据类型之后,DB2 会自动提供在新类型和源类型之间的转换函数。对本例来说,RMB() 能够把一个普通的十进制类型转换为人民币类型,DECIMAL 能够把人民币类型转换为十进制类型。第二个插入语句在执行的时候,DB2 隐含地进行了类型转换。

UPDATE teacher SET salary=salary*1.1 WHERE name='John'

这条语句在执行的时候会失败,提示“找不到具有兼容自变量的类型为‘ FUNCTION ’的名为‘ * ’的已授权例程”,意思就是对于 RMB 数据类型,原有的乘法操作运算已经无效了。对此有两种解决方案,一种是把 salary 转换成十进制再进行乘法运算,另一种是创建一个用户自定义函数,在函数中定义对 RMB 类型的乘法运算法则。在此我们采用第一种方法:

UPDATE teacher SET salary=DECIMAL(salary)*1.1 WHERE name='John'

接下来进行查询:

SELECT * FROM teacher WHERE salary>4000

这条查询语句也会失败,因为 RMB 类型不能和整型直接进行比较,同样地,在进行比较之前先进行类型转换:

SELECT * FROM teacher WHERE salary>RMB(4000)

或者

SELECT * FROM teacher WHERE DECIMAL(salary)>4000

接下来我们介绍用户自定义函数的创建和使用方法。在创建了上述的 RMB 数据类型之后,需要对这种类型进行一系列新的函数定义。例如,要获取所有教师的平均薪水,采用以下语句:

SELECT AVG(salary) FROM teacher

同样会报错,原因是针对新定义的 RMB 数据类型,没有相对应的求平均值的函数,应该先使用如下的语句定义函数:

CREATE FUNCTION AVG(RMB)

RETURNS RMB

SOURCE SYSIBM.AVG(DECIMAL)

其中参数和返回值只需要指定数据类型即可,最后一行为函数体,指明其运算法则是采用 DB2 内部对十进制类型进行平均值计算的方法。创建成功后,再次发出查询平均值的语句:

SELECT AVG(salary) FROM teacher

就可以得到正确结果了。

关于用户自定义数据类型和函数更深入的知识请参照信息中心或者本丛书的第二本《 DB2 深度解析——高级 DBA 和开发者篇》。

自定义类型的删除使用 DROP DISTINCT TYPE 语句,函数的删除使用 DROP FUNCTION 语句,需要注意的是,删除自定义数据类型之前,要先删除与之相关的表。

db2自定义函数能返回几个参数_DB2 用户自定义函数相关推荐

  1. C++函数的定义、函数返回值和参数类型、函数重载、重载函数等。

    一.函数 1.何为函数? 能够执行一个功能的可复用的用大括号括起来的代码块: 2.按照函数的拥有者进行分类: 预定义函数:头文件中提供的预定义函数(内置):用户可以直接调用: 自定义函数:用户根据需要 ...

  2. c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...

    [单选题]在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值 更多相关问题 下列关于IMOECDIS性能标 ...

  3. python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数返回浮点数

    python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点 ...

  4. python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数默认返回浮点数

    python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点数 目录

  5. python返回unicode_Python 中通过 unicode 码返回单字符的函数是 ,返回单字符 unicode 码的函数是 。_学小易找答案...

    [单选题]哪一个命令能用来查找在文件TESTFILE中只包含四个字符的行?( ) [单选题]修改以太网卡mac地址的命令为( ). [单选题]Python 字符串支持切片操作,如有字符串 s &quo ...

  6. db2自定义函数能返回几个参数_函数的定义、参数、返回值

    一.昨日内容回顾 昨日内容回顾 其他模式补充 r+ w+ a+ 文件内光标移动 在rt模式下read内n表示的读取字符的个数 其他情况及其他方法内n表示都是字节数 f.read(n) f.seek(o ...

  7. typedef 返回类型(*Function)(参数表) ——typedef函数指针

    //首先看一下函数指针怎么用 #include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数 ...

  8. jsp value设置为函数的返回值_python中的生成器函数是如何工作的?

    1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函数相关的栈帧,则必须在调用这个函 ...

  9. 高阶函数、js函数内返回一个内部函数详解---->函数柯里化

    高阶函数 如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数. 若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数. 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函 ...

最新文章

  1. velocity自定义标签和指令
  2. python学习音频-详解python播放音频的三种方法
  3. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例
  4. Spring Boot与数据访问
  5. Python 技术篇-容易被忽略的尾差问题
  6. linux进程接受信号,linux – 一个进程如何知道它已经收到一个信号
  7. 解决离线安装依赖包的方法
  8. I;P : Leaderboards and Achievements
  9. 2.shell 程序设计(1)
  10. linux清除占用端口,Linux中解除端口占用的方法
  11. 读书笔记:调试软件 张银奎
  12. [转载]STED和STORM、PALM
  13. 20145312 《信息安全系统设计基础》实验三 实时系统的移植
  14. SEEDLAB2.0-Meltdown
  15. 研究生软件测试项目答辩ppt,优秀硕士毕业论文答辩PPT.ppt
  16. Java 与或非 判断
  17. WAF、CDN、DDOS高防产品联动
  18. 北理工集训 Day1—Day2 (部分算法题目)
  19. 手机应用(App)推广服务-App收录,App推广,App评测,App下载,App搜索-搜应用网(www.souapp.com)
  20. 学习C++在windows下窗口应用程序开发(一)

热门文章

  1. Linux dos2unix命令
  2. 023-百度语音合成(使用申请的key)
  3. 基于51单片机的只能电子温度计硬件系统
  4. C语言移位运算(<<)
  5. android登录系统论文,基于Android的物业管理信息系统的设计与实现.docx
  6. JavaScript事件添加定时器
  7. c语言摄影测量共线方程,摄影测量学第讲共线方程的实用形式.ppt
  8. inkscape如何裁剪_科学网—如何在Inkscape图中输入LaTeX公式? - 李金磊的博文
  9. 自己动手写strcat函数
  10. 飞机大战——Java小游戏