最近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