知识大全 Oracle数据库游标的类型

Posted 语句

篇首语:莫问天涯路几重,轻衫侧帽且从容。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle数据库游标的类型相关的知识,希望对你有一定的参考价值。

Oracle数据库游标的类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  游标是SQL的一个内存工作区 由系统或用户以变量的形式定义 游标的作用就是用于临时存储从数据库中提取的数据块

  Oracle数据库的Cursor类型包含三种 静态游标 分为显式(explicit)游标和隐式(implicit)游标 REF游标 是一种引用类型 类似于指针

   测试数据

  create table student(sno number primary key sname varchar ( ))

  declare i number:= ;

  beginwhile i<=

  loop

  insert into student(sno sname) values (i name ||to_char(i))

  i:=i+ ;

  end loop;

  end;

  隐式游标属性

  SQL%ROWCOUNT 整型代表DML语句成功执行的数据行数

  SQL%FOUND 布尔型值为TRUE代表插入 删除 更新或单行查询操作成功

  SQL%NOTFOUND 布尔型与SQL%FOUND属性返回值相反

  SQL%ISOPEN 布尔型DML执行过程中为真 结束后为假

  declarebegin  update student set sname = name ||to_char(sno* ) where sname= name ;

  if sql%found then

  dbms_output put_line( name is updated )

  else

  dbms_output put_line( 没有记录 )

  end if;

  end;

  declare

  begin

  for names in (select * from student) loop

  dbms_output put_line(names sname)

  end loop;

  exception when others then

  dbms_output put_line(sqlerrm)

  end;

  显式游标属性

  %ROWCOUNT 获得FETCH语句返回的数据行数

  %FOUND 最近的FETCH语句返回一行数据则为真 否则为假

  %NOTFOUND 布尔型 与%FOUND属性返回值相反

  %ISOPEN 布尔型 游标已经打开时值为真 否则为假

  对于显式游标的运用分为四个步骤

  a 定义游标 Cursor [Cursor Name] IS;

  b 打开游标 Open [Cursor Name];

  c 操作数据 Fetch [Cursor name];

  d 关闭游标 Close [Cursor Name];

  典型显式游标

  declare cursor cur_rs is select * from student; sinfo student%rowtype;

  begin  open cur_rs;

  loop

  fetch cur_rs into sinfo;

  exit when cur_rs%%notfound;

  dbms_output put_line(sinfo sname)

  end loop;

  exception when others then

  dbms_output put_line(sqlerrm)

  end;

  带参数open的显式cursor:

  declare cursor cur_rs(in_name varchar ) is select *

  from student where sname=in_name;

  begin  for sinfo in cur_rs( sname ) loop

  dbms_output put_line(sinfo sname)

  end loop;

  exception when others then

  dbms_output put_line(sqlerrm)

  end;

  使用current of语句执行update或delete操作

  declare

  cursor cur_rs is select * from student for update;

  begin  for sinfo in cur_rs loop

  update student set sname=sname|| xx where current of cur_rs;

  end loop;

  mit;

  exception when others then

  dbms_output put_line(sqlerrm)

  end;

  REF游标 用于处理运行时才能确定的动态sql查询结果 利用REF CURSOR 可以在程序间传递结果集(一个程序里打开游标变量 在另外的程序里处理数据)

  也可以利用REF CURSOR实现BULK SQL 提高SQL性能

  REF CURSOR分两种 Strong REF CURSOR 和 Weak REF CURSOR

  Strong REF CURSOR: 指定retrun type CURSOR变量的类型必须和return type一致

  Weak REF CURSOR: 不指定return type 能和任何类型的CURSOR变量匹配

  运行时根据动态sql查询结果遍历

  create or replace package pkg_test as

  type student_refcursor_type is ref cursor return student%rowtype;

  procedure student_rs_loop(cur_rs IN student_refcursor_type)

  end pkg_test ;

  create or replace package body pkg_test as

  procedure student_rs_loop(cur_rs IN student_refcursor_type) is

  std student%rowtype;

  begin  loop

  fetch cur_rs into std;

  exit when cur_rs%NOTFOUND;

  dbms_output put_line(std sname)

  end loop;

  end student_rs_loop;

  end pkg_test ;

  declare stdRefCur pkg_test student_refcursor_type;

  begin  for i in loop

  dbms_output put_line( Student NO= || i)

  open stdRefCur for select * from student where sno=i;

  pkg_test student_rs_loop(stdRefCur)

  end loop;

  exception when others then dbms_output put_line(sqlerrm)

  close stdRefCur;

  end;

  使用FORALL和BULK COLLECT子句 利用BULK SQL可以减少PLSQL Engine和SQL Engine之间的通信开销 提高性能

   加速INSERT UPDATE DELETE语句的执行 也就是用FORALL语句来替代循环语句

   加速SELECT 用BULK COLLECT INTO 来替代INTO

  create table

  student_tmp as select sno

  sname from student where = ;

   删除主键约束 alter table student drop constraint SYS_C ;

   执行两遍插入 insert into student select * from student where sno= ;

  declare cursor cur_std(stdid student sno%type) is select sno

  sname from student where sno=stdid;

  type student_table_type is table of cur_std%rowtype index by pls_integer;

  student_table student_table_type;

  begin

  open cur_std( )

  fetch cur_std bulk collect into student_table;

  close cur_std;

  for i in unt loop

  dbms_output put_line(student_table(i) sno ||

  || student_table(i) sname)

  end loop;

  forall i in student_table firststudent_table last

  insert into student_tmp values(student_table(i) sno student_table(i) sname)

  mit;

  end;

cha138/Article/program/Oracle/201311/17358

相关参考

知识大全 快速掌握Oracle数据库游标的使用方法

快速掌握Oracle数据库游标的使用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  显式游标

知识大全 oracle数据库中关于游标的常见用法

cha138/Article/program/Oracle/201311/19107

知识大全 Oracle游标提取相关的数据的语法介绍

Oracle游标提取相关的数据的语法介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文主要

知识大全 oracle中的游标使用静态游标

  游标是构建在PL/SQL中用来查询数据获取记录集的指针它让开发者一次访问结果集中一行记录  在oracle中提供了两种游标静态游标ref游标  静态游标静态游标是在编译的时候就被确定然后把结果集复

知识大全 oracle游标

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

知识大全 深入讲解游标类型为什么会产生数据检索[1]

  游标类型产生的数据检索问题  现象:  在将数据库兼容的级别从改到以后下文中的游标循环不出数据单独SELECT却会有结果:  DECLAREMyCursorCURSORLOCALREAD_ONLY

知识大全 oracle中ora-0100错误打开游标过大的解决

  最近做项目碰到ORA错误参考了一些解决办法把自己解决问题的一些心得写下来java访问oracle数据库在for循环代码中如果忽略关闭createstatment或preparedstatement

知识大全 深入讲解游标类型为什么会产生数据检索[2]

  在定义此类游标的情况下S锁是必须下的NOLOCK提示并不会起作用此现象通过查询游标OPEN时的sp_lock信息就可以观察得到它产生了IS和S锁  而NOLOCK提示是否起作用会影响的执行的结果(

知识大全 在PL/SQL中使用游标获取数据

Oracle数据库编程:在PL/SQL中使用游标获取数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Oracle 游标使用总结

Oracle游标使用总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Oracle游标分为显示游标