使用显式光标获取数据
光标打开之后,可以使用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/