Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105450003
  • 博文数量: 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博客
  • 博客访问: 105450005
  • 博文数量: 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博客
  • 博客访问: 105450006
  • 博文数量: 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博客
  • 博客访问: 105450007
  • 博文数量: 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博客
  • 博客访问: 105450008
  • 博文数量: 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博客
  • 博客访问: 105449999
  • 博文数量: 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博客
  • 博客访问: 105450011
  • 博文数量: 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博客
  • 博客访问: 105450012
  • 博文数量: 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博客
  • 博客访问: 105450013
  • 博文数量: 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博客
  • 博客访问: 105450014
  • 博文数量: 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博客
  • 博客访问: 105450015
  • 博文数量: 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博客
  • 博客访问: 105450016
  • 博文数量: 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博客
  • 博客访问: 105450017
  • 博文数量: 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博客
  • 博客访问: 105450018
  • 博文数量: 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博客
  • 博客访问: 105450019
  • 博文数量: 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博客
  • 博客访问: 105450020
  • 博文数量: 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博客
  • 博客访问: 105450021
  • 博文数量: 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博客
  • 博客访问: 105450022
  • 博文数量: 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博客
  • 博客访问: 105450023
  • 博文数量: 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博客
  • 博客访问: 105450014
  • 博文数量: 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博客
  • 博客访问: 105450025
  • 博文数量: 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博客
  • 博客访问: 105450026
  • 博文数量: 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博客
  • 博客访问: 105450027
  • 博文数量: 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博客
  • 博客访问: 105450028
  • 博文数量: 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博客
  • 博客访问: 105450029
  • 博文数量: 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博客
  • 博客访问: 105450030
  • 博文数量: 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博客
  • 博客访问: 105450031
  • 博文数量: 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博客
  • 博客访问: 105450032
  • 博文数量: 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博客
  • 博客访问: 105450033
  • 博文数量: 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博客
  • 博客访问: 105450034
  • 博文数量: 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博客
  • 博客访问: 105450035
  • 博文数量: 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博客
  • 博客访问: 105450036
  • 博文数量: 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博客
  • 博客访问: 105450037
  • 博文数量: 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博客
  • 博客访问: 105450038
  • 博文数量: 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博客
  • 博客访问: 105450029
  • 博文数量: 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博客
  • 博客访问: 105450040
  • 博文数量: 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博客
  • 博客访问: 105450041
  • 博文数量: 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博客
  • 博客访问: 105450042
  • 博文数量: 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博客
  • 博客访问: 105450043
  • 博文数量: 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博客
  • 博客访问: 105450044
  • 博文数量: 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博客
  • 博客访问: 105450045
  • 博文数量: 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博客
  • 博客访问: 105450046
  • 博文数量: 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博客
  • 博客访问: 105450047
  • 博文数量: 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博客
  • 博客访问: 105450048
  • 博文数量: 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博客
  • 博客访问: 105450049
  • 博文数量: 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博客
  • 博客访问: 105450050
  • 博文数量: 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博客
  • 博客访问: 105450051
  • 博文数量: 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博客
  • 博客访问: 105450052
  • 博文数量: 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博客
  • 博客访问: 105450053
  • 博文数量: 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博客
  • 博客访问: 105450044
  • 博文数量: 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博客
  • 博客访问: 105450055
  • 博文数量: 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博客
  • 博客访问: 105450056
  • 博文数量: 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 文档。

阅读(773614) | 评论(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 文档。

阅读(773613) | 评论(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 文档。

阅读(773612) | 评论(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 文档。

阅读(773611) | 评论(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 文档。

阅读(773610) | 评论(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 文档。

阅读(773609) | 评论(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 文档。

阅读(773608) | 评论(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 文档。

阅读(773607) | 评论(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 文档。

阅读(773606) | 评论(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 文档。

阅读(773605) | 评论(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 文档。

阅读(773604) | 评论(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 文档。

阅读(773603) | 评论(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 文档。

阅读(773602) | 评论(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 文档。

阅读(773601) | 评论(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 文档。

阅读(773600) | 评论(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 文档。

阅读(773599) | 评论(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 文档。

阅读(773598) | 评论(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 文档。

阅读(773597) | 评论(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 文档。

阅读(773596) | 评论(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 文档。

阅读(773595) | 评论(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 文档。

阅读(773594) | 评论(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 文档。

阅读(773593) | 评论(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 文档。

阅读(773592) | 评论(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 文档。

阅读(773591) | 评论(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 文档。

阅读(773590) | 评论(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 文档。

阅读(773589) | 评论(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 文档。

阅读(773588) | 评论(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 文档。

阅读(773587) | 评论(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 文档。

阅读(773586) | 评论(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 文档。

阅读(773585) | 评论(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 文档。

阅读(773584) | 评论(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 文档。

阅读(773583) | 评论(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 文档。

阅读(773582) | 评论(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 文档。

阅读(773581) | 评论(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 文档。

阅读(773580) | 评论(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 文档。

阅读(773579) | 评论(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 文档。

阅读(773578) | 评论(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 文档。

阅读(773577) | 评论(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 文档。

阅读(773576) | 评论(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 文档。

阅读(773575) | 评论(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 文档。

阅读(773574) | 评论(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 文档。

阅读(773573) | 评论(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 文档。

阅读(773572) | 评论(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 文档。

阅读(773571) | 评论(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 文档。

阅读(773570) | 评论(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 文档。

阅读(773569) | 评论(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 文档。

阅读(773568) | 评论(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 文档。

阅读(773567) | 评论(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 文档。

阅读(773566) | 评论(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 文档。

阅读(773565) | 评论(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 文档。

阅读(773564) | 评论(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 文档。

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