spring中JdbcTemplate操作oracle的存储过程实例代码

目录
  • 场景:
  • 功能:
  • 1.JdbcTemplate调用存储过程(Procedure)不带返回值
    • 1.1存储过程
    • 1.2代码
  • 2.JdbcTemplate调用存储过程(Procedure)带返回值但值不是集合类型
    • 2.1存储过程
    • 2.2代码
  • 3.JdbcTemplate调用存储过程(Procedure)带返回值且值集合类型
    • 3.1存储过程
    • 3.2代码
  • 4.附本例使用建表语句
  • 5.附本例使用完整测试代码
  • 总结

场景:

使用java代码调用oracle的存储过程,本例使用JdbcTemplate模板类操作.

功能:

方便后续查阅.

1.JdbcTemplate调用存储过程(Procedure)不带返回值

1.1存储过程

CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS4(TASK_ID IN NUMBER) IS
BEGIN
  INSERT INTO F_LOG_INFO
    (TASK_ID,
     BEGIN_TIME,
     END_TIME,
     FLAG,
     FAIL_INFO,
     DATA_COUNT,
     TABLE_NAME)
  VALUES
    (TASK_ID, SYSDATE - 1, SYSDATE, '999', '999', 999, 'TABLE_NAME2019');
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END PRO_QUERY_INFO_ARGS4;

1.2代码

public static void doProcedures() {
	String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}";
	jdbcTemplate.execute(procedures);
}

2.JdbcTemplate调用存储过程(Procedure)带返回值但值不是集合类型

2.1存储过程

CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS3(ARGS     IN VARCHAR2,
                                                 RTNINFO  OUT VARCHAR2,
                                                 ERRORMSG OUT VARCHAR2,
                                                 FAILINFO OUT VARCHAR2) IS
BEGIN
  ERRORMSG := '';
  RTNINFO  := '你输入的ARGS=' || ARGS;
  SELECT FAIL_INFO INTO FAILINFO FROM F_LOG_INFO where TASK_ID = 1;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ERRORMSG := 'PRO_QUERY_INFO_ARG抛出异常: ' || SQLERRM;
END PRO_QUERY_INFO_ARGS3;

2.2代码

public static void getProceduresResult() {
  String tt2 = (String) jdbcTemplate.execute(
  new CallableStatementCreator() {
  	public CallableStatement createCallableStatement(
  	  	Connection con) throws SQLException {
  	  String procedures = "{call PRO_QUERY_INFO_ARGS3 (?,?,?,?)}";
  	  CallableStatement cs = con.prepareCall(procedures);
  	  /** 设置输入参数的值 */
  	  cs.setString(1, "代码调用");
  	  /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
  	  cs.registerOutParameter(2, OracleTypes.VARCHAR);
  	  cs.registerOutParameter(3, OracleTypes.VARCHAR);
  	  cs.registerOutParameter(4, OracleTypes.VARCHAR);
  	  return cs;
  	}
  }, new CallableStatementCallback() {
  	public Object doInCallableStatement(CallableStatement st)
  	  	throws SQLException, DataAccessException {
  	  st.execute();
  	  /** 依次获取存储过程参数值,按照顺序存储过程定义参数的顺序获取 */
  	  Object tt2 = st.getObject(2);
  	  Object tt3 = st.getObject(3);
  	  Object tt4 = st.getObject(4);
  	  return tt2;
  	}
	});
}

3.JdbcTemplate调用存储过程(Procedure)带返回值且值集合类型

3.1存储过程

CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS2(ERRORMSG OUT VARCHAR2,
                                                 CURINFO  OUT SYS_REFCURSOR) IS
BEGIN
  ERRORMSG := '';
  OPEN CURINFO FOR
    SELECT FAIL_INFO, TABLE_NAME FROM F_LOG_INFO;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ERRORMSG := 'PRO_QUERY_INFO_ARG2抛出异常: ' || SQLERRM;
END PRO_QUERY_INFO_ARGS2;

3.2代码

