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

使用显式光标获取数据

光标打开之后,可以使用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/,如需转载,请注明出处,否则将追究法律责任。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值