天天看點

sql 遊标

關于遊标的詳細資訊可參見博文

本文隻是針對sql2008下函數使用遊标的完整方法的展示

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

<code>USE [hbsp]</code>

<code>GO</code>

<code>/****** Object:  UserDefinedFunction [dbo].[Func_GetTeamLeader]    Script Date: 06/06/2014 09:31:23 ******/</code>

<code>SET ANSI_NULLS ON</code>

<code>SET QUOTED_IDENTIFIER ON</code>

<code>-- =============================================</code>

<code>-- Author:      &lt;Author,,Name&gt;</code>

<code>-- Create date: &lt;Create Date,,&gt;</code>

<code>-- Description: &lt;Description,,&gt;</code>

<code>ALTER  function [dbo].[Func_GetTeamLeader]( @SPT_ID</code><code>char</code><code>(13)) returns varchar(50)</code>

<code>as</code>

<code>begin</code>

<code> </code> 

<code>   </code><code>declare vLeader cursor</code><code>for</code>

<code>select</code> <code>r.name</code>

<code>from</code> 

<code>       </code><code>dbo.t_spmember</code><code>as</code>

<code>m,</code>

<code>       </code><code>dbo.renyzl</code><code>as</code>

<code>r</code>

<code>where</code> 

<code>       </code><code>r.per_num =m.spm_num</code>

<code>   </code><code>and m.spt_id=rtrim(@SPT_ID) and m.SPM_ORDER=1 ;</code>

<code>   </code> 

<code> </code><code>declare @sResult varchar(50)</code>

<code> </code><code>declare @sTmp  varchar(50)</code>

<code> </code><code>declare @name varchar(50)</code>

<code> </code><code>set</code>

<code>@sResult =</code><code>‘‘</code>

<code>  </code> 

<code>  </code><code>-- 打開遊标</code>

<code> </code><code>OPEN vLeader</code>

<code> </code><code>-- 周遊遊标開始</code>

<code> </code><code>FETCH NEXT FROM vLeader INTO @name</code>

<code> </code><code>WHILE @@FETCH_STATUS = 0</code>

<code>  </code><code>BEGIN</code>

<code> </code><code>if</code>

<code>(rtrim( @name)</code><code>is</code>

<code>not</code><code>null</code><code>)</code>

<code> </code><code>begin</code>

<code>       </code><code>set</code> 

<code>@sTmp = rtrim(@name);</code>

<code>       </code> 

<code>        </code><code>if</code>

<code>(len(rtrim(@sResult + @sTmp)) &lt;= 2000 )</code>

<code>            </code><code>begin</code>

<code>               </code><code>if</code>

<code>(rtrim( @sResult)</code><code>is</code>

<code>not</code><code>null</code>

<code>)</code>

<code>               </code><code>BEGIN</code>

<code>               </code><code>set</code>

<code>@sResult = @sResult + @sTmp+</code><code>‘,‘</code>

<code>;</code>

<code>               </code><code>END</code>

<code>              </code><code>end</code>

<code>   </code><code>end</code>

<code>    </code><code>-- 下一個</code>

<code>    </code><code>FETCH NEXT FROM vLeader INTO @name</code>

<code>  </code><code>END</code>

<code> </code><code>-- 關閉遊标</code>

<code> </code><code>CLOSE vLeader</code>

<code> </code><code>-- 釋放遊标</code>

<code> </code><code>DEALLOCATE vLeader</code>

<code> </code><code>if</code><code>(rtrim( @sResult)</code><code>is</code>

<code>  </code><code>begin</code>

<code>  </code><code>set</code>

<code>@sResult=SUBSTRING(@sResult,1,len(@sResult)-1);</code>

<code>  </code><code>end</code>

<code>  </code><code>return</code>

<code>@sResult</code>

<code>end;</code>

 sql2008下遊标中的參數必須全部定義參數的長度,否則會查不出結果

oracle 中函數使用遊标執行個體與上面sql的方法相同

<code>create or replace function Func_GetTeamLeader(tnum</code><code>char</code>

<code>)</code><code>return</code>

<code>char</code>

<code>is</code>

<code>cursor vLeader(v</code><code>char</code><code>)</code><code>is</code> 

<code>     </code><code>select</code>

<code>r.name</code>

<code>       </code><code>t_spmember m,</code>

<code>       </code><code>renyzl r</code>

<code>   </code><code>and m.spt_id=trim(v) and SPM_ORDER=1 ;</code>

<code>rwf vLeader%rowtype;</code>

<code>sResult varchar2(2000);</code>

<code>sTmp    varchar2(2000);</code>

<code>  </code><code>sResult :=</code><code>‘‘</code><code>;</code>

<code>  </code><code>for</code>

<code>rwf</code><code>in</code>

<code>vLeader(tnum) loop</code>

<code>     </code><code>if</code>

<code>rtrim( rwf.name)</code><code>is</code>

<code>then</code>

<code>        </code><code>sTmp := rtrim(rwf.name);</code>

<code>length(rtrim(sResult || sTmp)) &lt;= 2000 then</code>

<code>           </code><code>sResult := sResult || sTmp ||</code><code>‘,‘</code><code>;</code>

<code>        </code><code>else</code>

<code>           </code><code>exit;</code>

<code>        </code><code>end</code><code>if</code><code>;</code>

<code>     </code><code>end</code><code>if</code><code>;</code>

<code>  </code><code>end loop;</code>

<code>  </code><code>if</code>

<code>rtrim( sResult)</code><code>is</code>

<code>     </code><code>sResult:= substr( sResult,1, length(sResult)-1);</code>

<code>  </code><code>end</code><code>if</code><code>;</code>

<code> </code><code>return</code>

<code>sResult;</code>