Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90788937
  • 博文数量: 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博客
  • 博客访问: 90788938
  • 博文数量: 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博客
  • 博客访问: 90788939
  • 博文数量: 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博客
  • 博客访问: 90788940
  • 博文数量: 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博客
  • 博客访问: 90788941
  • 博文数量: 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博客
  • 博客访问: 90788942
  • 博文数量: 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博客
  • 博客访问: 90788943
  • 博文数量: 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博客
  • 博客访问: 90788944
  • 博文数量: 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博客
  • 博客访问: 90788945
  • 博文数量: 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博客
  • 博客访问: 90788946
  • 博文数量: 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博客
  • 博客访问: 90788947
  • 博文数量: 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博客
  • 博客访问: 90788948
  • 博文数量: 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博客
  • 博客访问: 90788939
  • 博文数量: 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博客
  • 博客访问: 90788950
  • 博文数量: 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博客
  • 博客访问: 90788951
  • 博文数量: 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博客
  • 博客访问: 90788952
  • 博文数量: 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博客
  • 博客访问: 90788953
  • 博文数量: 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博客
  • 博客访问: 90788954
  • 博文数量: 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博客
  • 博客访问: 90788955
  • 博文数量: 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博客
  • 博客访问: 90788956
  • 博文数量: 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博客
  • 博客访问: 90788957
  • 博文数量: 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博客
  • 博客访问: 90788958
  • 博文数量: 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博客
  • 博客访问: 90788959
  • 博文数量: 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博客
  • 博客访问: 90788960
  • 博文数量: 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博客
  • 博客访问: 90788961
  • 博文数量: 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博客
  • 博客访问: 90788962
  • 博文数量: 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博客
  • 博客访问: 90788963
  • 博文数量: 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博客
  • 博客访问: 90788954
  • 博文数量: 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博客
  • 博客访问: 90788965
  • 博文数量: 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博客
  • 博客访问: 90788966
  • 博文数量: 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博客
  • 博客访问: 90788967
  • 博文数量: 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博客
  • 博客访问: 90788968
  • 博文数量: 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博客
  • 博客访问: 90788969
  • 博文数量: 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博客
  • 博客访问: 90788970
  • 博文数量: 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博客
  • 博客访问: 90788971
  • 博文数量: 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博客
  • 博客访问: 90788972
  • 博文数量: 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博客
  • 博客访问: 90788973
  • 博文数量: 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博客
  • 博客访问: 90788974
  • 博文数量: 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博客
  • 博客访问: 90788975
  • 博文数量: 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博客
  • 博客访问: 90788976
  • 博文数量: 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博客
  • 博客访问: 90788977
  • 博文数量: 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博客
  • 博客访问: 90788978
  • 博文数量: 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博客
  • 博客访问: 90788969
  • 博文数量: 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博客
  • 博客访问: 90788980
  • 博文数量: 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博客
  • 博客访问: 90788981
  • 博文数量: 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博客
  • 博客访问: 90788982
  • 博文数量: 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博客
  • 博客访问: 90788983
  • 博文数量: 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博客
  • 博客访问: 90788984
  • 博文数量: 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博客
  • 博客访问: 90788985
  • 博文数量: 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博客
  • 博客访问: 90788986
  • 博文数量: 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博客
  • 博客访问: 90788987
  • 博文数量: 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博客
  • 博客访问: 90788988
  • 博文数量: 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 文档。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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