游標與樹狀結構的遍歷

2021-04-29 10:26:10 字數 2066 閱讀 3158

create  procedure [dbo].[user_getlistmodule]

-- add the parameters for the stored procedure here

(@userid int

)    

asbegin

--整體思路:1.取得使用者可以訪問的所有模組id

--2.將每個模組的所有父級模組id,插入臨時表

--3.去除重複,與模組表連線取出所有模組資訊

--宣告臨時表,將使用者可以訪問的模組id全部放入臨時表

--最後,用distinct刪除重複id,再與原sys_module鏈結取出相關模組的資訊

declare @modules table

(moduleid int

)--宣告游標,遍歷id,取出每個模組的所有上級id

--將所有上級模組出入臨時表

declare modulecursor cursor for

select distinct(moduleid) from --獲取使用者可以訪問的模組id

(select * from v_user_position_function

where employeeid=@userid

union

select * from v_user_role_function

where employeeid=@userid

) as a

--開啟游標,提取id,獲取該模組的所有上級模組,並插入臨時表

open modulecursor;

--宣告臨時變數

declare @temp_moduleid int;

--提取第一條資料

fetch next  from modulecursor into @temp_moduleid

--迴圈遍歷

while @@fetch_status=0

begin

--將該模組的所有父級模組id,出入臨時表

--臨時表中的資料可能重複

insert into @modules(moduleid)

select moduleid from get_parentmodules(@temp_moduleid);

--提取下一條資料,以便開始迴圈

fetch next from modulecursor into @temp_moduleid

end--從臨時表中去除重複,取出模組資訊

select * from sys_module where moduleid in

(select distinct(moduleid) from @modules--去除臨時表中的重複id

)end

/////取出指定模組的所有上級模組

create function [dbo].[get_parentmodules]

(@moduleid int

)returns @parentmodules table

(moduleid int not null,

level int not null

)as

begin

--如果不存在指定模組,則直接返回

if not exists (select * from sys_module where moduleid=@moduleid)

return;

declare @level int;

set @level=0;

while @moduleid is not null

begin

--把當前模組插入臨時表

insert into @parentmodules(moduleid,level) values(@moduleid,@level)

--遞增級別計數器

set @level=@level+1;

set @moduleid=(select parentid from sys_module where moduleid=@moduleid)

endreturn;

end--select * from  [get_parentmodules](2)

Oracle 遞迴遍歷樹狀結構

connect by prior 是結構化查詢中用到的,其基本語法是 select from tablename start with 條件1 connect by prior 條件2 where 條件3 從root往樹末梢遞迴 sql select from tablename start wit...

SQL游標的原理與遍歷

游標的原理 一般情況下,sql查詢結果都是多條紀錄的結果集,而高階語言一次只能處理一條紀錄,用游標機制,將多條紀錄一次一條讀取出來處理。從而把對集合的操作轉化為對單個紀錄的處理。游標使用的步驟如下 1 說明游標。說明游標的時候並不執行select語句。declare 游標名 cursor for 2...

游標遍歷的幾種方式

1.定義游標 cursor c student is select id,first name,last name,major from t test students 遍歷游標 open c student loop fetch c student into v newid,v newfirstn...