游标变量和隐藏游标

游标变量和隐藏游标

SQL%FOUND 指明insert ,update或delete是否影响到行
SQL%ISOPEN 指明游标是否打开,这个值在隐式游标中永远为false,因为隐式游标在DML语句执行后自动关闭
SQL%NOTFOUND  表示DML语句在修改行的是候是否失败了
SQL%ROWCOUNT 指明DML语句影响到的行数

游标变量就是一个PL/SQL变量,你可以在运行时针对不同的查询使用该变量同一游标变量能指行不同的工作区

游标变量的定义包括两个步骤:
1 定义CURSOR类型的指针
  在pl/SQL中,使用下面语法定义CURSOR类型的指针
  ref type
  如
  TYPE rc IS REF CURSOR
2 定义REF CURSOR 类型的变量
  v_rc rc
  完整的声明游标变量方法如下:
  type rc is ref cursor;
  v_rc rc;

这样定义的游标类型叫弱类ref curosr 类型 ,这是因为没指明游标的返回类型,因此它能指向任何一个具有任意多列的select 查询。
定义带有返回类型的强ref cursor 类型
type ref_type_name is ref cursor return return_type;

type rc is ref cursor return hrc_tab%rowtype;
v_rc rc;
游标变量的使用
 1) 分配内存
 2) 为查询打开游标变量
 3) 把结果取到pl/sql记录中
 4) 关闭游标变量


1 分配内存
   在pl/sql中声明游标变量后,pl/sql引擎会自动为期分配存储数据行的内存空间
2 打开游标
  open   游标变量名 fro select_query
3 把结果取到pl/sql记录或单独pl/sql变量中  fetch cursor_variable_name into var1,var2

 fetch   cursor_variable_name into table_name%rowtype;

4 关闭游标变量
  close  cursor_variable_name

一个例子
declare
 type rc is ref cursor ;
 v_rc rc;
 v_rc2 rc;
 hrc_rec hrc_tab%rowtype;
begin
  open v_rc for select * form hrc_tab;
  v_rc2:=vrc;
loop
  fetch v_rc into hrc_rec;
  exit when v_rc%nofound;
  dbms_output.put_line();
end loop; 
close v_rc; 
end;
注意:当关闭v_rc的同时也会关闭v_rc2,反之亦然。为一个游标变量简单的赋上一个已经打开的游标变量值,实际上是一个游标指向另一个工作区。不要把一个没打开的游标变量赋值给另一个游标变量,那样会出现invalid_cursor错误
游标变量也有4个属性curosr_variable_name%ISOPEN,curosr_variable_name%FOUND,curosr_variable_name%NOTFOUND,curosr_variable_name%ROWCOUNT
使用的办法和普通游标一样。

游标的高级功能

使用游标变量真正的好处是必须使用同一个游标变量打开多个查询,或根据运行时的条件需要动态的把不同的
查询赋给相同的游标变量时体现。

使用同一游标变理打开多个查询

 declare
 type rc is ref cursor ;
 v_rc rc;
 v_rc2 rc;
 hrc_rec hrc_tab%rowtype;
begin
  open v_rc for select * form hrc_tab;
  v_rc2:=vrc;
loop
  fetch v_rc into hrc_rec;
  exit when v_rc%nofound;
  dbms_output.put_line();
end loop; 
 open v_rc for select * from hrc_tab where class_id='55';
loop
  fetch v_rc into hrc_rec;
  exit when v_rc%nofound;
  dbms_output.put_line();
end loop; 
close v_rc; 
end;

两个地方值得注意:
 同一游标变量v_rc指向两个不同的查询
 第一个查询打开v_rc并取得值后,v_rc并没有立即关闭,它只是简单地为第二个查询重新打开一次,一个新
的结果值就确定下来


-===========================------
游标表达式
使用游标表达式的原因:使用游标表这式可以避免声明和使用多个游标这种复杂的使用方法,因此它能通过
SQL引擎产生更加优化的解决方案,之所以如此,是由于游标表达式相对于多个游标使用多个SQL语句来说,它只使用了一个SQL语句。还有oracle9i中解除了嵌入到pl/sql代码的的SQL中使用游标表达式的限制。,现在可以把游标表达式作为PL/SQL游标的一部分使用

 

 

 


 

你可能感兴趣的:(游标变量和隐藏游标)