易截截图软件、单文件、免安装、纯绿色、仅160KB

DB2 纯SQL存储过程与函数的一些限制

*给多个变量赋值
function只能使用
set (a,b,c)=(select a,b,c from #);
procedure只能使用
select a,b,c into a,b,c from #
*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不是硬编码的
--这是没有问题的
create procedure out_proc
call in_proc;
end
--这也没有问题的
create procedure out_proc
...
statment='call in_proc()';
prepare s1 from statment;
execute s1;
end
--可以创建,但运行时会报错
create procedure out_proc
...
declare out_param int;
statment='call in_proc('||cast(out_param as char(10))||')';
prepare statment;
execute statment;
end
这些限制完全没有任何的文档可以查询到,是实际测试后得出的结论,特记于此,免得以后又走弯路
目前已经写好了调用procedure的function,性能确实要强过直接调用function。但碰到了新问题:
*调用了procedure的function不能象一般function一样在select语句中查询,比如
func1 returns table()
func2 returns table() --其中调用了procedure
那么
--直接获取func1,正常
select * from table(func1) as tmp
--直接获取func2,正常
select * from t


相关文档:

sql 创建作业 日期转换 约束 游标

创建作业:
DECLARE @jobid uniqueidentifier, @jobname sysname
SET @jobname = N'作业名称'
IF EXISTS(SELECT * from msdb.dbo.sysjobs WHERE name=@jobname)
EXEC msdb.dbo.sp_delete_job @job_name=@jobname
EXEC msdb.dbo.sp_add_job
@job_name = @jobname,
@job_id = @jobid OUTPUT
--定义作业步骤
DECLARE ......

SQL *PLUS Repost的开发方法

SQL *PLUS  Repost的开发方法
使用SQL*PLUS 可直接在IE Browser中生成规整的字符型Report. 实现方法简单,布署容易。
方法:
1.       利用文本编辑器编写SQL*PLUS  脚本,保存成 .sql 文件。
2.       上传sql 文件至应用的sql 目录。
3.  ......

sql 时间格式转换

语句及查询结果:
SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
SELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06
SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16
SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06
SELECT CONVERT(varchar(100), GETDATE(), 4): 16.05.06
SE ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号