• 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("
    "+"其他员工信息如下:");
    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

  • 相关阅读:
    mysql总结1
    shell 获取结果中的第n列,第n行
    automake中Makefile.am和configure.ac的格式及编译过程
    安卓常见错误解决方案
    kotlin 委托
    Kotlin 对象表达式和对象声明
    Kotlin 枚举类
    angular js自定义service的简单示例
    用angular.element实现jquery的一些功能的简单示例
    js判断中出现两个!!是什么意思?
  • 原文地址:https://www.cnblogs.com/ZRJ-boke/p/6626851.html
Copyright © 2020-2023  润新知