Sybase:游標用法以及嵌套用法
游標示例一:
--Sybase游標示例一: create PROCEDURE DBA.p_proc_test() ON EXCEPTION RESUME begin declare @table_name varchar(100); declare @count varchar(100); declare @rownumber int; declare HISTORYDATA dynamic scroll cursor for select a.table_name ,a.count rownumber,number(*) from systable a,systable b,systable c order by a.count desc; open HISTORYDATA with hold; fetch next HISTORYDATA into @table_name,@count,@rownumber; while @@SQLSTATUS = 0 loop insert into test_tmp values(@table_name,@count,@rownumber); fetch next HISTORYDATA into @table_name,@count,@rownumber; end loop; close HISTORYDATA; deallocate cursor HISTORYDATA; end
游標示例二:
--Sybase游標使用示例二(循環): create PROCEDURE DBA.p_proc_test2() ON EXCEPTION RESUME begin declare @table_name varchar(100); declare @count varchar(100); declare @rownumber int; declare @num int; declare HISTORYDATA dynamic scroll cursor for select a.table_name ,a.count rownumber,number(*) from systable a order by a.count desc; set @num=(select 0); while @num<=30 loop open HISTORYDATA with hold; fetch next HISTORYDATA into @table_name,@count,@rownumber; while @@SQLSTATUS = 0 loop insert into test_tmp2 values(@table_name,@count,@rownumber,getdate()); fetch next HISTORYDATA into @table_name,@count,@rownumber; end loop; close HISTORYDATA; set @num=(select @num+1); end loop; deallocate cursor HISTORYDATA; end
游標示例三(嵌套):
--Sybase:游標嵌套用法 create PROCEDURE DBA.p_teset(@i_rq int) begin -- 聲明局部變量(變量需要一開始聲明) declare @cur_pk_corp varchar(50); declare @c_pk_corp varchar(50); declare @c_orgname varchar(50); declare @c_pk_org varchar(30); declare @c_pk_deptdoc varchar(20); declare @c_px int; declare @c_px_new int; -- 聲明游標 (游標需要一開始聲明) --游標一 declare c_corp dynamic scroll cursor for select a.pk_corp from t_corp a group by a.pk_corp order by a.pk_corp ; --游標二 declare c_org dynamic scroll cursor for select a.pk_corp, a.orgname, coalesce(b.pk_org,a.pk_org) as pk_org,a.pk_deptdoc, (select convert(int,case when substring(max(t.pk_org),char_length(max(t.pk_org)) ,char_length(max(t.pk_org))) is null then '0' else substring(max(t.pk_org),char_length(max(t.pk_org)) ,char_length(max(t.pk_org))) end) from dba.t_dim_org_fix t where t.pk_corp=a.pk_corp) as px from t_corp a left outer join dba.t_org_fix b on a.pk_corp=b.pk_corp and a.pk_deptdoc=b.pk_deptdoc and a.pk_corp=@cur_pk_corp ; --初始化參數 set @c_px = 0; -- 打開游標 open c_corp with hold; FETCH NEXT c_corp INTO @cur_pk_corp; --循環一個游標 WHILE @@SQLSTATUS = 0 loop set @c_px_new =1; -- 循環所有行 -- 聲明局部變量 -- 打開游標 open c_org with hold; FETCH NEXT c_org INTO @c_pk_corp, @c_orgname, @c_pk_org, @c_pk_deptdoc, @c_px; -- 循環所有行 WHILE @@SQLSTATUS = 0 loop -- 循環所有行 set @c_px = @c_px + @c_px_new ; set @c_px_new = @c_px_new +1; insert into dba.t_org_fix(pk_org,hr_name,enable_date,disabled_date,remark,pk_corp,pk_deptdoc) values(@pk_org||'X'||@c_px,@c_orgname,@i_rq,20991231,'', @c_pk_corp, @c_pk_deptdoc); FETCH NEXT c_org INTO @c_pk_corp, @c_orgname, @c_pk_org, @c_pk_deptdoc, @c_px; END loop; -- 關閉游標 close c_org; FETCH NEXT c_corp INTO @cur_pk_corp; end loop; -- 關閉游標 close c_corp ; --釋放資源(最后釋放) DEALLOCATE cursor c_org; DEALLOCATE CURSOR c_corp;
end