使用spring调用oracle 的存储过程procedure实践

平台中调用oracle 的存储过程procedure实例解析 中解析了平台使用spring调用oracle procedure的实例. 这里自己写一个简单的测试类.

1.获得datasource, 这里通过jdbc连接.见 java项目使用spring jdbc连接数据库

2. 分析知spring主要通过StoredProcedure(spring-jdbc.jar包中的 org.springframework.jdbc.object.StoredProcedure)类进行对procedure的调用.

 

而StoreProcedure为abstract, 不能实例化对象 ,所以需子类继承.并重写父类一些方法.

public class TestSpring extends StoredProcedure {

3.加载datasource,通过读源代码知 在构造方法中加载DataSource

public TestSpring(DataSource dataSource, String procedureName) {
		super(dataSource, procedureName);
	}	
 public TestSpring(DataSource dataSource, String procedureName, boolean isFunction) {

  super(dataSource, procedureName);
  super.setFunction(isFunction);
 }

 注:第二个构造方法, isFunction指所调用的是函数(Function)or存储过程(Procedure), 这里我以调用function为例.是有第二个构造方法

4.调用方法

所调用的存储过程为

function isUser(LOGIN_NAME in varchar2, PASSWORD in varchar2)
    return integer as
    vUserID integer;
  begin
    select ID
      into vUserID
      from Users
     where upper(LOGIN_ID) = upper(isUser.LOGIN_NAME)
       and PASSWORD = isUser.PASSWORD
       and STATUS in (1, 3);
  
    return vUserID;
  
  exception
    when NO_DATA_FOUND then
      return - 1;
  end;

 

5.声明 输入和输出 的参数和oracle 中定义的一致(用到org.springframework.jdbc.core.SqlParameter 和 org.springframework.jdbc.core.SqlOutParameter )  

 SqlParameter paramIn = new SqlParameter("LOGIN_NAME", OracleTypes.IVARCHAR);

sp.declareParameter(paramIn);

 

paramIn = new SqlParameter("PASSWORD", OracleTypes.VARCHAR);

sp.declareParameter(paramIn);

 

paramIn = new SqlOutParameter("vUserID", OracleTypes.INTEGER);  // SqlOutParameter是Sqlparameter的子类

sp.declareParameter(paramIn);

// 编译

sp.compile(); 

6. 加载输入和输出值 都以Map的形式进行加载

Map inParams =  new HashMap();

inParams.put("LOGIN_NAME", "***");

inParams.put("PASSWORD", "***");

 

7 ,执行调用

Map result = sp.execute(inParams);

结果处理:

Integer uid = (Integer) result.get("vUserID");

 

由于代码写的较乱, 只粘贴主要代码:

	DataSource ds;
	@Test
	public void getDatasource() throws SQLException{
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		 ds = (DataSource)ctx.getBean("dataSource");
		logger.info("datasource : " + ds);
	}

 

 

	public void testInvokeProcedure() throws SQLException{
		getDatasource();
		StoredProcedure sp = new TestSpring(ds, "UserPkg.isUser", true);
		SqlParameter param;
		//out parameter
		param = new SqlOutParameter("vUserID", OracleTypes.INTEGER);
		sp.declareParameter(param);
		//in parameter
		param = new SqlParameter("LOGIN_NAME", OracleTypes.VARCHAR);
		sp.declareParameter(param);
		
		param = new SqlParameter("PASSWORD", OracleTypes.VARCHAR);
		sp.declareParameter(param);
		
		sp.compile();

		Encryption enc = new Encryption("abn_admin", "000000" );
		String encPassword = enc.encrypt();
		logger.info("encPassword:  " +encPassword);
		
		Map inParams = new HashMap();
		inParams.put("LOGIN_NAME", "abn_admin");
		inParams.put("PASSWORD", encPassword);

		Map result = sp.execute(inParams );
		logger.info("message : " + (Integer)result.get("vUserID") );

	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值