(本文章内容仅在windows10下经测试能够运行,不能保证其他环境下的可靠性)
目录
调用存储过程
原理:使用preparedStatement接口的子接口CallableStatement接口获取执行sql语句的对象,依据jdk文档给定的sql语句格式调用存储过程,
具体格式如下:
{call <procedure-name>[(<arg1>,<arg2>, ...)]}
预编译的存储过程代码如下:
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 <procedure-name>[(<arg1>,<arg2>, ...)]} 调用存储过程的格式 */ @Test public void testProcedure() throws SQLException { //获得连接 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 <procedure-name>[(<arg1>,<arg2>, ...)]}
预编译的存储函数代码如下:
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;
调用该存储函数的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 <procedure-name>[(<arg1>,<arg2>, ...)]} 调用存储函数的格式 */ @Test public void testFunction() throws SQLException { //获得连接 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注解所使用的方法完成。