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