(本文章内容仅在windows10下经测试能够运行,不能保证其他环境下的可靠性)
目录
调用存储过程
原理:使用preparedStatement接口的子接口CallableStatement接口获取执行sql语句的对象,依据jdk文档给定的sql语句格式调用存储过程,
具体格式如下:
{call [(,, ...)]}
预编译的存储过程代码如下:
create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number)
as
sal number(10);
comm number(10);
begin
select sal,nvl(comm,0) into sal,comm from emp where empno =eno;
yearsal := sal * 12 +comm;
end;
调用该存储过程的java代码所需的sql语句如下:
String sql = "{call p_yearsal(?,?)}";
然后需要对sql语句的存储过程参数的占位符赋值,
输入型参数使用setObject(int parameterIndex,Object o)方法赋值;输出型参数使用registerOutParamter(int parametrIndex,int type)方法注册,第二参数是OracleTypes对象所定义的常量。
使用getObject(int parameterInex)方法获取输出型参数的值
示例java代码如下:
/*** 使用java调用存储过程,
* {call [(,, ...)]} 调用存储过程的格式*/@Testpublic void testProcedure() throwsSQLException {//获得连接
connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "o_user1", "p123456");//准备sql语句
String sql = "{call p_yearsal(?,?)}";//获取执行sql语句的对象
CallableStatement pstm =connection.prepareCall(sql);//设置输入型参数使用setObject(parameterIndex,o)方法,也可具体更加类型调用其他set方法
pstm.setInt(1, 7788);//设置输出型参数使用registerOutParameter(parameterIndex,int)方法
pstm.registerOutParameter(2, OracleTypes.NUMBER);//执行sql语句
pstm.execute();
System.out.println(pstm.getObject(2));//释放资源
pstm.close();
}
上面代码加载驱动和释放资源部分代码已使用@Before和@After注解所使用的方法完成。
调用存储函数
原理:使用preparedStatement接口的子接口CallableStatement接口获取执行sql语句的对象,依据jdk文档给定的sql语句格式调用存储函数,
具体格式如下:
{?= call [(,, ...)]}
预编译的存储函数代码如下:
create or replace function f_yearsal(eno emp.empno%type) returnnumber
is
s number(10);
begin
select sal* 12 + nvl(comm,0) into s from emp where empno =eno;returns;
end;
调用该存储函数的java代码所需的sql语句如下:
String sql = "{? = call f_yearsal(?)}";
然后需要对sql语句的存储函数参数和返回值的占位符赋值,
输入型参数使用setObject(int parameterIndex,Object o)方法赋值;输出型参数和返回值使用registerOutParamter(int parametrIndex,int type)方法注册,第二参数是OracleTypes对象所定义的常量。
使用getObject(int parameterInex)方法获取输出型参数和存储函数返回值的值
示例java代码如下:
/*** java调用存储函数
* {?= call [(,, ...)]} 调用存储函数的格式*/@Testpublic void testFunction() throwsSQLException {//获得连接
connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "o_user1", "p123456");//准备sql语句
String sql = "{? = call f_yearsal(?)}";//获取执行sql语句的对象
CallableStatement pstm =connection.prepareCall(sql);//设置输入型参数使用setObject(parameterIndex,o)方法,也可具体更加类型调用其他set方法
pstm.setInt(2, 7788);//设置输出型参数使用registerOutParameter(parameterIndex,int)方法
pstm.registerOutParameter(1, OracleTypes.NUMBER);//执行sql语句
pstm.execute();
System.out.println(pstm.getObject(1));//释放资源
pstm.close();
}
上面代码加载驱动和释放资源部分代码已使用@Before和@After注解所使用的方法完成。