编程开发之–Oracle数据库–存储过程和存储函数(2)

上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在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)*/
	@Test
	public void testProcedure() {
		//{call <procedure-name>[(<arg1>,<arg2>,...)]}
		String sql="{call queryempinform(?,?,?,?)}";
		Connection conn=null;
		CallableStatement call=null;
		try {
			//得到一个连接
			conn=JDBCUtils.getConnection();
            //通过连接创建出statment
			call=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
     */
	@Test
	public void testFunction() {
		//{?=call <procedure-name>[(<arg1>,<arg2>,...)]}
		String sql="{?=call queryempincome(?)}";
		
		Connection conn=null;
		CallableStatement call=null;
		try {
			//得到数据库连接
			conn=JDBCUtils.getConnection();
			
			//基于连接得到statment
			call=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);
		}
	}
}

  启动我们的单元测试,运行结果:

 

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