游标是数据库内存里的一个位置,保存着最后一条sql语句。如果当前sql语句是个数据库查询,那么来自于查询的一行记录也保存在内存里,这一行记录是游标的当前值或当前行。内存里的这个区域是有特定名称的,可以在程序中访问。
SQLSERVER
--声明游标
--SQL语句填充游标
--打开游标
--FETCH检索提取的信息
--关闭游标
--删除游标
<span style="font-size:14px;">DECLARE @iNo INT
DECLARE @sPatronID VARCHAR(20)
DECLARE @sName VARCHAR(30)
--声明游标
DECLARE cMyCURSOR CURSOR for
--SQL语句填充游标
SELECT PartronID,Name FROM parton
--打开游标
open cMyCURSOR
--FETCH检索提取的信息
select @iNo = 0
fetch next from cMyCURSOR into @sPatronID, @sName
while @@fetch_status =0
begin
select @iNo = @iNo +1
print cast(@iNo as char(10)) + @sPatronID +@sName
fetch next from cMyCURSOR into @sPatronID, @sName
end
--对游标进行修改(更新或删除)
--关闭游标
close cMyCURSOR
--删除游标
deallocate cMyCURSOR</span>
MySQL :
CREATE PROCEDURE `test`.`new_procedure` ()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE a CHAR(16);
-- 游标
DECLARE cur CURSOR FOR SELECT i FROM test.t;
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur;
-- 开始循环
read_loop: LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO a;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 这里做你想做的循环的事件
INSERT INTO test.t VALUES (a);
END LOOP;
-- 关闭游标
CLOSE cur;
END
这里有一个比较坑的地方,注意,变量的定义不要和你的select的列的键同名!不然,fetch into 会失败!
另外 :
如果没有则插入数据,如果有则更新的方法:
insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;