Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103739429
  • 博文数量: 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博客
  • 博客访问: 103739430
  • 博文数量: 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博客
  • 博客访问: 103739431
  • 博文数量: 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博客
  • 博客访问: 103739432
  • 博文数量: 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博客
  • 博客访问: 103739433
  • 博文数量: 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博客
  • 博客访问: 103739434
  • 博文数量: 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博客
  • 博客访问: 103739435
  • 博文数量: 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博客
  • 博客访问: 103739436
  • 博文数量: 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博客
  • 博客访问: 103739437
  • 博文数量: 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博客
  • 博客访问: 103739438
  • 博文数量: 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博客
  • 博客访问: 103739429
  • 博文数量: 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博客
  • 博客访问: 103739440
  • 博文数量: 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博客
  • 博客访问: 103739441
  • 博文数量: 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博客
  • 博客访问: 103739442
  • 博文数量: 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博客
  • 博客访问: 103739443
  • 博文数量: 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博客
  • 博客访问: 103739444
  • 博文数量: 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博客
  • 博客访问: 103739445
  • 博文数量: 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博客
  • 博客访问: 103739446
  • 博文数量: 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博客
  • 博客访问: 103739447
  • 博文数量: 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博客
  • 博客访问: 103739448
  • 博文数量: 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博客
  • 博客访问: 103739449
  • 博文数量: 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博客
  • 博客访问: 103739450
  • 博文数量: 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博客
  • 博客访问: 103739451
  • 博文数量: 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博客
  • 博客访问: 103739452
  • 博文数量: 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博客
  • 博客访问: 103739453
  • 博文数量: 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博客
  • 博客访问: 103739444
  • 博文数量: 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博客
  • 博客访问: 103739455
  • 博文数量: 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博客
  • 博客访问: 103739456
  • 博文数量: 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博客
  • 博客访问: 103739457
  • 博文数量: 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博客
  • 博客访问: 103739458
  • 博文数量: 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博客
  • 博客访问: 103739459
  • 博文数量: 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博客
  • 博客访问: 103739460
  • 博文数量: 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博客
  • 博客访问: 103739461
  • 博文数量: 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博客
  • 博客访问: 103739462
  • 博文数量: 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博客
  • 博客访问: 103739463
  • 博文数量: 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博客
  • 博客访问: 103739464
  • 博文数量: 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博客
  • 博客访问: 103739465
  • 博文数量: 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博客
  • 博客访问: 103739466
  • 博文数量: 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博客
  • 博客访问: 103739467
  • 博文数量: 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博客
  • 博客访问: 103739468
  • 博文数量: 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博客
  • 博客访问: 103739459
  • 博文数量: 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博客
  • 博客访问: 103739470
  • 博文数量: 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博客
  • 博客访问: 103739471
  • 博文数量: 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博客
  • 博客访问: 103739472
  • 博文数量: 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博客
  • 博客访问: 103739473
  • 博文数量: 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博客
  • 博客访问: 103739474
  • 博文数量: 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博客
  • 博客访问: 103739475
  • 博文数量: 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博客
  • 博客访问: 103739476
  • 博文数量: 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博客
  • 博客访问: 103739477
  • 博文数量: 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博客
  • 博客访问: 103739478
  • 博文数量: 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博客
  • 博客访问: 103739479
  • 博文数量: 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博客
  • 博客访问: 103739480
  • 博文数量: 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 文档。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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