Oracle中游标的使用

总结一下游标的使用

/********************************游标***********
游标特点:通过循环来处理多条数据,每次处理一条
游标分类:静态游标和引用游标(动态游标)
静态游标:隐式游标和显示游标
显示游标:普通游标 带参数的游标 循环游标
引用游标:弱类型游标和强类型游标
游标的4个属性:
isopen 表示:游标是否打开
rowcount 表示  游标影响数据条数
found / notfound 表示:游标当前数据行的数据是否有效
对于隐式游标访问属性: sql%
*********************************************************/

----隐式游标
begin
    dbms_output.put_line('游标影响数据行数:' || sql%rowcount);
    update emp set sal=1000 where deptno=10;
    if (sql%isopen) then
        dbms_output.put_line('open');
    else
            dbms_output.put_line('close');
    end if;
     dbms_output.put_line('游标影响数据行数:' || sql%rowcount);
end;


---显示游标(必须在使用前定义)
/***********************
游标操作步骤:
1.定义游标
2.打开游标
3.读取游标保存数据到变量
4.关闭游标

普通游标语法:
declare
    ---定义游标
    cursor 游标名称 is 查询语句;(确定游标处理数据范围[行与列])
begin
    ---打开游标
    open 游标名称;
    ---通过循环对游标进行访问
    loop
        fetch 游标名称 into 变量
    end loop;
    ---关闭游标
end;

**********************/

---显示部门编号为20所有员工的编号和姓名
declare
   ---定义游标
   cursor mycur is select empno,ename from emp where deptno=20;
   ---编号
   myempno emp.empno%type;
   --姓名
   myename emp.ename%type;
begin
    ---打开游标
    open mycur;
    ---读取游标数据
    loop
          ---在读取游标,在保存变量的时候,字段与定义游标字段一致
         fetch mycur into myempno,myename;
         exit when mycur%notfound;
         dbms_output.put_line('编号--'||myempno||'  姓名-'||myename);
    end loop;
    ---关闭游标
    close mycur;
end;

----根据输入部门编号,来显示对应部门所有员工信息
----带参数游标
/**********************
语法:
declare
    cursor 游标名称(游标参数列表) is 查询语句
begin
   open 游标名称(游标实际参数)
end;
*************************/

declare
    ---定义游标
     cursor mycur(mydeptno emp.deptno%type) is select * from emp where

deptno=mydeptno;
     inputdeptno emp.deptno%type;
     emprow emp%rowtype;
begin
   inputdeptno := &请输入部门编号;
   ---打开游标,并 传入参数
   open mycur(inputdeptno);
   loop
      fetch mycur into emprow;
      exit when mycur%notfound;
      dbms_output.put_line('编号--'|| emprow.empno
                                      || '  姓名--'||emprow.ename
                                      || '  工作'||emprow.job);
   end loop;
   --关闭游标
   close mycur;
end;

/******************循环游标**********************
语法:
delcare
    cursor 游标名称 is 查询语句;
begin
    for 游标变量  in 游标名称
    loop
       执行语句
    end loop;
end;
注意:在循环游标中,不需要有打开游标,关闭游标
在循环游标中,游标变量是不需要声明
***************************************************/

---显示部门编号为20员工信息
declare
   cursor mycur is select * from emp where deptno=20;
begin
    for emprow in mycur
    loop
             dbms_output.put_line('编号--'|| emprow.empno
                                      || '  姓名--'||emprow.ename
                                      || '  工作'||emprow.job);
    end loop;
end;


/******************************************
通过游标修改数据(update,delete)
语法:
declare
    ---定义游标
    cursor 游标名称 is 查询语句 for update;---在定义游标时候,要对处理数据进行锁定
   
begin
    ----使用游标修改数据
    update  table_name set 字段 where current of  游标名称;
    ---使用游标删除数据
     delete语句 where current of 游标名称;
end;
*****************************************/

-----根据输入部门编号修改对应员工的工资为2500
declare
   ---定义游标
   cursor mycur(mydeptno emp.deptno%type) is select * from emp where

