4、Select  ....  For Update。

  在Select语句后面加一个For Update作用是加一个更新行级锁,这样的读取操作就和更新操作一样了,都会给特定的行加锁了,这样你操作的时候,别人是没法更新这些数据的,不过也可以读取,For Update 后面可以加Of +对应的字段,在Of 出现的字段对应的表的就会加上行锁,也可以在For Update后加 NoWAIT关键字,意思就是值,当别人已经占有该行数据的时候,不需要等待直接返回,也可以在For UPdate 后加 Wait +最大秒数,值得是如果别人占用了,最多等待多久返回。

如:Select w.task,w.expected from winterize w,husband h For Update Of hc.max_procrastination -----winterize表不会加锁,husband加锁

  Select task,expected rom winterize For Update NOWAIT;---如果占用,不等待,直接返回

  Select task,expected rom winterize For Update Wait 10;----如果占用,等待10秒后,直接返回

1)、用COMMIT释放锁资源:

   代码中显式的使用Commit或RollBack会把释放所有锁资源。

2)、Where Current Of语句:

  Where Current Of cursor_name,指的是cursor_name游标取出的最后数据,也就是取出来的当前值,比如:

  Declare

  Cursor test_cur

  Is Select * from test_table For Update;---For Update 在这里是必须的,如果使用where current of语句。

  test_rec test_cur%ROWTYPE;

  Begin

  Open test_cur;

  Fetch test_cur into test_rec;

  update test_table set id ='1' where current of test_cur;---这时更新游标test_cur取出来的第一条数据。

  Fetch test_cur into test_rec;

  update test_table set id ='2' where current of test_cur;---这时更新游标test_cur取出来的第二条数据。

  Close test_cur;

  Commit;

  End;

5、游标变量和Ref Cursor:

   游标变量是一个指向或者引用底层游标的变量,是指向折耳根工作区的引用,游标变量最大的好处就是可以在不同的PL/SQL程序间传递查询的结果集的机制,甚至可以在客户端PL/SQL程序和服务端的PL/SQL程序间传递。这些功能都是显式游标和隐式游标所不不具有的。

1)、为什么用游标变量:

  • 可以作为参数传递给一个过程或者函数,(显式游标和隐式游标没有此功能)
  • 可以使用PL/SQL的静态游标(显式游标和隐式游标)的完全功能集,可以对游标变量进行打开、关闭、获取数据操作,也可以使用游标属性:%ISOPEN等。
  • 游标变量可以赋值。

2)、和静态游标的相同点:

   Declare

    Type var_cur_type Is REF Cursor;

    var_cur var_cur_type;

    begin

      Open var_cur For ...

      ...

      Close;

    End;

  都可以Open、Close方法,取数据都是用Fetch方式。

3)、声明Ref Cursor类型:

  声明游标变量分为两步:

  1、创建一个引用游标类型;

  2、基于上面这个类型声明真正的游标变量。

  语法:Type cursor_type_name Is Ref Cursor [Return return_type]

  cursor_type_name 游标类型的名字  return_type返回的数据格式说明

  如:Type company_curtype Is Ref Cursor Return company%ROWTYPE;----带Return的成为强类型

    Type generic_curtype IS REF Cursor;----弱类型

  Oracle 9i以后,Oracle提供了一个系统弱类型的Ref Cursor,就是:SYS_REFCURSOR。

4)、声明游标变量:

  语法:cursor_name cursor_type_name;cursor_name  游标变量的名字,cursor_type_name 之前Type语句定义的游标类型 的名字。

 5)、打开游标变量:

  语法:Open cursor_name For select_statement,后面的select_statement是一个SQL的select语句,对于强类型的游标变量,select后的列要和Ref Cursor后Return的结构相匹配的。如果Open一个已经打开的游标变量,并不会报错(不像显式游标那样会报异常),只不过新的游标变量的值会是新的Select语句的值,但是通常我们不这样做,在重新给游标变量Open以前,习惯性的要关闭掉这个游标变量,在赋值。

6)、从一个游标变量获取数据:

  语法:Fetch cursor_variable_name Into record_name;注意强类型的游标变量,会检查Into后面的记录类型和Return返回的类型是否一致。

7)、游标变量的使用规则:

  • 编译的时候,如果是强类型的Ref Cursor,会判断Ref Cursor 后Return类型,和Open 。。。For 后的类型,已经Fetch Into后记录类型这三个类型是否匹配,如果是弱类型,只有在执行的时候在判断是否有错误,只需要Fetch into后的记录类型和Open For后的类型匹配。
  • 游标变量的别名:如果有两个游标变量,类型都相同,一个赋值给两一个,那么这两个游标变量就是代表着相同的游标对象,一个就是另一个的别名,一个数据变化了,另一个也会随着变化。

8)、游标变量作为参数传递:

   参数类型分为三种:

  • In:参数是只读的。
  • Out:参数是只写的。
  • In OUT:参数是可以读可写的。

  对于一个游标变量,只有通过赋值操作或者Open For语句,才能改变其值,Fetch和Close两个操作影响游标对象的状态,不会影响游标变量的值。

9)、游标变量的约束:

  • 不能在包中声明游标变量,因为它们并没有持久状态,但是在包中可以声明Type  。。。Ref Cursor类型。
  • 游标变量不能夸服务器。
  • 不能用运算符测试游标变量是否相等或为空。
  • 不能给一个游标变量赋值null。
  • Create Table 的列不能有Ref Cursor类型的列。
  • 不能用Ref Cursor用在集合元素中(嵌套表、关联数组、Varray)。

6、游标表达式。

   语法:Crusor(Subquery)

1)、使用游标表达式:

  下面两中情况使用游标表达式是非常有用的:

  • 要把子查询作为外层查询的一列;
  • 要把一个查询转换成一个结果集,这样就可以把结果集在一个流或转换函数中传递了。

  select l.city,Cursor(select d.departmentName from dempartment) as dName from city

2)、游标表达式限制:

  • 不能把游标表达式用于隐式游标。
  • 游标表达式只能出现在最外层的Select列表中。
  • 声明视图的时候不能用游标表达式。
  • 在动态SQL中,不能对游标表达式执行Bind和Execute操作。

 

posted on 2013-08-01 11:10  Kelly_HanShuai  阅读(173)  评论(0)    收藏  举报