*给多个变量赋值
function只能使用
procedure只能使用
*function无法嵌套调用带有inout或out参数的procedure,现象为:无法创建。
今天的进展结论是:
function可以调用任何procedure,但必须声明为modifies sql data,同时必须返回table类型,不能使单值或row类型
*procedure可以嵌套调用,哪怕是带inout参数的存储过程.
*function 可以嵌套调用.
*IBM开发者网站一篇文章说:function的效率比procedure高。
我的答案是相反。
同样的语句,function和procedure的首次调用时间有10倍左右的差距。
经过测试有如下结论:
1.如果参数完全一样,两次调用同样的function,首次调用速度很慢(2秒左右),但第二次开始就很快(0.2秒左右),但后来很快的调用应该是采用了缓存机制,而这个缓存的生存期未知。
2.同样的函数,只要参数发生任何变化,那么首次还是会很慢。
3.procedure很稳定,第一次和后面的调用差别不大。并且都是0.2秒级的。
而且最让人纳闷的是哪怕代码仅是一些比较判断,根本不涉及数据,function的效率也不敢恭维。
所以如果是使用频率相当高的代码,无论如何,想方设法都得改成procedure。
*procedure无法进行动态out参数procedure调用。
什么意思呢,就是要调用的procedure不是硬编码的
这些限制完全没有任何的文档可以查询到,是实际测试后得出的结论,特记于此,免得以后又走弯路
目前已经写好了调用procedure的function,性能确实要强过直接调用function。但碰到了新问题:
*调用了procedure的function不能象一般function一样在select语句中查询,比如
func1 returns table()
func2 returns table() --其中调用了procedure
那么
*procedure 默认modifies sql data
经过试验,无法创建reads sql data类型的procedure
执行这个什么都不做的procedure,仅仅声明了reads sql data,报错:
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0577N 用户定义例程 "TMP"(特定名称 "")试图修改数据,但是该例程未定义为
MODIFIES SQL DATA。 LINE NUMBER=3. SQLSTATE=42985
服了DB2了
找到原因了!!!!
http://tech.ddvip.com/2008-12/1230630845103709.html
说道:
如果在一个复合 SQL 过程中使用 BEGIN ATOMIC 子句,那么创建该存储过程时必须指定 MODIFIES SQL DATA
去掉atomic关键字后,procedure 可以声明为reads sql data,同样不能嵌套调用的func的根本原因是:
如果function是modifies sql data 的,就不能嵌套调用,
而如果function调用的procedure 是modifies sql data 的,那么该function也必须声明为modifies sql data