public static List getProceduresResultList() {

 List resultList = (List) jdbcTemplate.execute(
  new CallableStatementCreator() {
  	public CallableStatement createCallableStatement(
  	  	Connection conn) throws SQLException {
  	  /** 调用指定存储过程 */
  	  String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }";
  	  CallableStatement statement = conn
  	  		.prepareCall(procedures);
  	  /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
  	  statement.registerOutParameter(1, OracleTypes.VARCHAR);
  	  /** 注册输出参数的类型-此处集合为oracle的游标类型 */
  	  statement.registerOutParameter(2, OracleTypes.CURSOR);
  	  return statement;
  	}
  }, new CallableStatementCallback() {
  	public Object doInCallableStatement(
  	  	CallableStatement statement) throws SQLException,
  	  	DataAccessException {
  	  List resultsMap = new ArrayList();
  	  statement.execute();
  	  /** 获取游标结果集-此处2是存储过程参数顺序 */
  	  ResultSet resultSet = (ResultSet) statement
  	  		.getObject(2);
  	  /** 转换每行的返回值到Map中 */
  	  while (resultSet.next()) {
  	  	Map rowMap = new HashMap();
  	  	rowMap.put("FAIL_INFO",
  	  			resultSet.getObject("FAIL_INFO"));
  	  	rowMap.put("TABLE_NAME",
  	  			resultSet.getObject("TABLE_NAME"));
  	  	resultsMap.add(rowMap);
  	  }
  	  resultSet.close();
  	  return resultsMap;
  	}
  });
 return resultList;
}

4.附本例使用建表语句

create table F_LOG_INFO
(
  task_id    NUMBER(16) not null,
  begin_time DATE,
  end_time   DATE,
  flag       VARCHAR2(8),
  fail_info  VARCHAR2(512),
  data_count NUMBER(16),
  table_name VARCHAR2(256)
);
alter table F_LOG_INFO
  add constraint PK_F_LOG_INFO primary key (TASK_ID);

5.附本例使用完整测试代码

public class TestProcedures {
public static JdbcTemplate jdbcTemplate = getJdbcTemplate();
public static void main(String[] args) {
 System.out.println("测试开始......");
 // getProceduresResult();
 doProcedures();
 List result = getProceduresResultList();
 for (int i = 0; i < result.size(); i++) {
  Map rowMap = (Map) result.get(i);
  String id = rowMap.get("FAIL_INFO").toString();
  String name = rowMap.get("TABLE_NAME").toString();
  System.out.println("FAIL_INFO=" + id + ";TABLE_NAME=" + name);
 }
 System.out.println("测试结束......");
}
/**
 * 执行存储过程无返回值
 * */
public static void doProcedures() {
	String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}";
	jdbcTemplate.execute(procedures);
}
/**
 * 调用存储过程-返回值是非集合
 * */
public static void getProceduresResult() {
 String tt2 = (String) jdbcTemplate.execute(
  new CallableStatementCreator() {
  	public CallableStatement createCallableStatement(
  	 	Connection con) throws SQLException {
  	 String procedures = "{call PRO_QUERY_INFO_ARGS3 (?,?,?,?)}";
  	 CallableStatement cs = con.prepareCall(procedures);
  	 /** 设置输入参数的值 */
  	 cs.setString(1, "代码调用");
  	 /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
  	 cs.registerOutParameter(2, OracleTypes.VARCHAR);
  	 cs.registerOutParameter(3, OracleTypes.VARCHAR);
  	 cs.registerOutParameter(4, OracleTypes.VARCHAR);
  	 return cs;
  	}
  }, new CallableStatementCallback() {
  	public Object doInCallableStatement(CallableStatement st)
  	 	throws SQLException, DataAccessException {
  	 st.execute();
  	 /** 依次获取存储过程参数值,按照顺序存储过程定义参数的顺序获取 */
  	 Object tt2 = st.getObject(2);
  	 Object tt3 = st.getObject(3);
  	 Object tt4 = st.getObject(4);
  	 return tt2;
  	}
  });
}
/**
 * 调用存储过程-返回值是List集合
 * */
