zoukankan      html  css  js  c++  java
  • jdbc调用 oracle 存储过程操作

    创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,【返回多个值,演示out的用法】
    当返回2个或多个值,必须使用out符号
    当返回1个值,就无需out符号

    create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return number
    as
    psal emp.sal%type;
    begin
    select ename,sal into pename,psal from emp where empno=pempno;
    --返回月薪
    return psal;
    end;
    /

    ---------------------------------------相互转值

    以下为测试调用

    declare
    psal emp.sal%type;
    pename emp.ename%type;
    begin
    psal := findEmpNameAndSal(7902,pename);
    dbms_output.put_line('7902号员工的姓名'||pename||',薪水是'||psal);
    end;
    /

    存储过程

    创建有参存储过程findEmpNameAndSalAndJob(编号),查询7902号员工的的姓名,职位,月薪【演示out的用法】
    create or replace procedure
    findEmpNameAndSalAndJob(pempno in number,pename out varchar2,pjob out varchar2,psal out number)
    as
    begin
    select ename,job,sal into pename,pjob,psal from emp where empno=pempno;
    end;
    /

    以下测试调用

    declare
    pename emp.ename%type;
    pjob emp.job%type;
    psal emp.sal%type;
    begin
    findEmpNameAndSalAndJob(7902,pename,pjob,psal);
    dbms_output.put_line('7902号员工的姓名是'||pename||':'||pjob||':'||psal);
    end;
    /

    JDBC连接oracle

    JdbcUtil.java 
     1 package cn.itcast.web.oracle.util;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 
     8 public class JdbcUtil {
     9     private static String driver = "oracle.jdbc.driver.OracleDriver";
    10     //1521是主端口,也可能是其它端口去连接oracle数据库
    11     private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    12     private static String username = "scott";
    13     private static String password = "friends";
    14     private static Connection conn;
    15     private static Statement stmt;
    16     private static ResultSet rs;
    17     //注册数据库驱动
    18     static{
    19         try {
    20             Class.forName(driver);
    21         } catch (Exception e) {
    22             e.printStackTrace();
    23             throw new RuntimeException("oracle驱动注册失败");
    24         }
    25     }
    26     //获取数据库连接
    27     public static Connection getConnection(){
    28         Connection conn = null;
    29         try {
    30             conn = DriverManager.getConnection(url,username,password);
    31         } catch (Exception e) {
    32             e.printStackTrace();
    33             throw new RuntimeException("oracle连接获取失败");
    34         }
    35         return conn;
    36     }
    37     //关闭连接对象
    38         public static void close(Connection conn){
    39             if(conn!=null){
    40                 try {
    41                     conn.close();
    42                 } catch (Exception e) {
    43                     e.printStackTrace();
    44                     throw new RuntimeException("oracle连接关闭失败");
    45                 }
    46             }
    47         }
    48         public static void close(Statement stmt){
    49             if(stmt!=null){
    50                 try {
    51                     stmt.close();
    52                 } catch (Exception e) {
    53                     e.printStackTrace();
    54                     throw new RuntimeException("oracle连接关闭失败");
    55                 }
    56             }
    57         }
    58         public static void close(ResultSet rs){
    59             if(rs!=null){
    60                 try {
    61                     rs.close();
    62                 } catch (Exception e) {
    63                     e.printStackTrace();
    64                     throw new RuntimeException("oracle连接关闭失败");
    65                 }
    66             }
    67         }
    68 }

    测试

    1     @Test
    2     public void testConnection()
    3     {
    4         Connection conn=JdbcUtil.getConnection();
    5         System.out.println(conn==null?"no":"yes");
    6     }
    7     

    测试存储过程

     1 //Java调用存储过程和函数
     2 public class OracleDao {
     3     //调用存储过程
     4     @Test
     5     public void callProcedure() throws Exception{
     6         Connection conn = JdbcUtil.getConnection();
     7         //第一参数:in  编号 7902
     8         //第二参数:out 姓名
     9         //第三参数:out 工作
    10         //第四参数:out 薪水
    11         String sql = "call findEmpNameAndSalAndJob(?,?,?,?)";
    12         //创建专用于调用过程或函数的对象
    13         CallableStatement cstmt = conn.prepareCall(sql);
    14         //为?占位符设置in、out值
    15         //hibernate从0开始,jdbc从1开始
    16         cstmt.setInt(1,7902);//in值
    17         cstmt.registerOutParameter(2,Types.VARCHAR);//out值
    18         cstmt.registerOutParameter(3,Types.VARCHAR);//out值
    19         cstmt.registerOutParameter(4,Types.INTEGER);//out值
    20         cstmt.execute();//抛行调用存储过程
    21         //依次接收3个返回值
    22         String ename = cstmt.getString(2);
    23         String job = cstmt.getString(3);
    24         Integer sal = cstmt.getInt(4);
    25         //显示
    26         System.out.println(ename+"的工作是:" + job + ",它是薪水是" + sal);
    27         //关闭连接对象
    28         JdbcUtil.close(cstmt);
    29         JdbcUtil.close(conn);
    30     }
    31     //调用存储函数
    32     @Test
    33     public void callFunction() throws Exception{
    34         Connection conn = JdbcUtil.getConnection();
    35         //参数一:in  编号 数值型
    36         //参数二:out 姓名 字符串型
    37         //返回值:out 薪水 数值型
    38         String sql = "{? = call findEmpNameAndSal(?,?)}";
    39         CallableStatement cstmt = conn.prepareCall(sql);
    40         cstmt.setInt(2,7788);//in
    41         cstmt.registerOutParameter(3,Types.VARCHAR);//out
    42         cstmt.registerOutParameter(1,Types.INTEGER);//返回值
    43         cstmt.execute();//执行调用存储函数
    44         String ename = cstmt.getString(3);
    45         Integer sal = cstmt.getInt(1);
    46         System.out.println(ename+"的薪水是"+sal);
    47         //关闭连接对象
    48         JdbcUtil.close(cstmt);
    49         JdbcUtil.close(conn);
    50     }
    51 }
  • 相关阅读:
    当年的笔记_apache配置虚拟主机
    sqlserver 调优(三)
    bat命令自用其(一)
    Always On主辅延迟相关描述
    sqlserver中常用的windows命令行的操作
    mysql复制以及一主多从等常见集群概述
    sqlserver 调优(二)
    sqlserver 获取实例上用户数据库的数据字典
    sqlserver事务隔离小结
    mysql 慢查询的小结
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3793430.html
Copyright © 2011-2022 走看看