Oracle显示游标的使用及游标for循环

下面给大家介绍在什么情况下用隐式游标,什么情况下用显示游标:

1.查询返回单行记录时→隐式游标;

2.查询返回多行记录并逐行进行处理时→显式游标

--显示游标属性

declare
CURSOR cur_emp IS SELECT * FROM emp;
row_emp cur_emp%ROWTYPE;
BEGIN
OPEN cur_emp;
FETCH cur_emp INTO row_emp;
WHILE cur_emp%FOUND
LOOP
dbms_output.put_line(row_emp.empno||'----'||row_emp.ename);
FETCH cur_emp INTO row_emp;
END LOOP;
close cur_emp;
END;

--使用显式游标修改数据(给所有的部门经理加薪1000)

DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
emp_row emp_cur%ROWTYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_row;
IF emp_cur%NOTFOUND THEN
EXIT;
ELSE
UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
END IF;
END LOOP;
COMMIT;
CLOSE emp_cur;
END;

·注意:

1、如果游标打开之前或关闭之后,使用游标属性,Oracle会抛出一个INVALID_CURSOR错误(ORA-01001);

2、如果在第一次fetch后结果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;

3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,实际上他返回的是提取到相关集合的行数。

--游标for循环(给所有的部门经理减薪1000)

DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
BEGIN
FOR emp_row IN emp_cur
LOOP
UPDATE emp SET sal=sal-1000 WHERE CURRENT OF emp_cur;
END LOOP;
COMMIT;
END;

--我们可以看到游标FOR循环确实很好的简化了游标的开发,我们不在需要open、fetch和close语句,不在需要用%FOUND属性检测是否到最后一条记录,这一切Oracle隐式的帮我们完成了。

--给经理加薪5000,其他加薪1000

DECLARE
CURSOR emp_cur IS
SELECT * FROM emp FOR UPDATE;
BEGIN
 FOR emp_row IN emp_cur
 LOOP
 IF emp_row.job='MANAGER' THEN
 UPDATE emp SET sal=sal+5000 WHERE CURRENT OF emp_cur;
 ELSE
 UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
 END IF;
 END LOOP;
 END;

下面给大家介绍oracle游标cursor简单使用

总共介绍两种游标一种高效使用游标cursor 、sys_refcursor 、 bulk collect

1、cursor游标使用

/*简单cursor游标
 *students表里面有name字段,你可以换做其他表测试
 */
--定义
declare
 --定义游标并且赋值(is 不能和cursor分开使用)
 cursor stus_cur is select * from students;
 --定义rowtype
 cur_stu students%rowtype;
 /*开始执行*/
 begin
 --开启游标
 open stus_cur;
  --loop循环
  loop
  --循环条件
  exit when stus_cur%notfound;
  --游标值赋值到rowtype
  fetch stus_cur into cur_stu;
  --输出
  dbms_output.put_line(cur_stu.name);
  --结束循环
  end loop;
 --关闭游标
 close stus_cur;
 /*结束执行*/
 end; 

执行结果

SQL> declare
  --定义游标并且赋值(is 不能和cursor分开使用)
  cursor stus_cur is select * from students;
  --定义rowtype
  cur_stu students%rowtype;
  /*开始执行*/
  begin
  --开启游标
  open stus_cur;
   --loop循环
   loop
   --循环条件
   exit when stus_cur%notfound;
   --游标值赋值到rowtype
   fetch stus_cur into cur_stu;
   --输出
   dbms_output.put_line(cur_stu.name);
   --结束循环
   end loop;
  --关闭游标
  close stus_cur;
  /*结束执行*/
 end;
 / 

杨过
郭靖
付政委
刘自飞
江风
任我行
任盈盈
令狐冲
韦一笑
张无忌
朵儿
谢逊
小龙女
欧阳锋
欧阳锋 

2、sys_refcursor游标使用

/*
 *游标名:sys_refcursor
 *特别注意赋值方式:for
 *与上重复内容不在叙述
 */
declare
 stu_cur sys_refcursor;
 stuone students%rowtype; 

 begin
  --这句赋值方式for
  open stu_cur for select * from students;
  --fetch赋值给rowtype
  fetch stu_cur into stuone; 

  loop
  dbms_output.put_line(stuone.name||' '||stuone.hobby);
  fetch stu_cur into stuone;
  exit when stu_cur%notfound;
  end loop;
 end; 

执行结果

