ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL静态SQL-静态SQL的描述-光标-使用显式光标获取数据

PLSQL Language Referenc-PL/SQL静态SQL-静态SQL的描述-光标-使用显式光标获取数据

原创 Oracle 作者:LuiseDalian 时间:2014-03-16 17:07:46 0 删除 编辑

使用显式光标获取数据

光标打开之后,可以使用FETCH获取数据。

FETCH cursor_name INTO into_clause

其中的into_cluase或者是变量的列表,或者是单个的记录变量。对于查询返回的每一列,变量列表或者是记录必须有对应的类型兼容的变量或域。%TYPE%ROWTYPE对于声明在FETCH语句中使用的变量或记录变量特别有用。

FETCH语句获取结果集中的当前行,将该行的列的值存储到变量或记录中,然后将光标移到下一行。

通常要在一个循环中使用FETCH语句,该循环当FETCH语句运行了所有的行后退出。为了检测这个退出条件,可以使用%NOTFOUND属性。FETCH没有返回行时,PL/SQL不会引发异常。


DECLARE

    CURSOR c1 IS

        SELECT last_name, job_id FROM employees

        WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')

        ORDER BY last_name;

    v_lastname  employees.last_name%TYPE;  -- 保存last_name的变量

    v_jobid     employees.job_id%TYPE;     -- 保存job_id的变量

    CURSOR c2 IS

        SELECT * FROM employees

        WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]')

        ORDER BY job_id;

    v_employees employees%ROWTYPE;  -- 记录变量

BEGIN

    OPEN c1;

    LOOP 

        -- 获取2列到变量中

        FETCH c1 INTO v_lastname, v_jobid;

        EXIT WHEN c1%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );

    END LOOP;

    CLOSE c1;

    DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );

  OPEN c2;

  LOOP 

    --获取整行到记录变量中

    FETCH c2 INTO v_employees;

    EXIT WHEN c2%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||

                               v_employees.job_id );

    END LOOP;

    CLOSE c2;

END;

--FETCH相同的光标到不同的变量中

DECLARE

    CURSOR c IS

        SELECT e.job_id, j.job_title

        FROM employees e, jobs j

        WHERE e.job_id = j.job_id AND e.manager_id = 100

        ORDER BY last_name; 

    --记录变量

    job1 c%ROWTYPE;

    job2 c%ROWTYPE;

    job3 c%ROWTYPE;

    job4 c%ROWTYPE;

    job5 c%ROWTYPE;

 

BEGIN

    OPEN c;

    FETCH c INTO job1;  -- 获取第1

    FETCH c INTO job2;  -- 获取第2

    FETCH c INTO job3;  -- 获取第3

    FETCH c INTO job4;  -- 获取第4

    FETCH c INTO job5;  -- 获取第5

    CLOSE c;

 

    DBMS_OUTPUT.PUT_LINE(job1.job_title || ' (' || job1.job_id || ')');

    DBMS_OUTPUT.PUT_LINE(job2.job_title || ' (' || job2.job_id || ')');

    DBMS_OUTPUT.PUT_LINE(job3.job_title || ' (' || job3.job_id || ')');

    DBMS_OUTPUT.PUT_LINE(job4.job_title || ' (' || job4.job_id || ')');

    DBMS_OUTPUT.PUT_LINE(job5.job_title || ' (' || job5.job_id || ')');

end;   

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

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

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5677532