1. 程式人生 > >Java中通過jdbc呼叫oracle儲存過程

Java中通過jdbc呼叫oracle儲存過程

Java呼叫Oracle儲存過程步驟主要分為三類:
(1)編寫Oracle儲存過程
(2)編寫資料庫獲取連線工具類
(3)編寫簡單應用呼叫儲存過程

1、Oracle中的儲存過程程式
1.在Oracle SQL Developer中建立儲存過程
在scott資料庫使用者中新建一個儲存過程(查詢某個員工姓名 月薪和職位):
create or replace procedure queryperson(empid in number,pname out varchar,psal out number,pjob out varchar)
as
begin
–得到該員工的姓名 月薪和職位
select ename,sal,job into pname,psal,pjob from emp where empno=empid;
end;
/
如下圖所示:
這裡寫圖片描述


2、連線資料庫工具類
建立JDBC連線Oracle資料庫
(1)我們在JDBC知識中知道:
JDBC程式設計六步曲
1.註冊資料庫驅動
1 獲取驅動物件
2 註冊驅動
2.獲取資料庫連線
3.獲取資料庫連線物件
4.執行SQL語句
1 若是執行DQL語句,則執行完後,順序執行步驟5的處理查詢結果集
2 若是執行DML語句,則不用執行步驟5,執行執行步驟6
5.處理查詢結果集
6.關閉資源

(2)在這裡,因為我們是要在第三個部分來呼叫Oracle資料庫儲存過程子程式,
所以,我們在JDBC程式設計六步曲中,第4步和第5步可以省略,相當於這兩個小節放在了第三部分呼叫儲存過程。
因此,此時我們的jdbc連線資料庫工具類步驟為:
1.註冊資料庫驅動
1 獲取驅動物件
2 註冊驅動
2.獲取資料庫連線
3.獲取資料庫連線物件
6.關閉資源

(3)在Java的開發工具MyEclipse中編寫連線資料庫工具類程式
package plsql01;

//import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
//獲取連線資料庫的四條資料資訊,即定義4個變數
private static String driver = “oracle.jdbc.OracleDriver”;
private static String url = “jdbc:oracle:thin:@localhost:1521:orcl”;
private static String user = “scott”;
private static String password = “tiger”;

//1.註冊資料庫驅動。通過靜態程式碼塊來編寫
static{
    try {
        //反射
        Class.forName(driver);
    } catch (ClassNotFoundException e) {
        throw new ExceptionInInitializerError(e);
    }
}

//2.獲取資料庫連線
public static Connection getConnection(){
    try {
        return DriverManager.getConnection(url,user,password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return  null;
}

//3.獲取資料庫連線物件
public static Statement getStatement() {
    Statement st = null;
    try {
      st = getConnection().createStatement();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return st;
}

//6.關閉資源
public static void release(Connection conn, Statement st, ResultSet rs){
    //關閉資料庫連線資源
    if(rs != null){
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //關閉資料庫連線物件資源
    if(st != null){
        try {
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //關閉查詢結果資源
    if(conn != null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

}

3、呼叫儲存過程
通過2中的JDBC連線資料庫工具類來呼叫已經編譯好的1中的儲存過程子程式
下面程式碼中匯入的幾個註釋的包是沒用到的,多此一舉。
package plsql01;

import java.sql.CallableStatement;
import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import org.junit.Test;
//import oracle.jdbc.OracleTypes;

public class TestProcedure {
// public void testProcedure(){ //應該換成主函式main()
public static void main(String[] args) {
Connection conn = null;
String sql = “{call queryperson(?,?,?,?)}”;
CallableStatement call = null;
try{
//得到一個連線
conn = JDBCUtils.getConnection();
//通過連線創建出statment
call = conn.prepareCall(sql);

        //對於in引數,賦值,取出員工編號為7934的員工資訊
        call.setInt(1,7934);

        //對於out引數,申明
        call.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
        call.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
        call.registerOutParameter(4, oracle.jdbc.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);
    }
}

}
執行,輸出結果:
MILLER 4100.0 CLERK
如下圖所示:
這裡寫圖片描述
4、上面專案程式出現的低階錯誤
(1)The import oracle cannot be resolved TestProcedure.java /PLSQL_012/src/plsql01 line 10 Java Problem
原因是:MyEclipse中進行資料庫相關開發,需要將資料庫的驅動與MyEclipse建立連線。如果用的是oracle,因此,需要先將oracle的(驅動)jar包匯入到MyEclipse,這樣才能進一步開發。
可以參考:https://www.cnblogs.com/tv151579/archive/2013/02/26/2933405.html
(2)執行專案時,MyEclipse中出現Press the Delete button to remove the selected configuration
原因是:沒有找到對應的main函式,所以不知道從哪裡開始執行。因此,發現了這個低階錯誤,將
public void testProcedure()換成主函式main()

5、將連線資料庫工具類和呼叫儲存過程程式編寫在一起的程式碼:
package plsql02;
import java.sql.*;

public class TestProcedure {
/**
* @oracle儲存過程jdbc呼叫
*/
public static void main(String[] args) {
//1、定義變數
String driverClass = “oracle.jdbc.OracleDriver”;
String url = “jdbc:oracle:thin:@localhost:1521:orcl”;
String user = “scott”;
String password = “tiger”;
try{
Class.forName(driverClass);
//2、獲取連線物件
Connection connection = DriverManager.getConnection(url, user, password);
//3、建立執行儲存過程的語句物件
String sql = “{call queryperson(?,?,?,?)}”;
CallableStatement call = connection.prepareCall(sql);
//4、設定引數
call.setInt(1,7934);
call.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
call.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
call.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
//5、執行儲存過程
call.execute();
//6、獲取資料並輸出結果
String name = call.getString(2);double sal = call.getDouble(3);
String job = call.getString(4);
System.out.println(“姓名:”+”\t”+”員工工資:”+”\t”+”員工職位:”);
System.out.println(name+”\t”+sal+”\t”+job);
//7、釋放資源
}catch(Exception e){
e.printStackTrace();
}
}
}
輸出結果:
姓名: 員工工資: 員工職位:
MILLER 4100.0 CLERK
如下圖所示:
這裡寫圖片描述
本篇博文借鑑了以下大神的部落格,感謝大神。
參考:
http://www.jb51.net/article/106099.htm
https://blog.csdn.net/yczz/article/details/46892455
https://www.2cto.com/database/201710/689989.html