SQL> /*
  *游标名:sys_refcursor
  *特别注意赋值方式:for
  *与上重复内容不在叙述
  */
 declare
  stu_cur sys_refcursor;
  stuone students%rowtype;
  begin
  --这句赋值方式for
  open stu_cur for select * from students;
  --fetch赋值给rowtype
  fetch stu_cur into stuone;
  loop
   dbms_output.put_line(stuone.name||' '||stuone.hobby);
   fetch stu_cur into stuone;
   exit when stu_cur%notfound;
  end loop;
  end;
 /
杨过 保护小龙女
郭靖 修炼降龙十八掌
付政委 看小人书
刘自飞 编程写代码
江风 编程写代码
任我行 修炼神功
任盈盈 游山玩水
令狐冲 行侠仗义
韦一笑 吸拾人雪
张无忌 修行
朵儿 洗浴
谢逊 毕生研究屠龙刀
小龙女 修炼玉女心经
欧阳锋 看小人书 

补充一种循环条件

declare
 stu_cur sys_refcursor;
 stuone students%rowtype;
 begin
  open stu_cur for select * from students;
  fetch stu_cur into stuone;
  --特别注意循环条件的改变
  --这个条件是发现了在循环
  --与上一个notfound不同的
  while stu_cur%found loop
  dbms_output.put_line(stuone.name||' '||stuone.hobby);
  fetch stu_cur into stuone;
  end loop;
 end; 

 --普通的fetch into

/*普通方式*/
declare
cursor myemp_cur is select * from myemp;
v_myemp myemp%rowtype;
begin
 open myemp_cur;
 fetch myemp_cur into v_myemp;
 while myemp_cur%found loop
 dbms_output.put_line(v_myemp.ename);
 fetch myemp_cur into v_myemp;
 end loop;
end; 

 --高效的bulk collect

/*高效bulk collect for*/
declare
cursor myemp_cur
is select * from myemp;
type myemp_tab is table of myemp%rowtype;
myemp_rd myemp_tab;
begin
 open myemp_cur;
 loop
 fetch myemp_cur bulk collect into myemp_rd limit 20;
 for i in 1..myemp_rd.count loop
  dbms_output.put_line('姓名:'||myemp_rd(i).ename);
 end loop;
 exit when myemp_cur%notfound;
 end loop;
end; 
(0)

