JDBC如何調用存儲過程


JDBC開發步驟:

  1. 導入驅動包 (ojdbc14.jar 該包自行百度下載)
  2. 注冊驅動
  3. 獲取連接
  4. 獲取執行SQL的statement
  5. 封裝參數
  6. 執行SQL
  7. 獲取結果
  8. 釋放資源
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
 
import org.junit.Test;
 
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
 
/*
  1.導入驅動包
  2.注冊驅動
  3.獲取連接
  4.獲取執行SQL的statement
  5.封裝參數
  6.執行SQL
  7.獲取結果
  8.釋放資源   
 */
public class TestProcedure {
 
    @Test
    /*
     create or replace procedure proc_gettotalsal(vempno in number,vtotalsal out number)
    is
           
    begin
      select sal*12 + nvl(comm,0) into vtotalsal from emp where empno = vempno;
    end;
     * */
    public void test1() throws Exception{
        //注冊驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取連接
        String url = "jdbc:oracle:thin:@192.168.80.100:1521:orcl";
        String username = "dakang";
        String password = "dakang";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.獲取執行SQL的statement.這是一個固定格式  proc_gettotalsal是一個存儲函數
        String sql = "{call proc_gettotalsal(?,?)}";
        CallableStatement state = conn.prepareCall(sql);
        //設置輸入參數
        state.setInt(1, 7788);//設置員工編號
        //注冊輸出參數類型
        state.registerOutParameter(2, OracleTypes.NUMBER);
        
        //4.執行statement
        state.execute();
        
        //5.獲取執行結果
        int totalsal = state.getInt(2);
        
        //輸出結果
        System.out.println("工資:"+ totalsal);
        
        //6.釋放資源
        state.close();
        conn.close();
    }
    
    //調用存儲函數
    /*
     create or replace function func_getsal(vempno number) return number
    is
      --聲明變量.保存年薪
      vtotalsal number;     
    begin
      select sal*12 + nvl(comm,0) into vtotalsal from emp where empno = vempno;
      return vtotalsal;
    end; 
     */
    @Test
    public void test2() throws Exception{
        //注冊驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取連接
        String url = "jdbc:oracle:thin:@192.168.80.100:1521:orcl";
        String username = "dakang";
        String password = "dakang";
        Connection conn = DriverManager.getConnection(url, username,password);
        //3.獲取執行SQL的statement
        String sql = " {?= call func_getsal(?)}";
        CallableStatement state = conn.prepareCall(sql);
        //4.封裝參數
        //注冊返回類型參數
        state.registerOutParameter(1, OracleTypes.NUMBER);
        //設置第二個參數
        state.setInt(2, 7788);
        //5.執行SQL
        state.execute();        
        //6.獲取結果
        int totalsal = state.getInt(1);
        System.out.println("年薪 :  ====" +totalsal);        
        //7.釋放資源
        state.close();
        conn.close();
    }
    
    /*
     create or replace procedure proc_getemps(vrows out sys_refcursor)
        is
        
        begin
          --1.打開游標, 給游標賦值
          open vrows for select * from emp;
        end;
     * */
    @Test
    public void test3() throws Exception{
        //注冊驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取連接
        String url = "jdbc:oracle:thin:@192.168.80.100:1521:orcl";
        String username = "dakang";
        String password = "dakang";
        Connection conn = DriverManager.getConnection(url, username,password);
        //3.獲取執行SQL的statement
        String sql = "{call proc_getemps(?)}";
        CallableStatement call = conn.prepareCall(sql);
        //接口  --- > 對象 -->實現類的名稱
        System.out.println(call.getClass().getName());
        OracleCallableStatement oracleCall = (OracleCallableStatement)call;
        //4.注冊輸出類型的參數
        call.registerOutParameter(1, OracleTypes.CURSOR);
        //5.執行SQL
        call.execute();
        //6.獲取執行的結果
        ResultSet resultSet = oracleCall.getCursor(1);
        while(resultSet.next()){
            int empno = resultSet.getInt("empno");
            String name = resultSet.getString("ename");
            System.out.println(empno +" ==== "+name);
        }
        
        //7.釋放資源
        resultSet.close();
        call.close();
        conn.close();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM