IT猫扑网:您身边最放心的安全下载站! 最新更新|软件分类|软件专题|手机版|论坛转贴|软件发布

您当前所在位置:首页数据库Oracle → oracle游标

oracle游标

时间:2015/6/28来源:IT猫扑网作者:网管联盟我要评论(0)

  为了处理SQL语句,oracle将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针。

  两种游标:

  一、显示游标(需要明确定义!)

  显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。

  在PL/SQL中处理显示游标所必需的四个步骤:

  1)声明游标;CURSOR cursor_name IS select_statement

  2)为查询打开游标;OPEN cursor_name

  3)取得结果放入PL/SQL变量中;

  FetcH cursor_name INTO list_of_variables;

  FETCH cursor_name INTO PL/SQL_record;

  4)关闭游标。CLOSE cursor_name

  注意:在声明游标时,select_statement不能包含INTO子句。当使用显示游标时,INTO子句是FETCH语句的一部分。

  1、 显式游标

  select语句上 使用显式游标

  能明确访问结果集

  for循环游标

  参数游标

  解决多行记录的查询问题

  fetch游标

  二、隐式游标

  所有的隐式游标都被假设为只返回一条记录。

  使用隐式游标时,用户无需进行声明、打开及关闭。PL/SQL隐含地打开、处理,然后关掉游标。

  例如:

  …….

  SELECT studentNo,studentName

  INTO curStudentNo,curStudentName

  FROM StudentRecord

  WHERE name=’gg’;

  上述游标自动打开,并把相关值赋给对应变量,然后关闭。执行完后,PL/SQL变量curStudentNo,curStudentName中已经有了值。

  2、 隐式游标

  单条sql语句所产生的结果集合

  用关键字SQL表示隐式游标

  4个属性 %rowcount  影响的记录的行数  整数

  %found     影响到了记录 true

  %notfound  没有影响到记录 true

  %isopen    是否打开  布尔值 永远是false

  多条sql语句 隐式游标SQL永远指的是最后一条sql语句的结果

  主要使用在update 和 delete语句上

  实际操作和例子:

  (1)FOR循环游标 (常用的一种游标)

  --<1>定义游标

  --<2>定义游标变量

  --<3>使用for循环来使用这个游标

  --前向游标 只能往一个方向走

  --效率很高

  declare

  --类型定义

  cursor cc is select empno,ename,job,sal

  from emp where job = 'MANAGER';

  --定义一个游标变量

  ccrec cc%rowtype;

  begin

  --for循环

  for ccrec in cc loop

  dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);

  end loop;

  end;

  (2) fetch游标

  --使用的时候 必须要明确的打开和关闭

  declare

  --类型定义

  cursor cc is select empno,ename,job,sal

  from emp where job = 'MANAGER';

  --定义一个游标变量

  ccrec cc%rowtype;

  begin

  --打开游标

  open cc;

  --loop循环

  loop

  --提取一行数据到ccrec中

  fetch cc into ccrec;

  --判断是否提取到值,没取到值就退出

  --取到值cc%notfound 是false

  --取不到值cc%notfound 是true

  exit when cc%notfound;

  dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);

  end loop;

  --关闭游标

  close cc;

  end;

  游标的属性4种

  %notfound  fetch是否提到数据 没有true 提到false

  %found      fetch是否提到数据 有true 没提到false

  %rowcount  已经取出的记录的条数

  %isopen    布尔值 游标是否打开

  (3)参数游标

  按部门编号的顺序输出部门经理的名字

  declare

  --部门

  cursor c1 is select deptno from dept;

  --参数游标c2,定义参数的时候

  --只能指定类型,不能指定长度

  --参数只能出现在select语句=号的右侧

  cursor c2(no number,pjob varchar2) is select emp.* from emp

  where deptno = no and job=pjob;

  c1rec c1%rowtype;

  c2rec c2%rowtype;

  --定义变量的时候要指定长度

  v_job varchar2(20);

  begin

  --部门

  for c1rec in c1 loop

  --参数在游标中使用

  for c2rec in c2(c1rec.deptno,'MANAGER') loop

  dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);

  end loop;

  end loop;

  end;

  (4)引用游标/动态游标

  -- select语句是动态的

  declare

  --定义一个类型(ref cursor)弱类型

  type cur is ref cursor;

  --强类型(返回的结果集有要求)

  type cur1 is ref cursor return emp%rowtype;

  --定义一个ref cursor类型的变量

  cura cur;

  c1rec emp%rowtype;

  c2rec dept%rowtype;

  begin

  DBMS_output.put_line('输出员工')   ;

  open cura for select * from emp;

  loop

  fetch cura into c1rec;

  exit when cura%notfound;

  DBMS_output.put_line(c1rec.ename)   ;

  end loop ;

  DBMS_output.put_line('输出部门')   ;

  open cura for select * from dept;

  loop

  fetch cura into c2rec;

  exit when cura%notfound;

  DBMS_output.put_line(c2rec.dname)   ;

  end loop;

  close cura;

  end;

关键词标签:oracle游标

相关阅读

文章评论
发表评论

热门文章 Oracle中使用alter table来增加,删除,修改列Oracle中使用alter table来增加,删除,修改列oracle中使用SQL语句修改字段类型-oracle修oracle中使用SQL语句修改字段类型-oracle修使用低权限Oracle数据库账户得到管理员权限使用低权限Oracle数据库账户得到管理员权限Oracle对user的访问控制Oracle对user的访问控制

相关下载

人气排行 ORACLE SQL 判断字符串是否为数字的语句Oracle中使用alter table来增加,删除,修改列的语法ORACLE和SQL语法区别归纳(1)oracle grant 授权语句如何加速Oracle大批量数据处理Oracle删除表的几种方法ORACLE修改IP地址后如何能够使用Oracle 10g创建表空间和用户并指定权限