一、環境準備
需要的 jar 包:ojdbc14.jar
,ojdbc6.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();
}