T-SQL游标的使用

简介: T-SQL游标的使用

一.建表


INSERT INTO cloud VALUES( '你' )
INSERT INTO cloud VALUES( '一会看我' )
INSERT INTO cloud VALUES( '一会看云' )
INSERT INTO cloud VALUES( '我觉得' )
INSERT INTO cloud VALUES( '你看我时很远' )
INSERT INTO cloud VALUES( '你看云时很近' )


二.建立游标


1.游标的一般格式


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;


结果得:

36fad8a79b9e43ba8132913ac6d0774d.png


三.使用游标修改数据(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;


结果得:


5cdf73a6327a4002a87ccebd6d629c2e.png


四.可灵活移动的游标


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;


结果得

d551ffcdba7649f188448d00699a04db.png


五.可更新的游标


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进行操作


1. delete from cloud
2. WHERE CURRENT OF cursor_clould;


表示删除最后一个fetch命令从cursor_cloud游标获得的行


注:


嵌入式SQL UPDATE或DELETE可以使用WHERE子句(不带游标)或WHERE CURRENT OF(带声明游标),但不能同时使用两者。

如果指定的UPDATEDELETE既不带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>。


练习:


插入表如下


insert into words2 values(1,'你最可爱')
insert into words2 values(2,'我说时来不及思索')
insert into words2 values(3,'而思索过后')
insert into words2 values(4,'还是会这么说')


027bc1a36e7b4e36b033ee7a9df55ce9.png

    (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


0e10fc933fe44f838a15a3e17bc0cda7.png

(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


得到


7b6b84f8d2b648f4b1d4c9afbf373d40.png


(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


得到


1032df74dbc64269ab216aa5b7031d69.png


其中的加锁语句可以阅读这篇:


http://t.csdn.cn/Hox1D



目录
相关文章
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
6月前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
53 1
|
5月前
|
SQL 存储 Java
SQL游标的应用场景及使用方法
SQL游标的应用场景及使用方法
|
4月前
|
SQL 存储 搜索推荐
SQL游标的原理与在数据库操作中的应用
SQL游标的原理与在数据库操作中的应用
|
4月前
|
SQL Java 数据库连接
SQL游标的基本使用方法与示例
SQL游标的基本使用方法与示例
|
4月前
|
SQL 存储 Java
SQL游标的应用场景及使用方法
SQL游标的应用场景及使用方法
|
5月前
|
SQL 程序员 数据处理
探索SQL游标
探索SQL游标
|
5月前
|
存储 SQL 关系型数据库
MySQL游标的创建与使用——Baidu Comate全文SQL-AI生成
MySQL游标的创建与使用——Baidu Comate全文SQL-AI生成
46 0
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。

热门文章

最新文章

下一篇
无影云桌面