游标可以处理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;
/

注意:

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

Oracle PL/SQL高级应用 游标的更多相关文章

  1. oracle PL/SQL高级特性

    触发器:存放在数据库中,并被隐含执行的存储过程. 由触发事件,触发条件,触发操作组成. DML触发器:指定触发器时机(before or after),触发事件(insert  , delete, u ...

  2. Oracle PL/SQL 高级编程

    1. 复合数据类型--记录类型 Ø        语法格式 type  类型名 is   record ( 字段1  字段1类型 [not null]:=表达式1; 字段2  字段2类型 [not n ...

  3. Oracle PL/SQL高级应用 存储过程

    有名字的Plsql块,成为Oracle的对象,在以后用到时可以直接调用. CREATE OR REPLACE PROCEDURE myproc(id IN varchar2) IS -IN 为输入参数 ...

  4. Oracle.PL/SQL高级

    一.匿名块 .使用returning ... INTO 保存增删改表数据时的一些列的值 ()增加数据时保存数据 DECLARE v_ename emp.ename%TYPE; v_sal emp.sa ...

  5. Oracle PL/SQL高级应用 视图 同义词 序列

    视图: 视图叫虚表,即是在哪个表上建立的视图,将那个表的数据用一条查询sql语句查出的数据展现在该视图中,对这个视图操作就是只能对该视图中的数据进行操作,该操作也会保存在建立的表中.可以理解为表上表, ...

  6. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  7. oracle学习笔记(十七) PL/SQL高级应用

    PL/SQL高级应用 动态SQL 在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert ...

  8. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  9. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

随机推荐

  1. jdk、jre、jvm的关系

    JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C:\Program Files\Java\jdk1.5.x\目录下的JRE.而C:\Program Files\Java\ ...

  2. ubuntu14.10服务器版安装xampp,配置域名端口访问

    1.从xampp下载下了xampp-linux-1.7.3a.tar这个包,然后ftp到我的linux虚拟机中, 2.复制到opt下,(可以直接解压的)到opt下面,tar xvfz xampp-li ...

  3. mysql的binlog

    mysql> show global variables like '%bin%'; +---------------------------------+------------------- ...

  4. 二模 (9) day2

    第一题: 题目大意:求满足条件P的N位二进制数的个数.P:该二进制数有至少3个0或者3个1挨在一起.. N<=20000 解题过程: 1.一开始直接写了个dfs把表打了出来,不过没发现什么规律, ...

  5. 快餐问题(dp好题)

    Peter最近在R市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由A个 汉堡,B个薯条和C个饮料组成.价格便宜.为了提高产量,Peter从著名的麦当劳公司引进了N条 生产线.所有的生 ...

  6. 矩阵(matrix)

    我们定义一个矩阵的权值为这个矩阵四个角上的数值的最小值.现在小M有一个矩阵,他想在这个矩阵中寻找到一个权值最大的子矩阵,请你告诉他这个最大权值.(距形规模最大为2000*2000) 比赛 看到第二题那 ...

  7. Zabbix页面遇到历史记录的乱码需要修改数据库

    Zabbix页面遇到历史记录的乱码需要修改数据库: 解决办法: 1.将 zabbix 数据库中的表备份: 2.手动删除 zabbix 数据库: 3.重新创建 zabbix 库时手动指定字符集为 utf ...

  8. CodeIgniter 让控制器可以支持多级子目录的 Router 类库

    MY_Router.php 放到 system/application/libraries 目录下,就可以让 CI 的控制器支持多级子目录了.这样,你就可以在 system/application/c ...

  9. NOIP 2013 提高组 day2 积木大赛

      积木大赛 描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第

  10. TDBGridEh的 搜索面板 TDBGridSearchPanel

    TCustomDBGridEh.Create FSearchPanelControl := TDBGridSearchPanelControlEh.Create(Self); //这里,创建的构造函数 ...