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
相关文档:
创建作业:
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水平考试,看了写教材,写了点总结发上来跟大家分享。
我公司使用的是Sybase ASE12.5,所以下面的一些特性是针对Sybase ASE的。
一:SQL Bisic
1:SQL(Structured Quary Language)特性:
a:标准化
b:非过程化的
c:可优化的
d:面向集合操作的
2:ASE中的数据类型
a:Numberic
b:Character
c:Dat ......
一、字符转换函数
1、ASCII()
返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
2、CHAR()
将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL 。
3、LOWE ......
通过分析SQL语句的执行计划优化SQL(总结)
做 DBA快7年了,中间感悟很多。在DBA的日常工作中,调整个别性能较差的SQL语句时一项富有挑战性的工作。其中的关键在于如何得到SQL语句的执行计划和如何从SQL语句的执行计划中发现问题。总是想将日常经验的点点滴滴总结一下,但是直到最近才下定决心,总共花了3个周末时间,才将其 ......
CREATE FUNCTION StringToBarcode
(@Value Varchar(50) )
RETURNS NVarchar(100)
AS
BEGIN
Declare @charCount int
Declare @charPos int, @minCharPos int
declare @currentChar int, @checksum int
Declare @isTableB int,@isValid int
&n ......