关于游标的详细信息可参见http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html博文
本文只是针对sql2008下函数使用游标的完整方法的展示
USE [hbsp] GO /****** Object: UserDefinedFunction [dbo].[Func_GetTeamLeader] Script Date: 06/06/2014 09:31:23 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER function [dbo].[Func_GetTeamLeader]( @SPT_ID char(13)) returns varchar(50) as begin declare vLeader cursor for select r.name from dbo.t_spmember as m, dbo.renyzl as r where r.per_num =m.spm_num and m.spt_id=rtrim(@SPT_ID) and m.SPM_ORDER=1 ; declare @sResult varchar(50) declare @sTmp varchar(50) declare @name varchar(50) set @sResult ='' -- 打开游标 OPEN vLeader -- 遍历游标开始 FETCH NEXT FROM vLeader INTO @name WHILE @@FETCH_STATUS = 0 BEGIN if (rtrim( @name) is not null) begin set @sTmp = rtrim(@name); if (len(rtrim(@sResult + @sTmp)) <= 2000 ) begin if (rtrim( @sResult) is not null ) BEGIN set @sResult = @sResult + @sTmp+',' ; END end end -- 下一个 FETCH NEXT FROM vLeader INTO @name END -- 关闭游标 CLOSE vLeader -- 释放游标 DEALLOCATE vLeader if(rtrim( @sResult) is not null) begin set @sResult=SUBSTRING(@sResult,1,len(@sResult)-1); end return @sResult end;
sql2008下游标中的参数必须全部定义参数的长度,否则会查不出结果
oracle 中函数使用游标实例与上面sql的方法相同
create or replace function Func_GetTeamLeader(tnum char ) return char is cursor vLeader(v char) is select r.name from t_spmember m, renyzl r where r.per_num =m.spm_num and m.spt_id=trim(v) and SPM_ORDER=1 ; rwf vLeader%rowtype; sResult varchar2(2000); sTmp varchar2(2000); begin sResult :=''; for rwf in vLeader(tnum) loop if rtrim( rwf.name) is not null then sTmp := rtrim(rwf.name); if length(rtrim(sResult || sTmp)) <= 2000 then sResult := sResult || sTmp || ','; else exit; end if; end if; end loop; if rtrim( sResult) is not null then sResult:= substr( sResult,1, length(sResult)-1); end if; return sResult; end;