Java 調用 Oracle 的存儲過程

一、環境準備

需要的 jar 包:ojdbc14.jarojdbc6.jar
對應的 pom 配置:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
</properties>

    <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>10.2.0.4.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Oracle相關代碼:

--將scott用戶下的 emp 和 dept 表複製到當前用戶下
create table emp as select * from scott.emp;
create table dept as select * from scott.dept;

--創建存儲過程:計算年薪
create or replace procedure p_yearsal(eno emp.empno%type, yearsal out number)
is
   s number(10);
   c emp.comm%type;
begin
   select sal*12, nvl(comm, 0) into s, c from emp where empno = eno;
   yearsal := s+c;
end;
--測試存儲過程:查看號7369員工的年薪
declare
  yearsal number(10);
begin
  p_yearsal(7369, yearsal);
  dbms_output.put_line(yearsal);
end;

select * from emp;

--創建存儲函數:計算年薪
create or replace function f_yearsal(eno emp.empno%type) return number
is
  s number(10);     
begin
  select sal*12+nvl(comm, 0) into s from emp where empno = eno;
  return s;
end;

--測試存儲函數:查看號7369員工的年薪
--存儲函數在調用的時候,返回值需要接收。
declare
  s number(10); 
begin
  s := f_yearsal(7369);
  dbms_output.put_line(s);
end;

二、Oracle連接測試

@Test
    public void javaCallOracle() throws Exception {
        //1.加載數據庫驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.得到Connection連接
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.245.128:1521:orcl", "orcluser", "root");
        //3.定義sql語句
        String sql = "select * from emp where empno = ?";
        //4.得到預編譯的Statement對象
        PreparedStatement pstm = connection.prepareStatement(sql);
        //5.給參數賦值
        pstm.setObject(1, 7369);
        //6.執行數據庫查詢操作
        ResultSet rs = pstm.executeQuery();
        //7.輸出結果
        while(rs.next()){
            System.out.println(rs.getString("ename"));
        }
        //8.釋放資源
        rs.close();
        pstm.close();
        connection.close();
    }

三、Java 調用存儲過程

{call <procedure-name>[(<arg1>,<arg2>, ...)]} 調用存儲過程使用

 @Test
    public void javaCallProcedure() throws Exception {
        //1.加載數據庫驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.得到Connection連接
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.245.128:1521:orcl", "orcluser", "root");
        //3.得到預編譯的Statement對象
        CallableStatement pstm = connection.prepareCall("{call p_yearsal(?, ?)}");
        //4.給參數賦值,第二個參數是一個輸出類型的參數
        pstm.setObject(1, 7369);
        pstm.registerOutParameter(2, OracleTypes.NUMBER);
        //執行數據庫查詢操作
        pstm.execute();
        //輸出結果[第二個參數]
        System.out.println(pstm.getObject(2));
        //釋放資源
        pstm.close();
        connection.close();
    }

四、Java 調用存儲函數

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} 調用存儲函數使用

 	@Test
    public void javaCallFunction() throws Exception {
        //1.加載數據庫驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.得到Connection連接
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.245.128:1521:orcl", "orcluser", "root");
        //3.得到預編譯的Statement對象
        CallableStatement pstm = connection.prepareCall("{?= call f_yearsal(?)}");
        //4.給參數賦值,第1個參數是一個輸出類型的參數
        pstm.registerOutParameter(1, OracleTypes.NUMBER);
        pstm.setObject(2, 7369);
        //執行數據庫查詢操作
        pstm.execute();
        //輸出結果[第1個參數]
        System.out.println(pstm.getObject(1));
        //釋放資源
        pstm.close();
        connection.close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章