一.建表
INSERT INTO cloud VALUES( '你' )
INSERT INTO cloud VALUES( '一会看我' )
INSERT INTO cloud VALUES( '一会看云' )
INSERT INTO cloud VALUES( '我觉得' )
INSERT INTO cloud VALUES( '你看我时很远' )
INSERT INTO cloud VALUES( '你看云时很近' )
二.建立游标
DECLARE 游标名称 CURSOR
FOR
SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
BEGIN
SQL语句
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
END
CLOSE 游标名称
DEALLOCATE 游标名称 (释放游标)
cursor:表示在光标当前位置执行操作
2.实例:
DECLARE
@v_line varchar(50) ---------声明一个装载语句的字符串
DECLARE cursor_cloud CURSOR
FOR
SELECT linetext from cloud;
BEGIN
OPEN cursor_cloud; -------打开游标
FETCH NEXT FROM cursor_cloud INTO @v_line-------将游标移向下一行,把获取的内容放入@V_line
WHILE @@FETCH_STATUS = 0 -------检测是否成功获取数据
BEGIN
PRINT @v_line -------进行SQL语句操作
FETCH NEXT FROM cursor_cloud INTO @v_line-------向下移行
END
CLOSE cursor_cloud; -------关闭游标
DEALLOCATE cursor_cloud; -------释放游标
END;
结果得:
三.使用游标修改数据(update)
DECLARE
@v_line varchar(50),
@i int
DECLARE cursor_cloud CURSOR
FOR
SELECT linetext from cloud;
BEGIN
SET @i = 0;
OPEN cursor_cloud;
FETCH NEXT FROM cursor_cloud INTO @v_line
WHILE @@FETCH_STATUS = 0
BEGIN
SET @i = @i + 1;
UPDATE cloud SET linetext = CAST(@i as varchar(5)) + ' ' + @v_line WHERE linetext =
@v_line;
FETCH NEXT FROM cursor_cloud INTO @v_line
END
CLOSE cursor_cloud;
DEALLOCATE cursor_cloud;
END;
结果得:
四.可灵活移动的游标
DECLARE
@v_line varchar(50)
DECLARE cursor_cloud CURSOR SCROLL
FOR
SELECT linetext from cloud;
BEGIN
OPEN cursor_cloud;
FETCH FIRST FROM cursor_cloud INTO @v_line
PRINT '第一行 ' + @v_line
FETCH NEXT FROM cursor_cloud INTO @v_line
PRINT '第一行的下一行 ' + @v_line
FETCH LAST FROM cursor_cloud INTO @v_line
PRINT '最后一行 ' + @v_line
FETCH PRIOR FROM cursor_cloud INTO @v_line
PRINT '最后一行的前一行 ' + @v_line
CLOSE cursor_cloud;
DEALLOCATE cursor_cloud;
END;
结果得
五.可更新的游标
DECLARE
@v_line varchar(50),
@i int
DECLARE cursor_cloud CURSOR
FOR
SELECT linetext from cloud for update;
BEGIN
DECLARE @v_new_line varchar(50);
SET @i = 0;
OPEN cursor_cloud;
FETCH NEXT FROM cursor_cloud INTO @v_line
WHILE @@FETCH_STATUS = 0
BEGIN
set @v_new_line = SUBSTRING( @v_line, 2,100 );
UPDATE cloud SET linetext = @v_new_line WHERE CURRENT OF cursor_cloud;
FETCH NEXT FROM cursor_cloud INTO @v_line
END
CLOSE cursor_cloud;
DEALLOCATE cursor_cloud;
END;
通过update...........where current of进行游标的更新
UPDATE cloud SET linetext = @v_new_line WHERE CURRENT OF cursor_cloud;
表示更新最后一个fetch命令从cursor_cloud游标获得的行
where current of不仅能结合update操作,也能结合delete进行操作
delete from cloud
WHERE CURRENT OF cursor_clould;
表示删除最后一个fetch命令从cursor_cloud游标获得的行
注:
嵌入式SQL UPDATE
或DELETE
可以使用WHERE
子句(不带游标)或WHERE CURRENT OF
(带声明游标),但不能同时使用两者。
如果指定的UPDATE
或DELETE
既不带WHERE
也不带WHERE CURRENT OF
,则会更新或删除表中的所有记录。
更新的限制
当使用WHERE CURRENT OF子句时,不能使用当前字段值更新字段以生成更新的值。
例如,SET Salary=Salary+200或SET Name=UPPER(Name):将字段的字母全部变成大写。
尝试这样做会导致
SQLCODE -69错误:SET <field> = <value expression> not allowed with WHERE CURRENT OF <cursor>。
————————————————
原文链接:https://blog.csdn.net/yaoxin521123/article/details/121602006
练习:
插入表如下
insert into words2 values(1,'你最可爱')
insert into words2 values(2,'我说时来不及思索')
insert into words2 values(3,'而思索过后')
insert into words2 values(4,'还是会这么说')
(1)
declare
@num int,@linetext varchar(100)
declare cursor_words cursor scroll
for
select linetext from words2
set @num=1
open cursor_words
fetch next from cursor_words into @linetext
while @@FETCH_STATUS=0
begin
print '普希金说的第'+cast(@num as varchar(10))+'句话:'+@linetext
fetch next from cursor_words into @linetext
set @num = @num+1
end
print ' '
print'他一共说了'+cast(@num-1 as varchar(10))+'句话'
close cursor_words
deallocate cursor_words
(2) 在奇数行后面加逗号,偶数行后面加句号
declare
@i int,@linetext varchar(100)
declare cursor_words cursor
for
select linetext from words2
begin
set @i=0
open cursor_words;
fetch next from cursor_words into @linetext
while @@FETCH_STATUS=0
begin
set @i=@i+1
if(@i%2=1)
update words2
set linetext=@linetext+',' where linenum=@i
else
update words2
set linetext=@linetext+'。' where linenum=@i
fetch next from cursor_words into @linetext
end
close cursor_words
deallocate cursor_words
end
再用
select * from words2
得到
(3)将奇数行和偶数行合并在一起,同时调整相应的行号
重点:where current of
declare @num int,@linetext varchar(50),@newline varchar(100)
declare cursor_words2 cursor
for
select linetext from words2 for update;-----手工加锁语句
set @num = 1
set @newline = ''
open cursor_words2
fetch next from cursor_words2 into @linetext
while @@FETCH_STATUS=0
begin
set @newline=@newline+@linetext
if @num%2=1
delete from words2 WHERE CURRENT OF cursor_words2----------删除奇数行
else
begin
update words2 set linetext=@newline,linenum=@num/2 WHERE CURRENT OF cursor_words2-----------修改行号
set @newline=''
end
fetch next from cursor_words2 into @linetext
set @num = @num +1
end
close cursor_words2
deallocate cursor_words2
再用
select *from words2
得到
其中的加锁语句可以阅读这篇:
http://t.csdn.cn/Hox1D