日期:2014-05-16  浏览次数:20481 次

使用Spring的JdbcTemplate调用Oracle的存储过程

Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,但可惜只能用于jdk1.5的环境,无法再jdk1.4环境下使用,而JdbcTemplate则完全适用于jdk1.4下的环境,下面列出使用JdbcTemplate调用Oracle存储过程的一些方法:

一) 无返回值的存储过程调用
存储过程: ?
CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,PARAM2 IN VARCHAR2) AS
BEGIN
?? ?INSERT INTO TESTTABLE (ID,NAME) VALUES (PARAM1, PARAM2);
END TESTPRO;

Java代码: ??
package com.dragon.test;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateTest {
? private JdbcTemplate jdbcTemplate;
? public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
? this.jdbcTemplate = jdbcTemplate;
? }
? public void test(){
? ?? this.jdbcTemplate.execute("call testpro('p1','p2')");
? }
}
注:存储过程TESTPRO中用到了表TESTTABLE(ID, NAME),需事先建好.

二)有返回值的存储过程(非结果集) ??
存储过程: ??
CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,PARAM2 OUT VARCHAR2) AS ??
BEGIN ? ?
?? ?SELECT INTO PARAM2 FROM TESTTABLE WHERE ID= PARAM1; ? ?
END TESTPRO;

Java代码:
public void test() {
? String param2Value = (String) jdbcTemplate.execute(
? ?? new CallableStatementCreator() {
? ?? ?? public CallableStatement createCallableStatement(Connection con) throws SQLException {
? ?? ?? ?? String storedProc = "{call testpro(?,?)}";// 调用的sql
? ?? ?? ?? CallableStatement cs = con.prepareCall(storedProc);
? ?? ?? ?? cs.setString(1, "p1");// 设置输入参数的值
? ?? ?? ?? cs.registerOutParameter(2, OracleTypes.VARCHAR);// 注册输出参数的类型
? ?? ?? ??