JDBC调用Oracle函数详解

来源:互联网 发布:手写情书软件 编辑:程序博客网 时间:2024/06/18 12:29

--在数据库中创建一个函数

create or replace function getavgsal
(
       --在括号中定义入参
       v_dept in number
)
--定义返回值类型为number类型,注意参数和返回值的类型不用写具体长度
return number
--下面开始声明相关变量
is
--声明变量来接收查询的结果
v_avgsal number(10);
v_cursor sys_refcursor;
begin
--将查到的结果先放到游标当中
open v_cursor for  select avg(e.sal) avgsal from emp e where deptno = v_dept ;
--再将游标赋给上面声明的变量
fetch v_cursor into v_avgsal;
--关闭游标
close v_cursor;
--返回变量
return v_avgsal;


end;

****************************************函数创建结束*************************************************

package xxx

import java.sql.CallableStatement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.internal.OracleTypes;


public class Test {
//设置数据库的链接参数;
String user = "c##scott";
String pwd = "tiger";
String driver = "oracle.jdbc.OracleDriver";
String addr = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";

//获取connection对象;
public Connection getCon(){
Connection con = null;
try {
Class.forName(driver);
System.out.println("驱动加载成功");
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败");
}
try {
con = DriverManager.getConnection(addr, user, pwd);
System.out.println("数据库连接成功");
} catch (SQLException e) {
System.out.println("数据库连接失败");
}
return con;
}

//此处调用oracle的函数;
public void getRS() {
//首先获取到连接对象;
Connection con = getCon();
try {
//使用prepareCall方法来调用数据库函数,格式为{? = call 函数名(?,?)},
//第一个?为返回的数据,该方法返回一个CallableStatement的对象;
CallableStatement prepareCall = con.prepareCall("{?  =call getavgsal(?)}");
//下面注册上面声明的?的类型,括号内的两个参数,第一个是?的顺序,第二个是数据库中规定的类型;
prepareCall.registerOutParameter(1,OracleTypes.NUMBER);
prepareCall.registerOutParameter(2,OracleTypes.NUMBER);
//为该方法的参数赋值,查找deptno为20的部门人员的平均工资;
prepareCall.setInt(2, 20);
//执行函数;
prepareCall.execute();
//获取到对应的返回值;
int rs = prepareCall.getInt(1);
System.out.println(rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
@org.junit.Test
public void tets() {
getRS();
}
}
原创粉丝点击