JAVA调用Oracle存储过程和函数详解数据库

连接数据库的工具类:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
 
public class JDBCUtils { 
 
    private static String driver = "oracle.jdbc.OracleDriver"; 
    private static String url = "jdbc:oracle:thin:@192.168.56.101:1521:orcl"; 
    private static String user = "scott"; 
    private static String password = "tiger"; 
     
    static{ 
        try { 
            Class.forName(driver); 
        } catch (ClassNotFoundException e) { 
            throw new ExceptionInInitializerError(e); 
        } 
    } 
 
    public static Connection getConnection(){ 
        try { 
            return DriverManager.getConnection(url, user, password); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 
   
    public static void release(Connection conn,Statement st,ResultSet rs){ 
        if(rs != null){ 
            try { 
                rs.close(); 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            }finally{ 
                rs = null;   //----> Java GC 
            } 
        } 
        if(st != null){ 
            try { 
                st.close(); 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            }finally{ 
                st = null; 
            } 
        } 
        if(conn != null){ 
            try { 
                conn.close(); 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            }finally{ 
                conn = null; 
            } 
        } 
    } 
}

调用存储过程和函数的JAVA代码:

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.ResultSet; 
 
import oracle.jdbc.OracleCallableStatement; 
import oracle.jdbc.OracleTypes; 
 
import org.junit.Test; 
 
import JDBCUtils; 
 
public class TestOracle { 
/* 
 * create or replace procedure queryEmpInfo(eno in number, 
                                         pename out varchar2, 
                                         psal   out number, 
                                         pjob   out varchar2) 
 */ 
    @Test 
    public void testProcedure(){ 
        //{call <procedure-name>[(<arg1>,<arg2>, ...)]} 
        String sql = "{call queryEmpInfo(?,?,?,?)}"; 
        Connection conn = null; 
        CallableStatement call = null; 
        try { 
            conn = JDBCUtils.getConnection(); 
            call = conn.prepareCall(sql); 
             
            //对于in参数,赋值 
            call.setInt(1, 7839); 
             
            //对于out参数,申明 
            call.registerOutParameter(2, OracleTypes.VARCHAR); 
            call.registerOutParameter(3, OracleTypes.NUMBER); 
            call.registerOutParameter(4, OracleTypes.VARCHAR); 
             
            //执行 
            call.execute(); 
             
            //取出结果 
            String name = call.getString(2); 
            double sal = call.getDouble(3); 
            String job = call.getString(4); 
            System.out.println(name+"/t"+sal+"/t"+job); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        }finally{ 
            JDBCUtils.release(conn, call, null); 
        } 
    } 
     
/* 
 * create or replace function queryEmpIncome(eno in number) 
return number 
 */ 
    @Test 
    public void testFunction(){ 
        //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} 
        String sql = "{?=call queryEmpIncome(?)}"; 
         
        Connection conn = null; 
        CallableStatement call = null; 
        try { 
            conn = JDBCUtils.getConnection(); 
            call = conn.prepareCall(sql); 
             
            //对于out参数,申明 
            call.registerOutParameter(1, OracleTypes.NUMBER); 
             
            //对于in参数,赋值 
            call.setInt(2, 7839); 
 
            //执行 
            call.execute(); 
             
            //取出结果 
            double income = call.getDouble(1); 
            System.out.println(income); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        }finally{ 
            JDBCUtils.release(conn, call, null); 
        }         
    } 
/* 
查询某个部门中所有员工的所有信息 
包头 
CREATE OR REPLACE PACKAGE MYPACKAGE AS  
  type empcursor is ref cursor; 
  procedure queryEmpList(dno in number,empList out empcursor); 
END MYPACKAGE; 
 
包体 
CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS 
  procedure queryEmpList(dno in number,empList out empcursor) AS 
  BEGIN 
    open empList for select * from emp where deptno=dno;   
  END queryEmpList; 
END MYPACKAGE; 
*/ 
    @Test 
    public void testCursor(){ 
        String sql = "{call MYPACKAGE.queryEmpList(?,?)}"; 
         
        Connection conn = null; 
        CallableStatement call = null; 
        ResultSet rs = null; 
        try { 
            conn = JDBCUtils.getConnection(); 
            call = conn.prepareCall(sql);     
             
            call.setInt(1, 20); 
            call.registerOutParameter(2, OracleTypes.CURSOR); 
            call.execute(); 
             
            //取出集合 
            rs = ((OracleCallableStatement)call).getCursor(2); 
            while(rs.next()){ 
                String name = rs.getString("ename"); 
                double sal = rs.getDouble("sal"); 
                System.out.println(name+"/t"+sal); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        }finally{ 
            JDBCUtils.release(conn, call, rs); 
        }     
    } 
}

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/4220.html

(0)
上一篇 2021年7月16日 21:42
下一篇 2021年7月16日 21:42

相关推荐

发表回复

登录后才能评论