deptno=mydeptno for update; 
   inputdeptno emp.deptno%type;
begin
   inputdeptno :=&请输入部门编号;
   for emprow in mycur(inputdeptno)
   loop
      ---对数据进行修改
      dbms_output.put_line('修改员工对应编号--'||emprow.empno);
      --update emp set sal=2500 where current of mycur;
      delete from emp where current of mycur;
      dbms_output.put_line('修改数据的条数:' || mycur%rowcount);
   end loop;
end;


----使用普通游标修改部门编号为20的员工信息
declare
  cursor mycur(mydeptno emp.deptno%type) is select * from emp where deptno=mydeptno

for update; 
  emprow emp%rowtype;
    inputdeptno emp.deptno%type;
begin
      inputdeptno :=&请输入部门编号;
      open mycur(inputdeptno);
      loop
           fetch mycur into emprow;
           exit when mycur%notfound;
          dbms_output.put_line('修改员工对应编号--'||emprow.empno);
          update emp set sal=2500 where current of mycur;
      end loop;
      close mycur;
end;

 

/***********************引用游标*******************
引用游标:弱类型游标和强类型游标

弱类型游标处理的语法:
declare
    ---定义游标类型
    type 游标类型 is ref cursor;
    ---定义对应游标变量
    游标变量的名称 游标类型;
begin
     --打开游标(引用在打开游标的时候,确定处理数据的行与列)
      open 游标名称 for 查询语句;
end;
引用游标注意:
1.在使用游标之前,必须需要定义游标类型。
2.在引用游标中,不能使用循环游标


---input
---当input=1 显示部门编号为10员工的姓名 工作
---当input=2显示部门编号为20员工的姓名 与 工资
***********************************/
declare
    ---定义游标的类型
    type mycurtype is ref cursor;
    ---定义此类型的游标变量
    mycur mycurtype;
    ---定义游标变量
    myename emp.ename%type;
    myjob emp.job%type;
    mysal emp.sal%type;
    ---辨识
    input char(10);   
begin
    input := '&请输入';
    if input = '1' then
       --显示部门编号为10员工的姓名 工作
       ---打开游标
       open mycur for select ename,job from emp where deptno=10;
       loop
           fetch mycur into myename,myjob;
           exit when mycur%notfound;
           dbms_output.put_line('姓名:'||myename ||'    工作:'||myjob);
       end loop;
   else   
       --   显示部门编号为20员工的姓名 与 工资
       open mycur for select ename,sal from emp where deptno=20;
       loop
         fetch mycur into myename,mysal;
         exit when mycur%notfound;
         dbms_output.put_line('姓名:'||myename||'   薪水: '||mysal);
       end loop;
    end if;
    --- 关闭游标
     close mycur;
end;

/*****************************
强类型游标语法:
 declare
    ---定义游标类型
    type 游标类型 is ref cursor return 类型;
    ---定义对应游标变量
    游标变量的名称 游标类型;
begin
     --打开游标(引用在打开游标的时候,确定处理数据的行与列)
      open 游标名称 for 查询语句;
end;
********************************/


--input
--input 的值1 显示部门编号为10 员工信息
---input的值2 显示部门编号为20员工信息

declare
   ---定义游标类型
   type mycurtype is ref cursor return  emp%rowtype;
   ---定义游标
   mycur mycurtype;
   --游标变量
   emprow emp%rowtype;
   --辨识
   input char(10);
begin
    input := '&请输入';
    if  input = '1' then
       open mycur for select * from emp where deptno=10;
    else
        open mycur for select * from emp where deptno=20;  
    end if;
    loop
        fetch mycur into emprow;
        exit when mycur%notfound;
        dbms_output.put_line('编号:'||emprow.empno||'    姓名:'||emprow.ename);
    end loop;
    ---关闭游标
    close mycur;
end;

 

 

 


本文出自 “此刻打盹,你将做梦;..” 博客,转载请与作者联系!

你可能感兴趣的:(oracle,sql,动态,影响,notFound)