PL/SQL游标使用详解(一)

2014-11-24 14:09:59 · 作者: · 浏览: 0
  • 名 字
  • 说 明
  • SQL%FOUND
  • 如果取到记录就返回TRUE,否者返回FLASE
  • SQL%NOTFOUND
  • 如果没有取得记录就返回TRUE,否者返回FALSE
  • SQL%ROWCOUNT
  • 返回从游标中取出的记录数
  • SQL%ISOPEN
  • 由于隐式游标总是自动打开和关闭,因此这个属性中是FALSE
    每当在PL/SQL中执行一个SQL语时,Oracle 数据库都会为这个语句分一个上下文区域(Context Area)来处理所必需的信息,其中包括语句处理的行数,一个指向语句被分析以后的表示形式的指针以及查询的结果集。游标是指向上下文区域的句柄或指针,PL/SQL通过游标可以控制或处理上下文区域。如果按照游标是否绑定到一个专门的查询语句来划分,可以分为静态游标和动态游标。其中静态游标又分为:隐式游标和显示游标;动态游标分为:强类型和弱类型。

    1.隐式游标

    每当我们执行一个DML语句(包括INSERT,UPDATE,MERGE或者DELETE)或者SELECT INTO语句时,PL/SQL都会声明一个隐式游标并管理这个游标。这种游标之所以叫做隐式游标,是因为数据库自动执行游标相关操作,比如,打开,提取,关闭等。隐式游标又叫做SQL游标。

    1.1隐式游标属性

    隐式游标属性返回有关DDL语句和DML语句执行的信息,该游标属性值总是返回最近执行的SQL语句。执行打开的隐式游标的属性值是空的。隐式游标可用的属性如下:
    隐式游标属性

    隐式游标属性总是返回最后一次执行的SQL语句的属性值,而不管这个SQL语句时在哪个代码块或者程序中执行的。
    declare
    v_empno emp.empno%type := 3792;
    begin
    update emp e set e.sal = 5000 where e.empno = v_empno;
    if sql%notfound then
    insert into emp
    (empno, ename, hiredate, sal, deptno)
    values
    (v_empno, 'CHICLEWU', date '2011-07-08', 4000, 50);
    end if;
    end;

    1.2使用隐式游标属性准则

    当使用隐式游标属性是,需要考虑以下准则:
    游标属性值总是返回最近执行的SQL语句,它可能是在不同的作用域(例如,在一个子块)。

    在SELECT INTO语句中,%NOTFOUND属性是不生效的:

    如果在SELECT INTO语句没有返回行,PL/SQL立即抛出一个预订的NO_DATA_FOUND异常,在检查%NOTFOUND之前中断控制流。

    SELECT INTO语句调用聚合函数总是返回个值或者空值。%NOTFOUNT属性总是返回FALSE,因此检查它是没有必要的。

    2.显示游标

    当你需要精确地控制查询处理时,可以在任何PL/SQL块、子程序或者包的声明部分显示地声明一个游标。显示游标就是在代码的声明部分明确定义的SELECT语句,并同时指定一个名字。然后你可以通过三个语句来控制游标:OPEN、FETCH和CLOSE。首先,你需要使用OPEN语句初始化游标,标识结果集。然后,可以反复地执行FETCH语句直到所有行都被取出,或者使用BULK COLLECT语句一次性取出所有行。最后,只用CLOSE语句释放游标。

    2.1声明显示游标

    要使用显示游标,必须先在PL/SQL块或包的规范部分声明它。

    CURSOR cursor_name

    [ ( cursor_parameter_declaration [, cursor_parameter_declaration ]... )]

    [ RETURN rowtype] IS select_statement ;

    其中,cusor_name是显示游标的名字;cursor_parameter_declartion是显示游标的参数,是可选项;select_statement是显示游标指定的SELECT语句。

    2.2打开显示游标

    OPEN cursor_name

    [ ( cursor_parameter_name [ [,] cursor_parameter_name ]... ) ] ;

    其中,cusor_name是显示游标的名字;cursor_parameter_name是显示游标的参数,是可选项。如果游标声明时,指定了游标参数,则打开时一定要指定该参数。

    2.3提取数据

    每次只提取一行数据:

    FETCH cursor_name

    INTO [(variable_name [, variable_name ]... | record_name )];

    一次提取多行数据:

    FETCH cursor_name

    BULK COLLECT INTO [(collection_name [,collection_name...])];

    2.4关闭显示游标

    CLOSE cursor_name;

    2.5显示游标属性

    每个显示游标和游标变量都有四个属性:%FOUND、%NOTFOUND、%ROWCOUNT和%ISOPEN。可以下面的语法使用这些属性:

    cusor%attribute

    其中,cursor就是我们声明的游标名字或者游标变量。

    显示游标属性

    名 字

    说 明

    cusor%FOUND

    如果取到记录就返回TRUE,否者返回FLASE

    cusor%NOTFOUND

    如果没有取得记录就返回TRUE,否者返回FALSE

    cusor%ROWCOUNT

    返回当值从指定游标取得的记录数量

    cusor%ISOPEN

    如果游标时打开的则返回TRUE,否则返回FALE

    2.6显示游标例子

    2.6.1不带参数的显示游标

    declare

    cursor cur_emp is

    select e.ename, e.sal from emp e where e.deptno = 10; --声明游标

    v_ename emp.ename%type;

    v_sal emp.sal%type;

    begin

    open cur_emp; --打开游标

    --循环取出

    loop

    fetch cur_emp

    into v_ename, v_sal; --提取记录

    exit when cur_emp%notfound;

    dbms_output.put_line(v_ename || '的工资是' || v_sal);

    end loop;

    close cur_emp; --关闭游标

    end;

    2.6.2带参数参数的显示游标

    declare

    cursor cur_emp(p_empno number) is

    select e.ename, e.sal from emp e where e.empno = p_empno; --声明游标

    v_empno emp.empno%type := 7788;

    v_ename emp.ename%type;

    v_sal emp.sal%type;

    begin

    open cur_emp(v_empno); --打开游标

    --循环取出

    loop

    fetch cur_emp

    into v_ename, v_sal; --提取记录

    exit when cur_emp%notfound;

    dbms_output.put_line(v_ename || '的工资是' || v_sal);

    end loop;

    close cur_emp; --关闭