1、内置函数分类(SYSIBM模式内)

1)标量函数:返回一个标量值的函数;

2)聚合函数:也叫列函数,也返回一个标量值,这个值是一组输入值的计算结果;
3)表函数:向引用它的 SQL 语句返回一个表;

4)行函数:返回单一表行;

2、用户定义的函数

1)有源(或模板)函数:有源函数是从一个已经向数据库注册的函数(称为源函数)构造出的 UDF。有源函数在本质上可以是标量、列或表函数,还可以用它们覆盖 +、-、* 和 / 等操作符。

--语法

CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
    RETURNS [OutputDataType]
    <SPECIFIC [SpecificName]>
    SOURCE [SourceFunction] <([DataType] ,...)>
    <AS TEMPLATE>

--示例

CREATE FUNCTION AVG(YEAR) RETURNS YEAR
    SOURCE SYSIBM.AVG(INTEGER)

2)SQL 标量、表或行函数:SQL 函数是只使用过程式 SQL 语句构造的 UDF。

--语法

CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
    RETURNS [[OutputDataType] |
       TABLE ( [ColumnName] [ColumnDataType] ,... ) |
       ROW ( [ColumnName] [ColumnDataType] ,... )]
    <SPECIFIC [SpecificName]>
    <LANGUAGE SQL>
    <DETERMINISTIC | NOT DETERMINISTIC>
    <EXTERNAL ACTION | NO EXTERNAL ACTION>
    <CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA>     
    <STATIC DISPATCH>     
    <CALLED ON NULL INPUT>        
    [SQLStatements] | RETURN [ReturnStatement]

--示例

CREATE FUNCTION julian_date(in_date DATE)
    RETURNS CHAR(7)
    LANGUAGE SQL
    RETURN RTRIM(CHAR(YEAR(in_date))) ||
      SUBSTR(DIGITS(DAYOFYEAR(in_date)), 8)

3)外部标量函数:外部标量函数是用 C、C++ 或 Java™ 等高级编程语言编写的返回单一值的函数。

--创建外部函数的步骤

i)使用支持的高级编程语言编写 UDF 体。

ii)编译 UDF。

iii)链接 UDF 以创建库(或动态链接库)。

iv)调试 UDF 并重复第 2 到第 4 步,直到解决所有问题。

v)把包含 UDF 的库存储在服务器工作站上。另外,必须修改包含 UDF 的库文件的系统权限,让所有用户都可以执行它。例如,在 UNIX 环境中,使用chmod 命令让一个 文件可由所有用户执行;在 Windows 环境中,使用attrib 完成此任务。

vi)使用适当形式的 CREATE FUNCTION SQL 语句向 DB2 数据库注册 UDF。

--语法

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>    
--示例

CREATE FUNCTION center(INT, DOUBLE)
    RETURNS DOUBLE
    EXTERNAL NAME '/home/db2inst1/myfuncs/double'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NO SQL

4)外部表函数:与外部标量函数一样,外部表函数是用高级编程语言编写的。外部标量函数返回一个标量值,而外部表函数在每次调用时返回一个数据集。外部表函数的强大之处在于,它们能够让几乎任何数据源看起来像是 DB2 基表。

--语法

CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
    RETURNS TABLE ( [ColumnName] [ColumnDataType] ,... ) 
    <SPECIFIC [SpecificName]>
    EXTERNAL <NAME [ExternalName] | [Identifier]>    
    LANGUAGE [C | JAVA | CLR | OLE]
    PARAMETER STYLE [DB2GENERAL | 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>   
--示例

CREATE FUNCTION empdata (VARCHAR(30), VARCHAR(255))
    RETURNS TABLE (empid INT, lname CHAR(20), fname CHAR(20))
    EXTERNAL NAME '/home/db2inst1/myfuncs/EMPDATA'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED    
    NO SQL
    NO EXTERNAL ACTION

5)OLE DB 外部表函数:Microsoft OLE DB 是一组应用程序编程接口 (API),用于访问各种数据源。数据源由数据本身、相关联的数据库管理系统 (DBMS)、运行 DBMS 的平台以及用来访问此平台的网络组成。OLE DB 可以为 OLE Component Object Model (COM) 环境中的所有数据源类型提供访问。

--语法

CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
    RETURNS TABLE ( [ColumnName] [ColumnDataType] ,... ) 
    <SPECIFIC [SpecificName]>
    EXTERNAL <NAME [ExternalName]>    
    LANGUAGE OLEDB
    <DETERMINISTIC | NOT DETERMINISTIC>
    <RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT>   
    <EXTERNAL ACTION | NO EXTERNAL ACTION>
    <CARDINALITY [NumRows]>    
--示例

CREATE FUNCTION orders()
    RETURNS TABLE (orderid      INTEGER,
                   customerid   CHAR(5),
                   employeeid   INTEGER,
                   orderdate    TIMESTAMP,
                   requiredate  TIMESTAMP,
                   shipdate     TIMESTAMP,
                   shipcharges  DECIMAL(19,4))
    LANGUAGE OLEDB
    EXTERNAL NAME '!orders!Provider=Microsoft.Jet.OLEDB.3.51;
        Data Source=c:\sqllib\samples\oledb\nwind.mdb'

3、SQL函数的结构

1)组成部分

i)函数名

ii)一系列参数声明(如果有参数的话)

iii)函数返回值的声明

iv)一个或多个函数选项

v)函数体

2)结构示意图

3)SQL函数中可以使用的SQL语句

