1.創建存儲過程
create or replace procedure query(eno in number,pename out VARCHAR2,psal out number,pjob out
varchar2)
as
begin
--得到該員工的姓名和職位
select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
2.創建存儲函數
create or replace function nianshouru(eno in number)
return number
as
--定義變量保存員工的薪水和獎金
psal emp.sal%type;
pcomm emp.comm%type;
begin
--得到改員工的獎金和月薪
select sal,comm into psal,pcomm from emp where empno=eno;
--直接返回年收入
return psal*12+nvl(pcomm,0);
end;
3.創建java工程,并且導入連接數據庫的jar包
image.png
4.創建JDBCUtils工具類
package com.xdl.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private static String driver="oracle.jdbc.OracleDriver";
private static String url="jdbc:oracle:thin:@localhost:1521:mldn";
private static String username="scott";
private static String password ="tiger";
//注冊驅動
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnecction(){
try {
return DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//釋放數據庫
public static void release(Connection conn,Statement st,ResultSet rs) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
rs=null;
}
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
st=null;
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
conn=null;
}
}
}
}
5.創建調用存儲過程的測試類
package com.xdl.oracle;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
import com.xdl.utils.JDBCUtils;
import oracle.jdbc.OracleTypes;
/**
* 調用存儲過程
* @author Administrator
*
*/
public class Procedure {
@Test
public void testProcedure(){
String sql="{call query(?,?,?,?)}" ;
Connection conn=null;
Statement st=null;
ResultSet rs=null;
CallableStatement call=null;
try {
//得到一個連接
conn=JDBCUtils.getConnecction();
//通過連接創建出statement
call=conn.prepareCall(sql);
//對于輸入參數需要賦值
call.setInt(1, 7839);//第一個問號
//對于out輸出參數,申明
call.registerOutParameter(2, OracleTypes.VARCHAR);//第二個問號
call.registerOutParameter(3, OracleTypes.NUMBER);
call.registerOutParameter(4, 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, st, rs);
}
}
}
6.創建調用存儲函數的測試類Function
package com.xdl.oracle;
import java.sql.CallableStatement;
import java.sql.Connection;
import org.junit.Test;
import com.xdl.utils.JDBCUtils;
import oracle.jdbc.OracleTypes;
/**
* 調用存儲函數
* @author Administrator
*
*/
public class Function {
@Test
public void testFunction() {
String sql="{?=call nianshouru(?)}";//存儲函數的名字
Connection conn=null;
CallableStatement call=null;
try {
//得到數據庫連接
conn=JDBCUtils.getConnecction();
//基于連接獲取到statement
call=conn.prepareCall(sql);
//對于輸出參數,申明
call.registerOutParameter(1, OracleTypes.NUMBER);
//對于輸入參數,賦值
call.setInt(2, 7839);
//執行調用
call.execute();
//取出年收入的結果
double income=call.getDouble(1);
System.out.println(income);
}catch (Exception e) {
e.printStackTrace();
}finally {
//釋放資源
JDBCUtils.release(conn, call, null);
}
}
}