public static List getProceduresResultList() {
  List resultList = (List) jdbcTemplate.execute(
   new CallableStatementCreator() {
   	public CallableStatement createCallableStatement(
   	 	Connection conn) throws SQLException {
   	 /** 调用指定存储过程 */
   	 String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }";
   	 CallableStatement statement = conn
   	 		.prepareCall(procedures);
   	 /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
   	 statement.registerOutParameter(1, OracleTypes.VARCHAR);
   	 /** 注册输出参数的类型-此处集合为oracle的游标类型 */
   	 statement.registerOutParameter(2, OracleTypes.CURSOR);
   	 return statement;
   	}
   }, new CallableStatementCallback() {
   	public Object doInCallableStatement(
   	 	CallableStatement statement) throws SQLException,
   	 	DataAccessException {
   	 List resultsMap = new ArrayList();
   	 statement.execute();
   	 /** 获取游标结果集-此处2是存储过程参数顺序 */
   	 ResultSet resultSet = (ResultSet) statement
   	 		.getObject(2);
   	 /** 转换每行的返回值到Map中 */
   	 while (resultSet.next()) {
   	 	Map rowMap = new HashMap();
   	 	rowMap.put("FAIL_INFO",
   	 			resultSet.getObject("FAIL_INFO"));
   	 	rowMap.put("TABLE_NAME",
   	 			resultSet.getObject("TABLE_NAME"));
   	 	resultsMap.add(rowMap);
   	 }
   	 resultSet.close();
   	 return resultsMap;
   	}
   });
  return resultList;
}
/** 获取JdbcTemplate数据源 */
public static JdbcTemplate getJdbcTemplate() {
  DruidDataSource dataSource = new DruidDataSource();
  /**数据库连接信息*/
  String username = "demodb";
  String password = "123456";
  String jdbcUrl = "jdbc:oracle:thin:@127.0.0.1:1521/orcl";
  String driverName = "oracle.jdbc.OracleDriver";
  /** 设置数据源属性参数 */
  dataSource.setPassword(password);
  dataSource.setUrl(jdbcUrl);
  dataSource.setUsername(username);
  dataSource.setDriverClassName(driverName);
  /** 获取spring的JdbcTemplate*/
  JdbcTemplate jdbcTemplate = new JdbcTemplate();
  /** 设置数据源 */
  jdbcTemplate.setDataSource(dataSource);
  return jdbcTemplate;
}
}

以上,感谢.

总结

