Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106724189
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724200
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724201
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724202
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724203
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724204
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724205
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724206
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724207
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724208
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724209
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724210
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724211
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724212
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724213
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724204
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724215
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724216
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724217
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724218
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724219
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724220
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724221
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724222
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724223
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724224
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724225
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724226
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724227
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724228
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724219
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724230
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724231
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724232
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724233
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724234
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724235
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724236
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724237
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724238
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724239
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724240
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724241
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724242
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724243
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724234
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724245
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724246
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724247
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724248
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724249
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 9 部分: 用户定义的例程(4)-sdccf-ChinaUnix博客
  • 博客访问: 106724250
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:49:01

将定制的和复杂的业务逻辑集成到 SQL 语句中

developerWorks



外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773910) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773909) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773908) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773907) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773905) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773904) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773903) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773899) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773898) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773897) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773895) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773894) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773892) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773890) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773889) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773888) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773887) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773885) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773884) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773883) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773881) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773880) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773879) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773877) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773876) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773874) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773872) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773871) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773870) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773869) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773868) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773867) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773866) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773865) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773864) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773863) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773862) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773861) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


外部用户定义函数

通过以函数的形式引用外部程序,SQL 语句可以变得很强大。通过使用 C 和 Java 等编程语言编写函数,可以执行非常高级的任务,例如字符串操纵,这些任务原本可能需要在一个 SQL UDF 中使用多个(看上去比较费解的)SQL 语句。此外,还可以在这些编程语言中处理外部数据源或者执行外部动作。

外部函数可以定义为以两种不同的模式运行,一种是 NOT FENCED 模式 —— 也就是说在数据库引擎中运行,另一种是 FENCED 模式 —— 也就是说在数据库引擎之外的内存中运行。使用 NOT FENCED 函数的优点是,它与数据库引擎共享内存,可以更快地与数据库引擎通信。但是,如果没有正确地编写 NOT FENCED 函数,那么可能出现内存漏洞。如果是这样,内存漏洞会开始覆盖与 DB2 引擎相关的内存,这会造成一些恶劣的影响,例如使 DB2 崩溃。如果是编写 C 或 C++ 函数,那么强烈建议将函数编写为 FENCED 函数,并且在决定将它们重新创建为 NOT FENCED 之前进行大量的练习。





回页首


清单 19 显示了注册外部函数的一个简化语法图:



                    
>>-CREATE FUNCTION--function-name------------------------------->
 
>--(--+----------------------------------------------------+--)-->
      | .-,----------------------------------------------. |
      | V                                                | |
      '---+----------------+--data-type1--+------------+-+-'
          '-parameter-name-'              '-AS LOCATOR-'
 
>--*------------------------------------------------------------>
 
>--RETURNS--+-data-type2--+------------+------------------------+-->
            |             '-AS LOCATOR-'                        |
            '-data-type3--CAST FROM--data-type4--+------------+-'
                                                 '-AS LOCATOR-'
 
>--*--+-------------------------+--*---------------------------->
      '-SPECIFIC--specific-name-'
 
>--EXTERNAL--+----------------------+--*------------------------>
             '-NAME--+-'string'---+-'
                     '-identifier-'
                    
>--LANGUAGE--+-C----+-------*----------------------------------->
             +-JAVA-+
             +-CLR--+
             '-OLE--'
                                       .-NOT DETERMINISTIC-.
>--PARAMETER STYLE--+-DB2GENERAL-+--*--------------------------->
                    +-JAVA-------+
                    '-SQL--------'
                                        .-NOT DETERMINISTIC-.
>--+------------------------------+--*--+-------------------+--->
   '-PARAMETER CCSID--+-ASCII---+-'     '-DETERMINISTIC-----'
                      '-UNICODE-'
 
      .-FENCED------------------------.
>--*--+-------------------------------+--*---------------------->
      +-FENCED--*--+-THREADSAFE-----+-+
      |            '-NOT THREADSAFE-' |
      |                .-THREADSAFE-. |
      '-NOT FENCED--*--+------------+-'
 
   .-RETURNS NULL ON NULL INPUT-.     .-READS SQL DATA-.
>--+----------------------------+--*--+----------------+--*----->
   '-CALLED ON NULL INPUT-------'     +-NO SQL---------+
                                      '-CONTAINS SQL---'
 
   .-STATIC DISPATCH-.     .-EXTERNAL ACTION----.
>--+-----------------+--*--+--------------------+--*------------>
                           '-NO EXTERNAL ACTION-'
 
   .-NO SCRATCHPAD----------.     .-NO FINAL CALL-.
>--+------------------------+--*--+---------------+--*---------->
   |             .-100----. |     '-FINAL CALL----'
   '-SCRATCHPAD--+--------+-'
                 '-length-'
 
                             .-NO DBINFO-.
>--+-------------------+--*--+-----------+--*------------------->
   +-ALLOW PARALLEL----+     '-DBINFO----'
   '-DISALLOW PARALLEL-'

在上一节中,您已经看到了 CREATE FUNCTION 语句中最重要的组成部分。其实,还有一些组成部分是外部函数特有的:

  • LANGUAGE: 指定用于编写函数的语言。可用于编写外部函数的语言有 C、Java 语言、CLR 和 OLE。
  • PARAMETER STYLE: 该子句用于指定函数传递参数和返回值的约定。
  • EXTERNAL ACTION: 确定该函数是否可以执行外部动作。
  • SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。
  • FINAL CALL: 用于释放函数所占用的内存,并执行其他清理动作。

要了解更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。





回页首


清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:



                    
CREATE FUNCTION ntest1 (SMALLINT)
    RETURNS SMALLINT
    EXTERNAL NAME 'ntest1!nudft1'
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NULL CALL
    NO SQL 
    NO EXTERNAL ACTION

该函数接收一个 SMALLINT 类型的输入参数,并返回一个 SMALLINT 值。函数体中没有使用 SQL。需要注意的是,无论函数中实际的 C 代码是否经过正确的编译,产生的库(DLL)文件是否被放在适当的位置,上面的 CREATE FUNCTION 语句都会成功地执行。 如果库文件没有放在适当的位置,此时若执行上述函数,虽然函数能注册成功,但是会收到一个错误,表明没有发现函数库。由于这个原因,在使用外部函数时,必须按照正确的步骤编译函数,将函数库放入适当的位置,并使用 CREATE FUNCTION 语句注册函数。欲获得更多关于这些步骤的信息,请参阅 DB2 文档。

阅读(773859) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~