DB2开发系列之三——SQL函数
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函数的更多相关文章
- 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 ...
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...
- DB2开发系列之二——SQL过程
1.SQL 过程的结构 1)SQL过程的结构 CREATE PROCEDURE proc_name IN, OUT, INOUT parameters optional clauses S ...
- android开发系列之回调函数
想必对于回调函数大家肯定不陌生,因为这是我们开发里面常用的代码技巧.我也就不废话了,让我们直接来看代码吧! public class TestCallback { public interface I ...
- DB2开发系列之一——基本语法
最近看了些db2开发方面的资料,现做摘要,以供自己和大家参考: 1.变量声明 DECLARE v_salary DEC(9,2) DEFAULT 0.0; DECLARE v_status char( ...
- Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构
1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的backgroun ...
- DB2开发系列之四——触发器
1.触发器类型 1)BEFORE 触发器:在对表插入或更新之前执行该触发器,允许使用CALL 和 SIGNAL SQL 语句: 2)BEFORE DELETE 触发器:在删除操作之前执行该触发器: 3 ...
- SuperMap iObject入门开发系列之三管线系统标注
本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 管线系统会涉及到一些坐标标注,属性标注,提供给用户查询获取其需要的信息,这期的文章介绍的是基于超图iObject开发的 ...
- C++开发系列-纯虚函数和抽象类
概念 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都实现该函数. 纯虚函数为各派生类提供了一个公共界面(接口的封装和设计.软件的模块功能的划分) 纯虚函数说明 ...
随机推荐
- ffmpeg入门之 Tutorial02
02实际是在01的基础上添加了 SDL显示yuv部分,这部分相对独立. if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) ...
- 图像处理------Mean Shift滤波(边缘保留的低通滤波)
一:Mean Shift算法介绍 Mean Shift是一种聚类算法,在数据挖掘,图像提取,视频对象跟踪中都有应用.本文 重要演示Mean Shift算法来实现图像的低通边缘保留滤波效果.其处理以后的 ...
- 打开CSDN论坛出现403
打开CSDN论坛出现403 在查找资料的过程中,出现"403-禁止访问"
- CF370 D Memory and Scores
dp题 并运用了前缀和 我看题目提示中有fft 我想了下感觉复杂度不过关还是未解 #include<bits/stdc++.h> using namespace std; typedef ...
- Treeview 丢失焦点后依然高亮 SelectedNode
参考:StackOverFlow.Control.Validating 事件 注意 TreeView 的 HideSelection 要保持为默认值True. private TreeNode pre ...
- POJ 2187 Beauty Contest(凸包,旋转卡壳)
题面 Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, earning the ...
- UVA10692:Huge Mods
题面 传送门 题意 输入正整数a1,a2,a3..an和模m,求a1^a2^...^an mod m Sol 首先有\[ a^b\equiv \begin{cases} a^{b\%\phi(p)}~ ...
- [BZOJ1707] [Usaco2007 Nov] tanning分配防晒霜 (贪心)
Description 奶牛们计划着去海滩上享受日光浴.为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜.第i头奶牛适合的最小和最 大的SP ...
- WPF自学入门(五)WPF依赖属性
在.NET中有事件也有属性,WPF中加入了路由事件,也加入了依赖属性.最近在写项目时还不知道WPF依赖属性是干什么用的,在使用依赖项属性的时候我都以为是在用.NET中的属性,但是确实上不是的,通过阅读 ...
- .NET微服务 容器化.NET应用架构指南(支持.NET Core2)
介绍 企业通过使用容器,日益实现成本节约.解决部署问题并改进 DevOps 和生产操作. 通过创建 Azure 容器服务.Azure Service Fabric 等产品,同时与 Docker.Mes ...