到此这篇关于spring中JdbcTemplate操作oracle的存储过程的文章就介绍到这了,更多相关JdbcTemplate操作oracle存储过程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java调用oracle分页存储过程示例

    1.分页类 复制代码 代码如下: package org.zh.basic; /** * 页面类 *  * @author keven *  */public class PageInfo { // 定义    private String p_tableName; // -表名    private String p_strWhere; // --查询条件    private String p_orderColumn; // --排序的列    private String p_orderS

  • Java下使用Oracle存储过程(详解)第1/3页

    任何转载,请尊重版权.(作者:iihero on csdn) 一.如何创建java存储过程? 通常有三种方法来创建java存储过程. 1. 使用oracle的sql语句来创建: e.g. 使用create or replace and compile java source named "<name>" as 后边跟上java源程序.要求类的方法必须是public static的,才能用于存储过程. 复制代码 代码如下: SQL> create or replace

  • java调用Oracle存储过程的方法实例

    1.测试添加数据的procedure 复制代码 代码如下: public void testProcedure() {        Connection con = getConnction(); // **1.测试添加数据的procedure          String procedure = "{call users_insert_proc(?,?,?,?) }"; CallableStatement cs = null;        try {             c

  • Java调用Oracle存储过程详解

    Java调用Oracle存储过程详解 步骤: 1.编写Oracle存储过程 2.编写数据库获取连接工具类 3.编写简单应用调用存储过程 实现: 1.Oracle存储过程: /*测试表*/ create table test( id varchar2(32), name varchar2(32) ); /*存储过程 插入数据*/ CREATE OR REPLACE PROCEDURE insert_procedure( PARA1 IN VARCHAR2, PARA2 IN VARCHAR2 )

  • spring中JdbcTemplate操作oracle的存储过程实例代码

    目录 场景: 功能: 1.JdbcTemplate调用存储过程(Procedure)不带返回值 1.1存储过程 1.2代码 2.JdbcTemplate调用存储过程(Procedure)带返回值但值不是集合类型 2.1存储过程 2.2代码 3.JdbcTemplate调用存储过程(Procedure)带返回值且值集合类型 3.1存储过程 3.2代码 4.附本例使用建表语句 5.附本例使用完整测试代码 总结 场景: 使用java代码调用oracle的存储过程,本例使用JdbcTemplate模板类

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • Spring 中jdbcTemplate 实现执行多条sql语句示例

    说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行: 很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里减去订单所需的钱数,即需要更新银行账户的表,同时需要更新淘宝订单的表将订单状态改为"已付款",这就需要先后执行多个sql(仅仅用于表达执行多的SQL的举例说明,具体淘宝如何实现并不是很清楚~~~~~); 但如果这中间出现电脑断网断电等问题,仅将我们银行账户的钱扣掉了,订单状态并没有改,那我

  • spring中jdbcTemplate.batchUpdate的几种使用情况

    目录 1,batchUpdate(String[] sqls) 2,batchUpdate(String sql,List <Object[]> parms) 3,适用于我的解决方案 在我做批量插入的过程中,由于数据库做了唯一约束,所以有些重复数据会出错,在我的设想中,除出错的数据,其它数据应该是都会插入的,但事实不是: 1,batchUpdate(String[] sqls) 这种的sql在于多样化,可以是各种混合sql,在操作时,会一部分一部分的发送到数据库去执行,中途有某条sql报错时,

  • spring整合redis实现数据缓存的实例代码

    数据缓存原因:有些数据比较多,如果每次访问都要进行查询,无疑给数据库带来太大的负担,将一些庞大的查询数据并且更新次数较少的数据存入redis,能为系统的性能带来良好的提升. 业务逻辑思路:登入系统,访问数据时,检查redis是否有缓存,有则直接从redis中提取,没有则从数据库查询出,并存入redis中做缓存. 为什么要用redis做缓存: (1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录. (2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道

  • C#操作字符串方法总结实例代码

    废话不多说了,具体代码如下所述: staticvoid Main(string[] args) { string s =""; //(1)字符访问(下标访问s[i]) s ="ABCD"; Console.WriteLine(s[0]); // 输出"A"; Console.WriteLine(s.Length); // 输出4 Console.WriteLine(); //(2)打散为字符数组(ToCharArray) s ="ABC

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • 在页面中输出当前客户端时间javascript实例代码

    时间对象(Date())比较简单,本文旨在为初学者入门使用,大牛可略过! 本文承接基础知识实例,说一下实例的要求: 在页面中输出当前客户端时间(2015年1月1日星期一10:10:10这样的格式),每过一秒中页面不刷新,但是时间自动更新(用两种定时器方法都可以实现),鼠标点击时间,如果原先运动则停止,如果停止则继续运动: 要求基本上可分为2部分:一是不刷新自动更新时间,二是点击时间停止或更新时间 好,那我们还是老规矩,一步一步来,既然是时间,那就会用到时间对象 new Date(); var n

  • vuex操作state对象的实例代码

    Vuex是什么? VueX 是一个专门为 Vue.js 应用设计的状态管理架构,统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data ). Vue有五个核心概念,state, getters, mutations, actions, modules. 总结 state => 基本数据 getters => 从基本数据派生的数据 mutations => 提交更改数据的方法,同步! actions => 像一个装饰器,包裹mutations,使之可以

  • Spring动态配置计时器触发时间的实例代码

    Spring中添加计时器的时候根据业务需求可能会需要动态处理触发时间; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.EnableS

随机推荐