PLSQL Language Referenc-PL/SQL静态SQL-光标-显式光标属性

本文详细介绍了显式光标的各种属性,包括%ISOPEN、%FOUND、%NOTFOUND及%ROWCOUNT等,并通过具体示例展示了如何在PL/SQL中使用这些属性来控制和监测数据的检索过程。

显式光标属性

语法格式:光标名%属性名

显式光标和光标变量拥有相同的属性。

如果显式光标没有打开,则引用%ISOPEN之外的属性,都会引发INVALID_CURSOR异常。

1%ISOPEN

如果光标打开了返回TRUE,否则返回FALSE

该属性用于:

在打开光标之前用于检查显式光标没有打开,如果打开一个已经打开的显式光标,则会引发CURSOR_ALREADY_OPEN异常。(不适用于光标变量,因为光标变量可以随意打开)

在关闭光标之前,检查显式光标已经打开。

DECLARE

    CURSOR c1 IS

        SELECT last_name, salary FROM employees

        WHERE ROWNUM < 11;

 

    the_name employees.last_name%TYPE;

    the_salary employees.salary%TYPE;

BEGIN

    IF NOT c1%ISOPEN THEN

        OPEN c1;

    END IF;

 

    FETCH c1 INTO the_name, the_salary;

    dbms_output.put_line(the_name || ', ' || the_salary);

    IF c1%ISOPEN THEN

        CLOSE c1;

    END IF;

END;

 

2%FOUND

NULL-光标打开之后,获取数据之前

TRUE-如果最近一次FETCH返回一行

FALSE-其它

用于判断是否有取回的行,对它进行处理。

DECLARE

    CURSOR c1 IS

        SELECT last_name, salary FROM employees

        WHERE ROWNUM < 11

        ORDER BY last_name;

 

    my_ename   employees.last_name%TYPE;

    my_salary  employees.salary%TYPE;

BEGIN

    OPEN c1;

    LOOP

        FETCH c1 INTO my_ename, my_salary;

        IF c1%FOUND THEN  --成功获取

            DBMS_OUTPUT.PUT_LINE('姓名 = ' || my_ename || ', 薪水 = ' || my_salary);

        ELSE 

            EXIT;

        END IF;

    END LOOP;

END;

 

3%NOTFOUND

NULL-光标打开之后,获取数据之前

FALSE-如果最近一次FETCH返回一行

TRUE-其它

用于退出循环。

DECLARE

    CURSOR c1 IS

        SELECT last_name, salary FROM employees

        WHERE ROWNUM < 11

        ORDER BY last_name;

 

    my_ename   employees.last_name%TYPE;

    my_salary  employees.salary%TYPE;

BEGIN

    OPEN c1;

    LOOP

        FETCH c1 INTO my_ename, my_salary;

        IF c1%NOTFOUND THEN

            EXIT;

        ELSE

            DBMS_OUTPUT.PUT_LINE('姓名 = ' || my_ename ||

                                 ', 薪水 = ' || my_salary);

    END IF;

  END LOOP;

END;

--注意,如果fetch从未获取过行,则%notfound始终为null,则循环不会退出,为了避免无限循环,建议使用下面的判断语句:exit when c1%notfound or (c1%notfound is null)

 

4%ROWCOUNT

0-光标打开之后,获取数据之前

获取的行的数量-其它

DECLARE

    CURSOR c1 IS

        SELECT last_name FROM employees

        WHERE ROWNUM < 11

        ORDER BY last_name;

 

    name  employees.last_name%TYPE;

BEGIN

    OPEN c1;

    LOOP

        FETCH c1 INTO name;

        EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;

        DBMS_OUTPUT.PUT_LINE(c1%ROWCOUNT || '. ' || name);

        IF c1%ROWCOUNT = 5 THEN

            DBMS_OUTPUT.PUT_LINE('--- 获取5行记录 ---');

        END IF;

    END LOOP;

    CLOSE c1;

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1122708/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1122708/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值