上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数
1、在应用程序中调用我们的存储过程
创建一个简单的Java工程,如:TestOracle,在项目中新建lib文件夹,并拷贝ojdbc14.jar,添加到系统路径中,目录结构如下:
在项目中创建一个用于连接数据库以及与数据库执行交流的工具类JDBCUtils.java
package demo.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JDBCUtils {private static String driver="oracle.jdbc.OracleDriver";private static String url="jdbc:oracle:thin:@localhost:1521:orcl";private static String user="scott";private static String password="scott";//注册数据库驱动static {try {Class.forName(driver);//DriverManager.registerDriver(driver);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}//获取数据库连接public static Connection getConnection() {try {return DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return null;}//释放数据库资源public static void release(Connection conn,Statement st,ResultSet rs) {if(rs!=null) {try {rs.close();} catch (Exception e) {e.printStackTrace();}finally {rs=null;}}if(st!=null) {try {st.close();} catch (Exception e) {e.printStackTrace();}finally {st=null;}}if(conn!=null) {try {conn.close();} catch (Exception e) {e.printStackTrace();}finally {conn=null;}}}}
创建我们的测试包,在包中创建我们的测试类TestProcedure.java
package demo.oracle;import java.sql.CallableStatement;import java.sql.Connection;import org.junit.Test;import demo.utils.JDBCUtils;import oracle.jdbc.internal.OracleTypes;public class TestProcedure {/*** create or replace PROCEDURE queryempinform(eno in number,pename out varchar2,psal out number,pjob out varchar2)*/@Testpublic void testProcedure() {//{call <procedure-name>[(<arg1>,<arg2>,...)]}String sql="{call queryempinform(?,?,?,?)}";Connection conn=null;CallableStatement call=null;try {//得到一个连接conn=JDBCUtils.getConnection();//通过连接创建出statmentcall=conn.prepareCall(sql);//对in参数进行赋值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, call, null);}}}
启动我们的单元测试,运行结果:
2、在应用程序中调用我们的存储函数
在测试包中创建我们的测试类TestFunction.java
package demo.oracle;import java.sql.CallableStatement;import java.sql.Connection;import org.junit.Test;import demo.utils.JDBCUtils;import oracle.jdbc.internal.OracleTypes;public class TestFunction {/*** create or replace FUNCTION queryempincome(eno in number)return number*/@Testpublic void testFunction() {//{?=call <procedure-name>[(<arg1>,<arg2>,...)]}String sql="{?=call queryempincome(?)}";Connection conn=null;CallableStatement call=null;try {//得到数据库连接conn=JDBCUtils.getConnection();//基于连接得到statmentcall=conn.prepareCall(sql);//对in参数赋值call.setInt(2, 7839);//对out参数进行申明call.registerOutParameter(1, OracleTypes.NUMBER);//执行我们存储函数的调用call.execute();//取得我们的结果double income=call.getDouble(1);System.out.println("该员工的年收入是:"+income);} catch (Exception e) {e.printStackTrace();}finally {JDBCUtils.release(conn, call, null);}}}
启动我们的单元测试,运行结果: