日期:2014-05-16  浏览次数:20448 次

Oracle 游标使用全解

-- 声明游标;CURSOR cursor_name IS select_statement

?

--For 循环游标

--(1)定义游标

--(2)定义游标变量

--(3)使用for循环来使用这个游标

declare

? ? ? ?--类型定义

? ? ? ?cursor c_job

? ? ? ?is

? ? ? ?select empno,ename,job,sal

? ? ? ?from emp

? ? ? ?where job='MANAGER';

? ? ? ?--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型

? ? ? ?c_row c_job%rowtype;

begin

? ? ? ?for c_row in c_job loop

? ? ? ? ?dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);

? ? ? ?end loop;

end;

?

?

?

--Fetch游标

--使用的时候必须要明确的打开和关闭

?

declare?

? ? ? ?--类型定义

? ? ? ?cursor c_job

? ? ? ?is

? ? ? ?select empno,ename,job,sal

? ? ? ?from emp

? ? ? ?where job='MANAGER';

? ? ? ?--定义一个游标变量

? ? ? ?c_row c_job%rowtype;

begin

? ? ? ?open c_job;

? ? ? ? ?loop

? ? ? ? ? ?--提取一行数据到c_row

? ? ? ? ? ?fetch c_job into c_row;

? ? ? ? ? ?--判读是否提取到值,没取到值就退出

? ? ? ? ? ?--取到值c_job%notfound 是false?

? ? ? ? ? ?--取不到值c_job%notfound 是true

? ? ? ? ? ?exit when c_job%notfound;

? ? ? ? ? ? dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);

? ? ? ? ?end loop;

? ? ? ?--关闭游标

? ? ? close c_job;

end;

?

--1:任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况。

? ? ? ?begin

? ? ? ? ?update emp set ENAME='ALEARK' WHERE EMPNO=7469;

? ? ? ? ?if sql%isopen then

? ? ? ? ? ?dbms_output.put_line('Openging');

? ? ? ? ? ?else

? ? ? ? ? ? ?dbms_output.put_line('closing');

? ? ? ? ? ? ?end if;

? ? ? ? ? if sql%found then

? ? ? ? ? ? dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行

? ? ? ? ? ? else

? ? ? ? ? ? ? dbms_output.put_line('Sorry');

? ? ? ? ? ? ? end if;

? ? ? ? ? ? ? if sql%notfound then

? ? ? ? ? ? ? ? dbms_output.put_line('Also Sorry');

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? dbms_output.put_line('Haha');

? ? ? ? ? ? ? ? ? end if;

? ? ? ? ? ? ? ? ? ?dbms_output.put_line(sql%rowcount);

? ? ? ? ? ? ? ? ? ?exception?

? ? ? ? ? ? ? ? ? ? ?when no_data_found then

? ? ? ? ? ? ? ? ? ? ? ?dbms_output.put_line('Sorry No data');

? ? ? ? ? ? ? ? ? ? ? ?when too_many_rows then

? ? ? ? ? ? ? ? ? ? ? ? ?dbms_output.put_line('Too Many rows');

? ? ? ? ? ? ? ? ? ? ? ? ?end;

declare

? ? ? ?empNumber emp.EMPNO%TYPE;

? ? ? ?empName emp.ENAME%TYPE;

? ? ? ?begin

? ? ? ? ?if sql%isopen then

? ? ? ? ? ?dbms_output.put_line('Cursor is opinging');

? ? ? ? ? ?else

? ? ? ? ? ? ?dbms_output.put_line('Cursor is Close');

? ? ? ? ? ? ?end if;

? ? ? ? ? ? ?if sql%notfound then

? ? ? ? ? ? ? ?dbms_output.put_line('No Value');

? ? ? ? ? ? ? ?else

? ? ? ? ? ? ? ? ?dbms_output.put_line(empNumber);

? ? ? ? ? ? ? ? ?end if;

? ? ? ? ? ? ? ? ?dbms_output.put_line(sql%rowcount);

? ? ? ? ? ? ? ? ?dbms_output.put_line('-------------');

?

? ? ? ? ? ? ? ? ?select EMPNO,ENAME into ?empNumber,empName from emp where EMPNO=7499;

? ? ? ? ? ? ? ? ?dbms_output.put_line(sql%rowcount);

?

? ? ? ? ? ? ? ? if sql%isopen then

? ? ? ? ? ? ? ? dbms_output.put_line('Cursor is opinging');

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? dbms_output.put_line('Cursor is Closing');

? ? ? ? ? ? ? ? end if;

? ? ? ? ? ? ? ? ?if sql%notfound then

? ? ? ? ? ? ? ? ?dbms_output.put_line('No Value');

? ? ? ? ? ? ? ? ?else

? ? ? ? ? ? ? ? ?dbms_output.put_line(empNumber);

? ? ? ? ? ? ? ? ?end if;

? ? ? ? ? ? ? ? ?exception?

? ? ? ? ? ? ? ? ? ?when no_data_found th