在平台中调用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") );
}