相关推荐

  • Oracle存储过程游标用法分析

    本文实例讲述了Oracle存储过程游标用法.分享给大家供大家参考,具体如下: 使用游标的5个步骤 1.声明一些变量用于保存select语句返回的指 2.声明游标,并指定select 语句 3.打开游标 4.从游标中获取记录 5.关闭游标 从游标中获取每一条记录可使用fetch语句.fetch语句将列的指读取到指定的变量中: 语法: fetch cursor_name into variable[, variable ...]; 例子: create or replace procedure se

  • 详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的emp表) -- sql%rowcount:影响记录条数 sql%found:是否有满足条件的记录 set serveroutput on; declare v_ename a_emp.ename%type; begin select ename into v_ename from a_emp whe

  • 在Oracle PL/SQL中游标声明中表名动态变化的方法

    /*     小弟刚刚接触ORACLE存储过程,有一个问题向各位同行求教,小弟写了一个存储过程,其目的是接收一个参数作为表名,然后查询该表中的全部记录的某一个字段的内容导入到另一个表中.     (     tabname in varchar     )     is     v_servicesname tabname.服务类型%type; --这个变量就是用来存放所要取得的字段内容,但不知该如何定义     cursor curSort1 is select 服务类型 from tabna

  • Oracle存储过程返回游标实例详解

    有俩种方法: 一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为 in out 或out (1)声明个人系统游标.(推荐) 复制代码 代码如下: create or replace p_temp_procedure ( cur_arg out sys_refcursor; --方法1 ) begin open cur_arg for select * from tablename; end 调用 复制代码 代码如下: declare cur_calling sys_refcu

  • oracle 声明游标(不具备字段)规则应用

    在开发过程中可能会声明一个含有某张表不具备字段的游标,来解决特殊问题,本文将详细介绍这类问题,需要了解更多的朋友可以参考下 其中,data.*是一张表,然后把其他表中的字段也加到sal_data的游标中 Sql代码 复制代码 代码如下: cursor sal_data(cp_center_temp_id varchar2) is select data.*, post.id emp_post_id, doc.Salary_Tax_Bd sa_tax_bd, batch.bill_year_mon

  • Oracle 游标使用总结

    Oracle游标分为显示游标和隐式游标. 显示游标(Explicit Cursor):在PL/SQL程序中定义的.用于查询的游标称作显示游标. 隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的.而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标. 一.显示游标 1.使用步骤 (1)定义 (2)打开 (3)使用 (4)关闭 2.使用演示 首先创建测试用表STUDENT,脚本如下: 复制代码 代码如下: CREATE TABLE "S

  • oracle 在一个存储过程中调用另一个返回游标的存储过程

    第一种情况是返回的游标是某个具体的表或视图的数据,如: SQL-Code: 复制代码 代码如下: CREATE OR REPLACE PROCEDURE P_TESTA ( PRESULT OUT SYS_REFCURSOR ) AS BEGIN OPEN PRESULT FOR SELECT * FROM USERS; END P_TESTA; 其中USERS就是数据库中一个表.在调用的时候只要声明一个该表的ROWTYPE类型就可以了: SQL-Code: 复制代码 代码如下: CREATE

  • Oracle显示游标的使用及游标for循环

    下面给大家介绍在什么情况下用隐式游标,什么情况下用显示游标: 1.查询返回单行记录时→隐式游标: 2.查询返回多行记录并逐行进行处理时→显式游标 --显示游标属性 declare CURSOR cur_emp IS SELECT * FROM emp; row_emp cur_emp%ROWTYPE; BEGIN OPEN cur_emp; FETCH cur_emp INTO row_emp; WHILE cur_emp%FOUND LOOP dbms_output.put_line(row_

  • mysql动态游标学习(mysql存储过程游标)

    复制代码 代码如下: -- 建立测试表和数据create table webuser (username varchar(10));insert into webuser values ('a1'),('a2'),('a3'),('b1'),('b2'),('b3');commit; -- 建立存储过程drop procedure if exists dynamic_cursor;delimiter //CREATE PROCEDURE dynamic_cursor (IN p_name var

  • Oracle中游标Cursor基本用法详解

    查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中.SELECT INTO语法如下: SELECT [DISTICT|ALL]{*|column[,column,...]} INTO (variable[,variable,...] |record) FROM {table|(sub-query)}[alias] WHERE............ PL/SQL

  • Oracle游标的使用实例详解

    什么是游标? ①从表中检索出结果集,从中每次指向一条记录进行交互的机制. ②关系数据库中的操作是在完整的行集合上执行的. 由 SELECT 语句返回的行集合包括满足该语句的 WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集. 应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的. 这些应用程序需要一种机制来一次处理一行或连续的几行.而游标是对提供这一机制的结果集的扩展. 游标是通过游标库来实现的.游标库是常常作为数据库系统或数据访问 API 的一部

  • Oracle中游标Cursor的用法详解

    目录 一.使用游标 1.定义游标 2.打开游标 3.提取数据 4.关闭游标 5.游标属性 6.参数游标 二.for循环遍历,实现遍历游标最高效方式. 三.使用游标更新或删除数据 四.通过bulk collect减少loop处理的开销 五.使用游标变量 1.游标变量使用步骤 1.1定义ref cursor类型和游标变量 1.2打开游标 1.3提取游标数据 1.4关闭游标变量 2.游标变量使用示例 一.使用游标 对于DML语句和单行select into ,oracle自动分配隐形游标.处理sele

  • 详解Oracle游标的简易用法

    下面看下Oracle游标的简易用法,具体代码如下所示: create or replace procedure NW_DelYW(iOPERATION_ID number, sUserID varchar2) is sCurDJBH yw_operation_link.djbh%type; cursor table_yw(ywid yw_operation.id%type) is select * from yw_operation_link t1 where t1.operation_id =

  • MongoDB 游标详解及实例代码

     MongoDB 游标详解 MongoDB中的游标与关系型数据库中的游标在功能上大同小异.游标相当于C语言的指针,可以定位到某条记录,在MongoDB中,则是文档.因此在mongoDB中游标也有定义,声明, 打开,读取,关闭这么个过程.客户端通过游标,能够实现对最终结果进行有效的控制,诸如限制结果数量,跳过部分结果或根据任意键按任意顺序的组合对结果进行各种排序等.下文是针对MongoDB游标的具体介绍. 一.mongoDB游标介绍 db.collection.find()方法返回一个游标,对于文

随机推荐