ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL静态SQL-光标-显式光标属性

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

原创 Oracle 作者: luisedalian 时间:2014-03-16 17:14:56 0 删除 编辑

显式光标属性

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

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

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

1%ISOPEN

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

该属性用于:

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

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

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

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

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

n  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

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

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

n  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

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

n  获取的行的数量-其它

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5685941