JDBC開發步驟:
- 導入驅動包 (ojdbc14.jar 該包自行百度下載)
- 注冊驅動
- 獲取連接
- 獲取執行SQL的statement
- 封裝參數
- 執行SQL
- 獲取結果
- 釋放資源
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(); } }