JDBC调用存储过程的例子

Posted 码农_指尖改变世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC调用存储过程的例子相关的知识,希望对你有一定的参考价值。

下面是我学到了Oracle存储过程,在这里跟大家简单的分享一下利用JDBC调用存储过程的例子:

废话就不啰嗦,现在就直接上机代码。

首先我利用的是Oracle中默认的 scott 数据库里的 emp员工信息表作为本次的例子:

如果你的Oracle里没有 emp默认的员工表,需要创建类似以下的 emp表。

 

在PL/SQL中需要写以下的调用存储过程的代码:

 

 1 --在初次打开PL/SQL时要运行以下这行代码
 2 set serveroutput on
 3 
 4 --创建一个存储过程包
 5 CREATE OR REPLACE PACKAGE mypack
 6 IS
 7    TYPE mycursor IS REF CURSOR;
 8 END mypack;
 9 
10 --创建存储过程方法
11 CREATE OR REPLACE PROCEDURE findEmpJob(
12    myempno IN NUMBER,
13    myename OUT varchar2,
14    myjob OUT VARCHAR2,
15    other_name OUT mypack.mycursor
16 )
17 AS
18 BEGIN
19   SELECT ename,job INTO myename,myjob FROM emp WHERE empno=myempno;
20   OPEN other_name FOR
21   SELECT ename,job FROM emp WHERE empno IN(
22      SELECT empno FROM emp
23      MINUS
24      SELECT empno FROM emp WHERE empno=myempno
25   );
26 END;

 

先在eclipse中创建一个项目,比如JDBC_procedure。创建好后类似如下这样:

例子用的数据库是Oracle,需要导入的Oracle的jar包

 

一、创建一个JdbcUtil底层类用来连接数据库,代码如下:

 

 1 package testjdbc;
 2 
 3 import java.sql.*;
 4 
 5 public class JdbcUtil {
 6 
 7     private String driver = "oracle.jdbc.driver.OracleDriver";
 8     // 1521是主端口,也可能是其它端口去连接oracle数据库
 9     private String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
10     private String username = "scott";
11     private String password = "123456";
12     private Connection conn;
13     private CallableStatement cstmt;
14 
15     public String findEmpJob(int myempno) {
16         // 加载驱动
17         try {
18             Class.forName(driver);
19         } catch (Exception e) {
20             e.printStackTrace();
21             throw new RuntimeException("oracle驱动注册失败");
22         }
23         // 获取一个连接
24         try {
25             conn = DriverManager.getConnection(url, username, password);
26         } catch (Exception e) {
27             e.printStackTrace();
28             throw new RuntimeException("oracle连接获取失败");
29         }
30         
31         //findEmpJob(1.通过员工号返回ename和job  2.返回其他的员工信息)
32         String sql = "{call findEmpJob(?,?,?,?)}";
33         try {
34             cstmt = conn.prepareCall(sql);
35             //hibernate从0开始,jdbc从1开始
36             cstmt.setInt(1,myempno);//in值
37             cstmt.registerOutParameter(2,Types.VARCHAR);//out值
38             cstmt.registerOutParameter(3,Types.VARCHAR);//out值
39             //注册输出游标
40             cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);
41             //执行调用存储过程
42             cstmt.execute();
43             
44             
45             String ename = cstmt.getString(2);
46             String job = cstmt.getString(3);
47             ResultSet rs = (ResultSet) cstmt.getObject(4);
48 
49             //简单测验一下在控制台输出
50             System.out.println("员工编号:"+myempno);
51             System.out.println(ename+"的工作是:" + job);
52             System.out.println("\\n"+"其他员工信息如下:");
53             //遍历输出其他员工信息
54             while(rs.next()){
55                 System.out.println(    rs.getString("ename") +"的工作是:"+ rs.getString("job"));
56             }
57             rs.close();
58             cstmt.close();
59             conn.close();
60             return job;
61         } catch (SQLException e) {
62             // TODO Auto-generated catch block
63             System.out.println("执行过程中异常:"+e.getMessage());
64         }
65         
66         return "";
67     }
68 }

 

二、创建一个servlet类 比如 Test.java

 1 package testjdbc;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 /**
11  * Servlet implementation class Test
12  */
13 @WebServlet("/Test")
14 public class Test extends HttpServlet {
15     private static final long serialVersionUID = 1L;
16        
17     /**
18      * @see HttpServlet#HttpServlet()
19      */
20     public Test() {
21         super();
22         // TODO Auto-generated constructor stub
23     }
24 
25     
26     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
27         // TODO Auto-generated method stub
28         int empno = Integer.parseInt( request.getParameter("empno") );
29         JdbcUtil ju = new JdbcUtil();
30         ju.findEmpJob(empno);
31     }
32 
33     
34     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35         // TODO Auto-generated method stub
36         doGet(request, response);
37     }
38 
39 }

 

三、在写一个jsp页面,例如:index.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>测试JDBC调用存储过程</title>
 8 </head>
 9 <body>
10 <form action="Test" method="post">
11 员工编号:<input name="empno" type="text">
12         <input type="submit">
13 
14 </form>
15 </body>
16 </html>

下面是运行项目的效果:在控制台中检验输出结果。

成功运行,并跳转到jsp页面

在控制台可以看到如下输出:

 

到这里利用JDBC调用Oracle的存储过程就介绍完了。

感谢大家的支持!

如需转载请注明出处:http://www.cnblogs.com/ZRJ-boke/p/6626851.html

 

以上是关于JDBC调用存储过程的例子的主要内容,如果未能解决你的问题,请参考以下文章

Java调用SQL Server的存储过程详解(转)

关于jdbc调用存储过程的问题

jdbc调用mysql存储过程实现代码带有输入和输出

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

JDBC调用存储过程,进参出参

通过 JDBC 调用 Sybase 存储过程时的空结果集