zoukankan      html  css  js  c++  java
  • 『ORACLE』 PLSQL动态游标的使用(11g)

    #静态游标指的是程序执行的时候不需要再去解析sql语言,对于sql语句的解析在编译的时候就可以完成的。

    动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。

    从这个角度来说,静态游标的效率也比动态游标更高一些。

    #游标的相关概念:

      定义:

       游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里

      存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中

      的指针 来提取游标中的数据,然后来进行操作。

      实质:

       是用户在远程客户端上对服务器内存区域的操作,由数据库为用户提供这样的

      一个指针,使得用户能够去检索服务器内存区的数据。

    #游标具有的属性:

    1、%ISOPEN(确定游标是否已经打开 true or false)

    2、%FOUND(返回是否从结果集提取到了数据 true or false)

    3、%NOTFOUND(返回是否从结果集没有提取到数据 true or false)

    4、%ROWCOUNT(返回到当前为止已经提取到的实际行数)

    #游标分类

    一、静态游标

    1、隐式游标:

          对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor

          select update/insert/delete操作

    2、显示游标:

          由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor

          1)定义游标---cursor  [cursor name]  is

          2)打开游标---open    [cursor name]

          3)操作数据---fetch    [cursor name]

          4)关闭游标---close    [cursor name]

    二、REF游标

    1、REF 游标:动态关联结果集的临时对象。即在运行的时候动态决定执行查询。
    2、REF 游标作用:实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能。
    3、静态游标和REF 游标的区别:

    ①静态游标是静态定义,REF 游标是动态关联;
    ②使用REF 游标需REF 游标变量。
    ③REF 游标能做为参数进行传递,而静态游标是不可能的。

    4、REF 游标变量:是一种引用REF游标类型的变量,指向动态关联的结果集。
    5、怎么使用REF游标:
    ①声明REF 游标类型,确定REF 游标类型;
    ⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。
    语法:Type   REF游标名   IS   Ref Cursor Return  结果集返回记录类型;
    ⑵弱类型REF游标:不指定return type,能和任何类型的CURSOR变量匹配,用于获取任何结果集。
    语法:Type   REF游标名   IS   Ref Cursor;
    ②声明Ref 游标类型变量;
    语法:变量名  已声明Ref 游标类型;
    ③打开REF游标,关联结果集 ;
    语法:Open  Ref 游标类型变量 For 查询语句返回结果集;
    ④获取记录,操作记录;
    语法:Fatch  REF游标名 InTo 临时记录类型变量或属性类型变量列表;
    ⑤关闭游标,完全释放资源;
    语法:Close  REF游标名;

    例:

    SQL> declare
    2 type emp_cursor is ref cursor;
    3 my_cursor emp_cursor;
    4 v_ename emp.ename%type;
    5 v_sal emp.sal%type;
    6 v_deptno dept.deptno%type := &p_deptno;
    7 v_dname dept.dname%type;
    8 begin
    9 select dname into v_dname from dept where deptno = v_deptno;
    10 dbms_output.put_line('Department:' || v_dname);
    11 open my_cursor for
    12 select ename, sal from emp where deptno = v_deptno;
    13 loop
    14 fetch my_cursor
    15 into v_ename, v_sal;
    16 exit when my_cursor%notfound;
    17 dbms_output.put_line('--name:' || v_ename || 'salary:' || v_sal);
    18 end loop;
    19 close my_cursor;
    20 end;
    21 /
    Enter value for p_deptno: 30
    old 6: v_deptno dept.deptno%type := &p_deptno;
    new 6: v_deptno dept.deptno%type := 30;
    Department:SALES
    --name:ALLENsalary:1600
    --name:WARDsalary:1250
    --name:MARTINsalary:1250
    --name:BLAKEsalary:2850
    --name:TURNERsalary:1500
    --name:JAMESsalary:950

    PL/SQL procedure successfully completed.

  • 相关阅读:
    Python+selenium+unittest的GUI自动化框架实现
    新手学习selenium路线图(老司机亲手绘制)学前篇(转上海悠悠)
    jmeter需要登录才会返回的接口验证
    python、java大作战,python测试dubbo接口
    eclipse生成doc文件乱码
    读书笔记:读完互联网测试经验的感受
    关于全功能团队及测试人员的发展
    一个Junit做单元测试的简单例子
    python搭建简单的web服务器
    我的第一篇博客
  • 原文地址:https://www.cnblogs.com/KT-melvin/p/6854104.html
Copyright © 2011-2022 走看看