關于遊标的詳細資訊可參見博文
本文隻是針對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: <Author,,Name></code>
<code>-- Create date: <Create Date,,></code>
<code>-- Description: <Description,,></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)) <= 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)) <= 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>