Oracle 游标使用全解(一)

2015-07-16 12:09:19 · 作者: · 浏览: 4

-- 声明游标;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 then
? ? ? ? ? ? ? ? ? ? dbms_output.put_line('No Value');
? ? ? ? ? ? ? ? ? ? when too_many_rows then
? ? ? ? ? ? ? ? ? ? ? dbms_output.put_line('too many rows');
? ? ? ? ? ? ? ? ? ? ? end;
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ?
--2,使用游标和loop循环来显示所有部门的名称
--游标声明
declare
? ? ? cursor csr_dept
? ? ? is
? ? ? --select语句
? ? ? select DNAME
? ? ? from Depth;
? ? ? --指定行指针,这句话应该是指定和csr_dept行类型相同的变量
? ? ? row_dept csr_dept%rowtype;
begin
? ? ? --for循环
? ? ? for row_dept in csr_dept loop
? ? ? ? ? dbms_output.put_line('部门名称:'||row_dept.DNAME);
? ? ? end loop;
end;



--3,使用游标和while循环来显示所有部门的的地理位置(用%found属性)
declare
? ? ? --游标声明
? ? ? cursor csr_TestWhile
? ? ? is
? ? ? --sel