欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-06 12:33:10
上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1、在应用程序中调用我们的存储过程 创建一个简单的Java工程,如:TestOracle,在项目中新建lib文件夹,并拷贝ojdbc14.jar,添加到系 ......

上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数

1、在应用程序中调用我们的存储过程

      创建一个简单的Java工程,如:TestOracle,在项目中新建lib文件夹,并拷贝ojdbc14.jar,添加到系统路径中,目录结构如下:

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

      在项目中创建一个用于连接数据库以及与数据库执行交流的工具类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);
		}
	}
}

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

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

 

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);
		}
	}
}

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

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