SQL 语句 CONTAINS SQL READS SQL DATA MODIFIES SQL DATA
CALL Yes Yes Yes
DELETE No No Yes
FOR Yes Yes Yes
GET DIAGNOSTICS Yes Yes Yes
IF Yes Yes Yes
INSERT No No Yes
ITERATE Yes Yes Yes
LEAVE Yes Yes Yes
MERGE No No Yes
SELECT No Yes Yes
SET variable Yes Yes Yes
SIGNAL Yes Yes Yes
VALUES No Yes Yes
WHILE Yes Yes Yes

4)单语句 SQL 标量函数

--无参数单语句SQL标量函数

--有参数单语句SQL标量函数

 
5)单语句 SQL 表函数

--无参数单语句SQL表函数

--有参数单语句SQL表函数


6)复合语句 SQL 标量函数

--无参数复合语句SQL标量函数


--有参数复合语句SQL标量函数

 
7)复合语句 SQL 表函数

--没参数复合语句SQL表函数


--有参数复合语句SQL表函数

8)SQL Procedural Language (SQL PL) 语句

--与变量相关的语句

i)DECLARE [Variable] DEFAULT [Value]

ii)DECLARE [Condition]

iii)SET (assignment-statement)

--条件语句

i)IF

--循环语句

i)FOR

ii)WHILE

--控制转移语句

i)CALL

ii)ITERATE

iii)LEAVE

iiii)RETURN

--错误管理语句

i)SIGNAL

ii)示例(包含SQL PL语句的SQL标量函数)

9)SQL 函数中的错误处理

--语法

SIGNAL [Condition_Value] 
    SET MESSAGE_TEXT = [Message]      

SIGNAL SQLSTATE <VALUE> [SQLSTATE_Value] 
    SET MESSAGE_TEXT = [Message]

--示例(包含流控制语句的SQL标量函数)

4、调用 SQL 函数

VALUES sqlfunc.strip_ltblanks(' This is a test. '),

SELECT * FROM TABLE(sqlfunc.bday_this_month('A00'))

DB2开发系列之三——SQL函数的更多相关文章

  1. Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程

    原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL S ...

  2. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  3. DB2开发系列之二——SQL过程

    1.SQL 过程的结构 1)SQL过程的结构 CREATE PROCEDURE proc_name   IN, OUT, INOUT parameters   optional clauses   S ...

  4. android开发系列之回调函数

    想必对于回调函数大家肯定不陌生,因为这是我们开发里面常用的代码技巧.我也就不废话了,让我们直接来看代码吧! public class TestCallback { public interface I ...

  5. DB2开发系列之一——基本语法

    最近看了些db2开发方面的资料,现做摘要,以供自己和大家参考: 1.变量声明 DECLARE v_salary DEC(9,2) DEFAULT 0.0; DECLARE v_status char( ...

  6. Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构

    1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的backgroun ...

  7. DB2开发系列之四——触发器

    1.触发器类型 1)BEFORE 触发器:在对表插入或更新之前执行该触发器,允许使用CALL 和 SIGNAL SQL 语句: 2)BEFORE DELETE 触发器:在删除操作之前执行该触发器: 3 ...

  8. SuperMap iObject入门开发系列之三管线系统标注

    本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 管线系统会涉及到一些坐标标注,属性标注,提供给用户查询获取其需要的信息,这期的文章介绍的是基于超图iObject开发的 ...

  9. C++开发系列-纯虚函数和抽象类

    概念 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都实现该函数. 纯虚函数为各派生类提供了一个公共界面(接口的封装和设计.软件的模块功能的划分) 纯虚函数说明 ...

随机推荐

  1. OkHttp使用教程——网络操作之OkHttp, Volley以及Gson

    写这篇文章的动机 在安卓项目中有一个问题可能无法避免:网络.不管你是加载图片,请求API数据还是从因特网上获得一个字节,你都是在使用网络. 鉴于网络在安卓中的重要性与基础性,当今安卓开发者面临的问题之 ...

  2. Android项目中的各个模块框架设计

    作为Android开发,现对项目开发中的各个模块搭建,梳理如下: Android UI框架,开发人员需要达到专家级 网络框架 浏览框架 图片加载框架 图片裁剪压缩工具类 客户端并发框架 线程池设计 ( ...

  3. javaWeb学习之Listener监听

    ] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet  listener  filt ...

  4. Java 第三章 选择结构

    第三章   选择结构 if基本语法: if(条件){// 表达式 // 代码块 } eg: int a = 10; if(a > 1){ System.out.println("内容& ...

  5. freemarker之include指令(九)

    freemarker之include指令 1.父页面ftl <html> <head> <meta http-equiv="content-type" ...

  6. Java并发编程-各种锁

    安全性和活跃度通常相互牵制.我们使用锁来保证线程安全,但是滥用锁可能引起锁顺序死锁.类似地,我们使用线程池和信号量来约束资源的使用, 但是缺不能知晓哪些管辖范围内的活动可能形成的资源死锁.Java应用 ...

  7. es6中一些基本的使用方法

    es6中一些基本的使用方法 const 定义常量 let 块级变量 用let定义的变量只在块当中起作用,离开变量外界的块(括号)就会被销毁. 模板字面量 用于字符串拼接和写模板,使用 ` (反引号,左 ...

  8. 1.17学习jquery权威指南

    1.ajax方面(东西比较杂,很多相关于.net挂钩的服务器端接触没有实际操作,全部放进来,或许以后当作demo使用) ¥(“body”).load("text.txt");   ...

  9. hihocoder #1456 : Rikka with Lattice(杜教筛)

    hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...

  10. CF908G Original Order

    题目大意: 定义\(R(x) = 每个数在各数位排序后得到的数\) 例如:\(R(321597) = 123579\) 给定一个\(n<=10^{700}\),求\(\sum _{i=1}^n ...