设为首页 收藏本站
查看: 847|回复: 0

[经验分享] oracle存储过程(游标作为OUT参数输出)

[复制链接]

尚未签到

发表于 2016-8-5 12:50:13 | 显示全部楼层 |阅读模式
  包中带过程
  要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 procedure AAA(变量名 out [cur_name])如此申明OUT变量
    存储过程 用系统默认的 sys_refcursor 游标类型 定义变量就OK了
1、Sql代码
--PL/SQL Code (包中带过程) 过程带游标的OUT参数,返回游标(ref cursor)  
create or replace package my_pack as 
 type my_ref_cursor is ref cursor;  
 procedure getMyCursor(val out my_ref_cursor);   
end my_pack;  
 
create or replace package body my_pack as 
 procedure getMyCursor(val out my_ref_cursor)  
 is 
 begin 
  open val for select * from student;  
 end;  
end my_pack;  
  
  --PL/SQL Code (包中带过程) 过程带游标的OUT参数,返回游标(ref cursor)
   create or replace package my_pack as
    type my_ref_cursor is ref cursor;
    procedure getMyCursor(val out my_ref_cursor);
   end my_pack;
   
   create or replace package body my_pack as
    procedure getMyCursor(val out my_ref_cursor)
    is
    begin
     open val for select * from student;
    end;
   end my_pack;
 
2、Java代码 
Class.forName("oracle.jdbc.driver.OracleDriver");  
Connection conn = DriverManager.getConnection                       ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");   
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());     
CallableStatement cs = conn.prepareCall("{ call my_pack.getMyCursor(?) }");  
cs.registerOutParameter(1,OracleTypes.CURSOR);  
cs.execute();  
ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);  
while(rs.next())  
{  
    System.out.println(rs.getString(1)+"  "+rs.getString(2)+"  "+rs.getString(3)+"  "+ rs.getDate(4)+"  "+rs.getString(5));  

  
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection conn = DriverManager.getConnection                       ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");
   DriverManager.registerDriver (new oracle.jdbc.OracleDriver());  
   CallableStatement cs = conn.prepareCall("{ call my_pack.getMyCursor(?) }");
   cs.registerOutParameter(1,OracleTypes.CURSOR);
   cs.execute();
   ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);
   while(rs.next())
   {
    System.out.println(rs.getString(1)+"  "+rs.getString(2)+"  "+rs.getString(3)+"  "+ rs.getDate(4)+"  "+rs.getString(5));
   }
  
3、Sql代码
--PL/SQL Code(存储过程) 带游标的OUT参数,返回游标(ref cursor)  
create or replace procedure retCursor(ret_cursor out sys_refcursor)is 
ret_cursor_value  sys_refcursor;  
begin 
open ret_cursor_value for select * from student;  
 ret_cursor:=ret_cursor_value;  
end retCursor; 
  
--PL/SQL Code(存储过程) 带游标的OUT参数,返回游标(ref cursor)
   create or replace procedure retCursor(ret_cursor out sys_refcursor)is
   ret_cursor_value  sys_refcursor;
   begin
   open ret_cursor_value for select * from student;
    ret_cursor:=ret_cursor_value;
   end retCursor;
  
4、Java代码
Class.forName("oracle.jdbc.driver.OracleDriver");  
Connection conn = Connection conn = DriverManager.getConnection                       ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");   
 
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());     
CallableStatement cs = conn.prepareCall("{ call retCursor(?) }");  
cs.registerOutParameter(1,OracleTypes.CURSOR);  
cs.execute();  
ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);  
while(rs.next())  
{  
    System.out.println(rs.getString(1)+"  "+rs.getString(2)+"  "+rs.getString(3)+"  "+ rs.getDate(4)+"  "+rs.getString(5));  

  Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection conn = Connection conn = DriverManager.getConnection                       ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");
  DriverManager.registerDriver (new oracle.jdbc.OracleDriver());  
   CallableStatement cs = conn.prepareCall("{ call retCursor(?) }");
   cs.registerOutParameter(1,OracleTypes.CURSOR);
   cs.execute();
   ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);
   while(rs.next())
   {
    System.out.println(rs.getString(1)+"  "+rs.getString(2)+"  "+rs.getString(3)+"  "+ rs.getDate(4)+"  "+rs.getString(5));
   }
  
5、下面是个每个学生求平均值的存储过程。遇到的问题是带参数游标中的变量名字不要和表中的一样,否则会出问题
  Sql代码
create or replace procedure AAA  
as   
--查询学生表的ID  
cursor s_sno is select s.sno from student s;   
--通过学生ID查询平均成绩  
cursor sc_avg(s_no varchar2) is select avg(sc.degree) from score sc where sc.sno=s_no;   
s_sno_j student.sno%type;   --变量ID  
sc_avg_i score.degree%type; --变量平局成绩  
begin 
 open s_sno;--打开查询ID的游标  
 loop  
   fetch s_sno into s_sno_j;  
   exit when s_sno%notfound;    
     open sc_avg(s_sno_j); --打开查询平均成绩的游标,参数为学生ID  
     loop  
     fetch sc_avg into sc_avg_i;  
     exit when sc_avg%notfound;  
     dbms_output.put_line(sc_avg_i);  
     end loop;  
     close sc_avg;  
 end loop;  
 close s_sno;  
end AAA; 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253278-1-1.html 上篇帖子: oracle 无法标识锁定数据文件的解決 下篇帖子: Oracle listener静态注册和动态注册总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表