浏览 7359 次
锁定老帖子 主题:sql 游标实例
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-12
:隐式游标 -:自身存在的游标,处理返回单行语句,不用创建默认名称是小写sql 游标 :显示游标 -:返回多行查询 :REF游标 -:可以指向多个结果集的游标 隐式游标 :%found 找到 :%notfound 没有找到 单行异常 :too_mang_rows 多行异常 :no_data_found ----------------------------- 1、隐式游标 实例1、用sql%found 相当于sql.found set serveroutput on; declare begin update userinfo set username='aaa' where userid=1; if sql%found then dbms_output.put_line('ok'); dbms_output.put_line(sql%rowcount);//返回更新的行数 end if if sql%notfound then dbms_output.put_line('no'); end if; exception when when no_data_found then dbms_output.put_line('no data found'); end; 实例2、使用sql%notfound set serveroutput on; declare var_name userinfo.username%type; begin select username into var_name from userinfo where userid=1; dbms_output.put_line('username='||var_name); exception when no_data_found then //单行异常 too_mang_rows:多行异常 dbms_output.put_line('no data found'); end; ------------------------------------------------------ 2、显示游标:必须要有结果集 userInfo表里加个字段 salary set serveroutput on; declare var_userid number(3); var_salary number(3); cursor mysor is select userid,salary from userinfo;//声明一个游标 它的类型是这个表里的列的类型 begin open mysor; 打开游标 loop fetch mysor into var_userid,var_sqlary;//相当于foreach exit when mysor%notfound; //判断如果没有找到 if var_userid=1 then update userinfo set salary = salary+salary*0.5 where userid=var_userid; end if; if var_userid=2 then update userinfo set salary = salary+salary*0.6 where userid=var_userid; end if; if var_userid=3 then update userinfo set salary = salary+salary*0.7 where userid=var_userid; end if; commit; end loop; close mysor;//关闭游标 end; -------------------------- 给游标传参数 set serveroutput on; declare var_name varchar(2); cursor mysor(myid number) is select username from userinfo where userid=myid; begin loop open mysor(6);//给游标传参数 fatch mysor into var_name; exit when mysor%notfound; dbms_output.put.line(var_name); end loop; close mysor; end; ------------------------- for 循环游标 set serveroutput on; declare cursor mysor is select * from userinfo;--//游标的类型就是这张表的所有列的类型 begin --open mysor; //使用for循环游标不用打开关闭的 它自动开关 for a in mysor --//for循环的变量不用声明 可直接使用 a loop dbms_output.put_line(a.username); end loop; -- close mysor; end; ------------------------ 3、ref游标 用type声明变量 set serveroutput on; declare type mysor is ref cursor; --//声明一个可以读多个结果集的游标 var_sor,mysor; --//var_sor是个游标类型 var_user userInfo%rowtype;--//var_user是这个表的行类型 var_person personInfo%rowtype; begin open var_sor for select * from userInfo;--//打开游标检索的结果集 loop fetch var_sor into var_user; exit when var_sor%notfound; dbms_output.put_line(var_user.username); end loop; close var_sor; open var_sor for select * from personInfo;--//检索第二个结果集的游标 loop fetch var_sor into var_person; exit when var_sor%notfound; dbms_output.put_line(var_person.pname); end loop; close var_sor; end loop; end; 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |