sql 游标

关于游标的详细信息可参见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;

 

 

 

你可能感兴趣的:(sql)