• 『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游标

    使用显示游标前必须首先定义游标declare cursor

    打开游标open cursor_name

    提取数据fetch cursor_name into variable1,variable2...(一次提取一条记录); fetch cursor_name bulk collect into collect1,collect2...;(一次提取多条记录)

    关闭游标close cursor_name

    显示游标示例

    SQL> declare
    2 cursor c_emp_cursor is
    3 select empno,ename from emp where deptno =30;
    4 v_empno emp.empno%type;
    5 v_lname emp.ename%type;
    6 begin
    7 open c_emp_cursor;
    8 loop
    9 fetch c_emp_cursor
    10 into v_empno, v_lname;
    11 exit when c_emp_cursor%notfound;
    12 dbms_output.put_line(v_empno || ' ' || v_lname);
    13 end loop;
    14 close c_emp_cursor;
    15 end;
    16 /
    7499 ALLEN
    7521 WARD
    7654 MARTIN
    7698 BLAKE
    7844 TURNER
    7900 JAMES

    PL/SQL procedure successfully completed.

    参数游标

    SQL> declare
    2 cursor c_emp_cursor(v_dept_id number) is
    3 select empno,ename
    4 from emp
    5 where deptno =v_dept_id;
    6 v_empno emp.empno%type;
    7 v_lname emp.ename%type;
    8 begin
    9 open c_emp_cursor(30);
    10 loop
    11 fetch c_emp_cursor
    12 into v_empno, v_lname;
    13 exit when c_emp_cursor%notfound;
    14 dbms_output.put_line(v_empno || ' ' || v_lname);
    15 end loop;
    16 close c_emp_cursor;
    17 end;
    18 /
    7499 ALLEN
    7521 WARD
    7654 MARTIN
    7698 BLAKE
    7844 TURNER
    7900 JAMES

    PL/SQL procedure successfully completed.

    隐式游标(FOR循环)

    oracle内部会隐含打开、提取和关闭游标

        游标型FOR循环是和一个现实游标或者直接放在循环边界中的SELECT语句关联在一起的循环。如果你需要取出游标的每条记录依次处理,就可以使用游标FOR循环,而这种也是游标的主要用法。语法如下:

    FOR record IN {cursor_name | select statement}

    LOOP

        executable statements

    END LOOP;

    其中record是一个记录,这个记录是PL/SQL根据cursor_name这个游标%ROWTYPE属性隐式声明出来的。注意:不要现实的声明一个与循环索引(record)同名的记录,会导致逻辑错误。直接在循环中嵌套SELECT语句。

    SQL> begin
    2 for emp_record in
    3 (select empno, ename from emp
    4 where deptno = 30 ) loop
    5 dbms_output.put_line(emp_record.empno || ' ' ||
    6 emp_record.ename);
    7 end loop;
    8 end;
    9 /
    7499 ALLEN
    7521 WARD
    7654 MARTIN
    7698 BLAKE
    7844 TURNER
    7900 JAMES

    PL/SQL procedure successfully completed.

  • 相关阅读:
    C实现类封装、继承、多态
    运算符重载详解
    类定义 对象数组
    Install KVM Hypervisor on arrch64 Linux Server
    Failed to load package MonoAndroidDesignerPackage
    C# is和as操作符
    C#中out和ref之间的区别
    C#中 const 和 readonly 的区别
    C#版本和.NET版本以及VS版本的对应关系
    各类纤程/协程使用比较
  • 原文地址:https://www.cnblogs.com/KT-melvin/p/6850610.html
Copyright © 2020-2023  润新知