最近2天用了一下sybase,总结一下sybase存储过程和触发器的一些基本特点。 sybase据说在12.xx以后支持自定义function了,但是在Adaptive Server Enterprice版本中似乎不行, 但是函数可以通过存储过程来实现,因为存储过程也是有返回值的:)
存储过程 sybase的存储过程语法基本上与sqlserver相似
变量名需要前面加上@,比如@ABC 每行行末不需要分号(;) 基本函数什么的与sqlserver很接近,但有个烦人的charindex(字符查找函数)不一样,没有 开始查找位置的参数:(,只能自己来实现了。
1.基本结构 CREATE PROCEDURE 存储过程名字 @参数1 VARCHAR(100),//输入参数 @参数2 INT,//输入参数 @参数3 INT OUTPUT //输出参数 as declare @变量1 INT; @变量2 DATE; BEGIN xxxx END
2.SELECT INTO STATEMENT 这个似乎不支持,那只能用游标来实现了 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录 例子: BEGIN SELECT col1,col2 into @变量1,@变量2 FROM typestruct where xxx; END;
3.IF 判断 IF @V_TEST=1 BEGIN do something END
4.while 循环 WHILE @V_TEST=1 BEGIN XXXX END
5.变量赋值 set @V_TEST = 123 select @V_TEST = 123 6.使用cursor ... as declare cur_name CURSOR for SELECT * FROM xxx(表名,在触发器中可以是inserted,deleted) BEGIN open cur_name fetch cur_name into xxx,xxx... begin set @V_SUM =@xx+@yy end END
2.关于sybase触发器 sybase 不支持行级触发器,只能是语句级的,sqlserver也不支持,oracle和mysql是支持的(通过for each row)。 行级比如就是执行insert into xxx select * from xxx类似语句的时候,每插入一行调用一次触发器
语法: create trigger trigger_name on 绑定的表 for insert|update|delete as declare 声明变量 begin xxx end
因为不支持行级,可以通过游标来达到相同的目的,就是有点麻烦,比如:
create trigger t1_trigger on t1 for insert as declare cur_ins CURSOR for select name from inserted declare @name varchar(200) begin print 'fired ...' open cur_ins fetch cur_ins into @name while @@sqlstatus=0 begin print @name fetch cur_ins into @name end close cur_ins end
如果表t1一条语句插入多行,那么name就被打印多次。 author webjlwang at gmail.com
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|