游标可以处理SQL语句查询出来的结果集,进行逐条控制,其实游标在内存中申请空间,将自己指向SQL语句查询出来的结果集,有点像指针的感觉,游标使SQL更加的灵活。

DECLARE
CURSOR mycur IS --申请内存
SELECT * FROM books; --查出结果集 要实现对结果逐条处理
myrecord books%ROWTYPE; --准备变量 用于游标取出的数据的存储 因为取出表中所有的字段采取%ROWTYPE记                        录的方式
BEGIN
OPEAN mycur;                --打开游标结果集
FETCH mycur INTO myrecord;        --将结果集存在变量中 取得是SELECT语句结果集的第一条
WHILE mycur%FOUND LOOP --如果游标中有数据则执行循环 在LOOP前必须先有FETCH语句 才能判断是否有据
DBMS_OUTPUT.PUT_LINE(myrecord.books_id||','||myrecord.books_name); --输出字段 ||为连接字符串的 像是'+' 也可以连接不同类型的变量
FETCH mycur INTO myrecord;
END LOOP;
CLOSE mycur;
END;
/

游标属性:

  %FOUND 表示游标里是否有数据可取布尔类型判断 之前没有FETCH语句之前 bool值为空

  %ISOPEN 当游标打开时为true

  %ROWCOUNT 表示已经从游标中取出的数据的个数

带参数的游标的写法:

DECLARE
CURSOR cur_para(id varchar2) IS --参数不需要添加长度 不用写varchar2(10)
SELECT book_name FROM books WHERE book_id=id;
t_name books.book_name%TYPE; --定义变量t_name指定t_name为books.book_name类型和长度
BEGIN
OPEAN cur_para(''); --传进参数0001
LOOP
FETCH cur_para INTO t_name;
EXIT WHEN cur_para%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(t_name);
END LOOP;
END;
/
DECLARE
t_name varchar2();
CURSOR mycur IS
SELECT name FROM deptment;
BEGIN
OPEN mysur;
LOOP
FETCH mycur INTO t_name;
EXIT WHEN mycur%NOTFOUND OR mycur%NOTFOUND IS NULL;
DBMS_OUTPUT.PUT_LINE('游标mycur ROWCOUNT:'||mycur%ROWCOUNT);
END LOOP;
CLOSE mycur;
END;
/

利用游标修改数据:

在用游标修改表时 如修改student表 必须是SELECT * FROM student FOR UPDATE;FOR UPDATE 相当于解开修改数据的小锁头。

DECLARE
CURSOR cur IS
SELECT name FROM deptment FOR UPDATE;
text varchar2(10);
BEGIN
OPEN cur;
FETCH cur INTO text; --将游标中的数据取出放入text
WHILE cur%FOUND LOOP
UPDATE deptment SET name=name||'_t' WHERE CURRENT OF cur; --判断游标当前行 修改当前行数据
FETCH cur INTO text;
END LOOP;
CLOSE cur;
END;
/

隐式游标:

没有游标的声明,打开,关闭的语句

BEGIN
FOR cur IN(SELECT name FROM deptmenet) LOOP
DBMS_OUTPUT.PUT_LINE(cur.name);
END LOOP;
END;
/

注意:

当数据库中数据量较大时,不适合使用游标,因为一条一条的取,效率比较多的低。

最新文章

  1. iOS开发常见错误解决方法
  2. [ZigBee] 4、ZigBee基础实验——中断
  3. JS日历制作获取时间
  4. xcode注释
  5. Android布局属性全面剖析
  6. VC#2010 视图设计器无法打开 问题的正解
  7. 前端发展态势 && 前端工作流程个人浅析
  8. Java文件流应用:复制文件
  9. 安装puppet
  10. SQL Server 深入解析索引存储(聚集索引)
  11. jquery中使元素显示和隐藏方法之间的区别
  12. 转://Linux下tmpfs介绍及使用
  13. liunx进程管理之进程介绍
  14. spring+quartz报错:Table 'XXXX.QRTZ_TRIGGERS' doesn't exist
  15. 表的复制——sql语句
  16. LeetCode--172--阶乘后的0
  17. “Hello World!”团队第五周第五次会议
  18. 三:Springboot整合Redis
  19. WCF把书读薄(3)——数据契约、消息契约与错误契约
  20. Centos使用光盘作为本地yum源

热门文章

  1. noip知识点总结之--贪心
  2. mysql的部分命令图解
  3. hduacm 5104
  4. 转: HTML的电子邮件链接标签mailto用法详解
  5. QQ2013登录报文简单分析(不可用于非法用途)
  6. UVa 11426 - GCD - Extreme (II)
  7. CodeForces 86D(Yandex.Algorithm 2011 Round 2)
  8. USB鼠标按键驱动
  9. KStar ----BPM应用框架,K2 的新星
  10. Cannot change network to bridged: There are no un-bridged host network adapters解决方法