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

[经验分享] Java代码调用Oracle的存储过程,存储函数和包

[复制链接]

尚未签到

发表于 2017-12-11 13:43:07 | 显示全部楼层 |阅读模式
1 import java.sql.CallableStatement;  

  2 import java.sql.Connection;  

  3 import java.sql.ResultSet;  

  4 import java.sql.SQLException;  

  5  
  6 import oracle.jdbc.driver.OracleCallableStatement;
  
  7 import oracle.jdbc.driver.OracleTypes;
  
  8
  
  9 import org.junit.Test;
  
10

  
11 public>  
12     
  
13     /*
  
14      * CallableStatement 接口
  
15      *     调用存储函数,等号左边有一个返回值
  
16      *    {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
  
17      *  调用存储过程. 没有返回值
  
18              {call <procedure-name>[(<arg1>,<arg2>, ...)]}
  
19
  
20      *
  
21      */
  
22     
  
23     /*存储过程 查询某个员工的姓名  月薪 职位
  
24      * create or replace procedure queryEmpinfo(eno in number,
  
25                                              pename out varchar2,
  
26                                              psal   out number,
  
27                                              pjob   out varchar2)
  
28      */   
  
29     
  
30     @Test
  
31     public void testProcedure(){
  
32         //{call <procedure-name>[(<arg1>,<arg2>,...)]}
  
33         String sql = "{call queryEmpinfo(?,?,?,?)}";//4个问号中,第一个是输入参数,其余是输出参数
  
34         Connection conn = null;
  
35         //要用CallableStatement这个接口,用于执行 SQL 存储过程的接口
  
36         CallableStatement call = null;
  
37         
  
38         try {
  
39             conn = JDBCUtils.getConnection();
  
40             call = conn.prepareCall(sql);
  
41             //对于in参数,需要赋值
  
42             call.setInt(1,7839);
  
43             //对于out参数,需要声明
  
44             call.registerOutParameter(2, OracleTypes.VARCHAR);//第二个是字符串
  
45             call.registerOutParameter(3, OracleTypes.NUMBER);//第三个是数字
  
46             call.registerOutParameter(4, OracleTypes.VARCHAR);//第四个是字符串
  
47            
  
48             call.execute();
  
49             //取出结果
  
50             String name = call.getString(2);
  
51             double sal = call.getDouble(3);
  
52             String job = call.getString(4);
  
53             System.out.println(name+"\t"+sal+"\t"+job+"\t");
  
54         } catch (SQLException e) {
  
55             e.printStackTrace();
  
56         }finally{
  
57             JDBCUtils.release(conn, call, null);//没有最后一个参数就传入null
  
58         }
  
59     }
  
60
  
61     /*存储函数  查询某个员工的姓名,月薪和职位
  
62      * create or replace function queryEmpIncome(eno in number)
  
63         return number
  
64      */   
  
65     @Test
  
66     public void testFunction(){
  
67         //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
  
68         //第一个问号是函数的返回值,第二个问号是输入参数.  返回值的作用和输出参数是一样的.
  
69         String sql = "{?=call QUERYEMPINCOME(?)}";//这个call后面的存储过程名或者是存储函数名大写或者是小写是没有要求的.
  
70         Connection conn = null;
  
71         //要用CallableStatement这个接口,用于执行 SQL 存储过程的接口
  
72         CallableStatement call = null;
  
73         
  
74         try {
  
75             conn = JDBCUtils.getConnection();
  
76             call = conn.prepareCall(sql);
  
77            
  
78             //对于in参数,赋值
  
79             call.setInt(2,7839);
  
80            
  
81             //对于out参数,申明
  
82             call.registerOutParameter(1, OracleTypes.NUMBER);
  
83             call.execute();
  
84             //取出结果
  
85             //取出结果
  
86             double income = call.getDouble(1);
  
87             System.out.println(income);
  
88         } catch (SQLException e) {
  
89             e.printStackTrace();
  
90         }finally{
  
91             JDBCUtils.release(conn, call, null);//没有最后一个参数就传入null
  
92         }
  
93         
  
94         
  
95     }
  
96     
  
97     /*
  
98         查询某个部门中所有员工的所有信息
  
99         包头
  
100         CREATE OR REPLACE PACKAGE MYPACKAGE AS
  
101         
  
102           type empcursor is ref cursor;
  
103           procedure queryEmpList(dno in number,empList out empcursor);
  
104         
  
105         END MYPACKAGE;
  
106         
  
107         
  
108         包体
  
109         CREATE OR REPLACE
  
110         PACKAGE BODY MYPACKAGE AS
  
111         
  
112           procedure queryEmpList(dno in number,empList out empcursor) AS
  
113           BEGIN
  
114             open empList for select * from emp where deptno=dno;
  
115           END queryEmpList;
  
116         
  
117         END MYPACKAGE;   
  
118      */
  
119     @Test
  
120     public void testCursor(){
  
121         //{call <procedure-name>[(<arg1>,<arg2>, ...)]}
  
122         String sql = "{call MYPACKAGE.queryEmpList(?,?)}";
  
123         
  
124         Connection conn = null;
  
125         CallableStatement call = null;
  
126         //有游标,就有结果集
  
127         ResultSet rest = null;
  
128         try {
  
129             conn = JDBCUtils.getConnection();
  
130             call = conn.prepareCall(sql);
  
131            
  
132             //对于in参数,赋值
  
133             call.setInt(1, 20);
  
134            
  
135             //对于out参数,申明
  
136             call.registerOutParameter(2, OracleTypes.CURSOR);
  
137             call.execute();        
  
138             //取出集合
  
139             //这个地方要强转!!!OracleCallableStatement是抽象类,继承了CallableStatement
  
140             //不强转没有getCursor()方法...
  
141             rest = ((OracleCallableStatement)call).getCursor(2);
  
142             while(rest.next()){
  
143                 String name = rest.getString("ename");
  
144                 double sal = rest.getDouble("sal");
  
145                 System.out.println(name+"\t"+sal);
  
146             }
  
147         }catch (Exception e) {
  
148             e.printStackTrace();
  
149         }finally{
  
150             JDBCUtils.release(conn, call, rest);//上面打开了光标,再这个地方关闭结果集rest,也就关闭了光标
  
151         }
  
152     }
  
153 }

运维网声明 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.iyunv.com/thread-422981-1-1.html 上篇帖子: oracle查询中文数据出现乱码 下篇帖子: (转)linux自动备份oracle数据库并上传到备份服务器 脚本实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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