当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
ORACLEPLSQL游标学习
发布时间:2010/6/25 15:36:34 来源:城市学习网 编辑:ziteng
  游标
  游标是指向上下文区域的句柄或指针
  上下文区域--用于SQL处理的内存区
  上下文区域的内容
  语句处理的行数
  指向语句的语法分析表示的指针
  游标的类型
  1、静态游标
  隐式游标
  显示游标
  2、REF游标(动态游标)
  一、隐式游标
  有ORACLE在内部声明
  用于处理
  DML语句
  返回单行的查询
  游标属性:
  1、%NOTFOUND 对数据操作成功返回FALSE,否则返回TRUE
  2、%FOUND  对数据操作成功返回TRUE,否则返回FALSE
  3、%ROWCOUNT  游标影响的行数
  4、%ISOPEN   游标是否打开
  begin
  insert into cities values('aaa','bbb');
  DBMS_OUTPUT.PUT_LINE('游标所影响的行数:'||SQL%ROWCOUNT);
  if SQL%NOTFOUND then
  DBMS_OUTPUT.PUT_LINE('NOTFOUND为真');
  else
  DBMS_OUTPUT.PUT_LINE('NOTFOUND为假');
  end if;
  if SQL%FOUND then
  DBMS_OUTPUT.PUT_LINE('FOUND为真');
  else
  DBMS_OUTPUT.PUT_LINE('FOUND为假');
  end if;
  if SQL%ISOPEN then
  DBMS_OUTPUT.PUT_LINE('ISOPEN为真');
  else
  DBMS_OUTPUT.PUT_LINE('ISOPEN为假');
  end if;
  end;
  输出结果为:
  游标所影响的行数:1
  NOTFOUND为假
  FOUND为真
  ISOPEN为假
  declare
  icount int :=0;
  begin
  insert into cities values ('aaa','bbb');
  if SQL%NOTFOUND then
  DBMS_OUTPUT.PUT_LINE('没有插入成功');
  else
  DBMS_OUTPUT.PUT_LINE('插入成功');
  end if;
  commit;
  end;
  输出结果为:
  插入成功
  declare
  icount int :=0;
  begin
  update cities set country='aaaa';
  if SQL%NOTFOUND then
  DBMS_OUTPUT.PUT_LINE('没有更新成功');
  else
  DBMS_OUTPUT.PUT_LINE('更新成功');
  end if;
  commit;
  end;
  输出结果为:
  更新成功
  二、显式游标
  由用户显式声明
  游标将指向活动集中的当前行
  控制显示游标
  Open
  Fetch
  Close
  declare
  cursor empCur is select * from emp;
  emprow emp%ROWTYPE;
  begin
  open empCur;
  fetch empCur into emprow;
  DBMS_OUTPUT.put_line(emprow.empno||'  '||emprow.ename);
  close empCur;
  end;
  输出结果
  7369  SMITH
  loop循环
  declare
  cursor empCur is select * from emp;
  emprow emp%ROWTYPE;
  begin
  open empCur;
  loop
  fetch empCur into emprow;
  DBMS_OUTPUT.put_line(emprow.empno||'  '||emprow.ename);
  DBMS_OUTPUT.put_line('提取了'||empCur%ROWCOUNT||'行');
  --exit when empCur%NOTFOUND;
  if empCur%NOTFOUND then
  exit ;
  end if;
  end loop;
  close empCur;
  end; [NextPage]   while循环
  declare
  cursor empCur is select * from emp;
  emprow emp%ROWTYPE;
  begin
  open empCur;
  fetch empCur into emprow;
  while empCur%FOUND loop
  DBMS_OUTPUT.put_line(emprow.empno||'  '||emprow.ename);
  DBMS_OUTPUT.put_line('提取了'||empCur%ROWCOUNT||'行');
  fetch empCur into emprow;
  end loop;
  close empCur;
  end;
  输出结果
  7369  SMITH
  提取了1行
  7499  ALLEN
  提取了2行
  7521  WARD
  提取了3行
  7566  JONES
  提取了4行
  7654  MARTIN
  提取了5行
  7698  BLAKE
  提取了6行
  7782  CLARK
  提取了7行
  7788  SCOTT
  提取了8行
  7839  KING
  提取了9行
  7844  TURNER
  提取了10行
  7876  ADAMS
  提取了11行
  7900  JAMES
  提取了12行
  7902  FORD
  提取了13行
  7934  MILLER
  提取了14行
  7934  MILLER
  提取了14行
  for循环
  循环游标
  显式游标的替代方法
  它的工作原理是什么:
  隐式打开游标
  自动从活动集获取行
  在处理完所有行时关闭游标
  优点:
  简化代码的编写
  declare
  cursor empCur is select * from emp where sal>&intputsal;--绑定变量
  iCount int ;
  begin
  iCount := &Count;
  DBMS_output.put_line(iCount);
  for emprow in empCur loop
  DBMS_OUTPUT.put_line(emprow.empno||'  '||emprow.ename);
  DBMS_OUTPUT.put_line('提取了'||empCur%ROWCOUNT||'行');
  end loop;
  end;
  三、REF游标
  在运行时使用不同的语句与之关联
  REF游标使用游标变量
  游标变量
  一种引用类型
  可以在运行时指向不同的存储位置
  Close 语句关闭游标并释放用于查询的资源
  游标变量的类型
  具有约束的游标变量
  具有返回类型的游标变量、
  也称为“强游标”
  无约束的游标变量
  没有返回类型的游标变量
  也称为“弱游标”
  declare
  type RefEmpcur is ref cursor return emp%ROWTYPE;
  Empcur RefEmpcur;
  Emprow emp%ROWTYPE;
  flag int := 0;
  begin
  flag := &flag;
  if flag=0 then
  OPEN Empcur for select * from emp where sal>500 and sal<1000;
  elsif flag=1 then
  OPEN Empcur for select * from emp where sal>=1000;
  else
  OPEN Empcur for select * from emp;
  end if;
  loop
  fetch Empcur into Emprow;
  DBMS_OUTPUT.PUT_LINE(Emprow.empno);
  exit when Empcur%NOTFOUND;
  end loop;
  close Empcur;
  end;
  游标变量的限制
  不能在程序包中声明游标变量
  远程子程序不能接受游标变量的值
  不能使用比较操作符对游标变量进行相等或不相等测试
  不能将空值赋予游标变量
  表不能存储游标变量的值
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved