· 9 years ago · Nov 28, 2016, 11:20 AM
1create table File
2 (
3 id char(30) not null,
4 position int not null unique,
5 primary key (id)
6 );
7
8create table Cluster
9 (
10 id int not null auto_increment,
11 next int not null unique,
12 primary key (id)
13 );
14
15create procedure Copy
16 @fileId char(30)
17 as
18 begin
19 set transaction isolation level read uncommitted
20 begin transaction
21 declare @curr int
22 declare @prev int
23 set @curr = (select position from File where id = @fileId)
24 set @prev = null
25
26 while @curr <> -1
27 begin
28 set @lastId = 0
29 while exists (select * from Cluster where id = @lastId)
30 begin
31 @lastId = @lastId + 1;
32 end
33
34 insert into Cluster
35 values (@lastId, -1)
36 if @prev <> null
37 begin
38 update Cluster
39 set next = @lastId
40 where id = @prev
41 end
42 set @prev = @listId
43 set @curr = (select next from Clister where id = @curr)
44 end