Spring StoredProcedure Cursor 使用

Spring StoredProcedure Cursor 使用JavaCodeimportjava.sql.ResultSet;importjava.sql.SQLException;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.HashMap;importjava.util.List;importjava.util.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Java Code

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import oracle.jdbc.OracleTypes;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;



public class GetUserActionsOnV2 extends StoredProcedure {
	
	public GetUserActionsOnV2(DataSource dataSource) {
		setDataSource(dataSource);
		setSql("GETUSERACTIONSONV2");
		final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		declareParameter(new SqlOutParameter("active_rs", OracleTypes.CURSOR, new RowMapper() {
		   public Map mapRow(ResultSet rs, int rowNum)
				throws SQLException {
			   Map<String,Object> map = new HashMap<String,Object>();
			   map.put("SOEID", rs.getString("SOEID"));
			   map.put("IOIID", rs.getString("IOIID"));
			   map.put("NAME", rs.getString("NAME"));
			   map.put("VALUE", rs.getString("VALUE"));
			   map.put("DESTINATIONUSER", rs.getString("DESTINATIONUSER"));
			   map.put("ADD_TS", df.format(rs.getTimestamp("ADD_TS")));
			   map.put("UPDATE_TS", df.format(rs.getTimestamp("UPDATE_TS")));
			   return map;
		}
	}));
		declareParameter(new SqlOutParameter("return_sql", OracleTypes.VARCHAR));
		
		declareParameter(new SqlParameter("V_SOEID",OracleTypes.VARCHAR));
		declareParameter(new SqlParameter("V_IOIID", OracleTypes.VARCHAR));
		declareParameter(new SqlParameter("V_NAME",OracleTypes.VARCHAR));
		declareParameter(new SqlParameter("V_VALUE",OracleTypes.VARCHAR));
		declareParameter(new SqlParameter("V_DESTINATIONUSER",OracleTypes.VARCHAR));
		
		
		compile();
	}
		
	public List<Map<String,Object>> executeGetUserActions(Map<String,String> param) throws Exception {
		Map<String, Object> inParameters = new HashMap<String, Object>();
		inParameters.put("V_SOEID", param.get("SOEID"));
		inParameters.put("V_IOIID", param.get("IOIID"));
		inParameters.put("V_NAME", param.get("NAME"));
		inParameters.put("V_VALUE", param.get("VALUE"));
		inParameters.put("V_DESTINATIONUSER", param.get("DESTINATIONUSER"));
		try {
			Map result = execute(inParameters);
			String sql = (String) result.get("return_sql");
			logger.info("GetUserActionsOnV2 sql=" + sql);
			
			List<Map<String,Object>> activeList = (List<Map<String, Object>>) result.get("active_rs");
			return activeList;
		} catch (DataAccessException e) {
			logger.error("Failed to GetUserActionsOnV2 !");
			throw new Exception(e);
		}
	}
}

SP code

/*
#ident "%W%"
*/

CREATE OR REPLACE PROCEDURE GETUSERACTIONSONV2(
  active_rs OUT ×××××_TYPES.cur_type,
  return_sql OUT VARCHAR2,
  V_SOEID IN VARCHAR2,
  V_IOIID IN VARCHAR2,
  V_NAME IN VARCHAR2,
  V_VALUE IN VARCHAR2,
  V_DESTINATIONUSER IN VARCHAR2
)
IS

v_sql VARCHAR2(1000);

BEGIN
 v_sql := 'SELECT * FROM USER_ACTION_V2 WHERE 1 = 1 ';
 
  if V_SOEID is not null THEN
    v_sql := v_sql || 'AND (SOEID = '''|| upper(V_SOEID) || ''' OR DESTINATIONUSER = ''' || upper(V_SOEID) || ''') ';
  end if;
 
  if V_IOIID is not null THEN
  	v_sql := v_sql || 'AND IOIID =''' || V_IOIID || ''' ';
  end if;
 
  if V_NAME is not null THEN
  	v_sql := v_sql || 'AND NAME =''' || upper(V_NAME) || ''' ';
  end if;
  
  if V_VALUE is not null THEN
  	v_sql := v_sql || 'AND VALUE =''' || V_VALUE || ''' ';
  end if;

  v_sql := v_sql || 'ORDER BY ADD_TS DESC';
  
  return_sql := v_sql;
  OPEN active_rs FOR v_sql;
END;
/

注意问题:

(1)Java  StoredProcedure 中定义in,out参数的顺序要与SP sql中定义的in,out参数顺序一致

declareParameter(new SqlOutParameter(“return_sql”, OracleTypes.VARCHAR));
declareParameter(new SqlParameter(“V_SOEID”,OracleTypes.VARCHAR));
declareParameter(new SqlParameter(“V_IOIID”, OracleTypes.VARCHAR));

sp sql:

                return_sql OUT VARCHAR2,
  V_SOEID IN VARCHAR2,
  V_IOIID IN VARCHAR2,

(2)如果sp中out参数返回是cursor,必须定义RowMapper对cursor返回结果进行处理,否则get的结果就为空。

         

final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		declareParameter(new SqlOutParameter("active_rs", OracleTypes.CURSOR, new RowMapper() {
		   public Map mapRow(ResultSet rs, int rowNum)
				throws SQLException {
			   Map<String,Object> map = new HashMap<String,Object>();
			   map.put("SOEID", rs.getString("SOEID"));
			   map.put("IOIID", rs.getString("IOIID"));
			   map.put("NAME", rs.getString("NAME"));
			   map.put("VALUE", rs.getString("VALUE"));
			   map.put("DESTINATIONUSER", rs.getString("DESTINATIONUSER"));
			   map.put("ADD_TS", df.format(rs.getTimestamp("ADD_TS")));
			   map.put("UPDATE_TS", df.format(rs.getTimestamp("UPDATE_TS")));
			   return map;
		}
	}));

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164515.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一系列白话经典算法中 三冒泡排序实现

    一系列白话经典算法中 三冒泡排序实现

    2021年12月17日
    44
  • Java 流程控制

    Java 流程控制

    2021年10月6日
    42
  • 小心onpropertychange在ie8上的地雷[通俗易懂]

    onpropertychangeonpropertychange的话,只要当前对象属性发生改变,都会触发事件,但是它是IE专属的

    2022年4月10日
    34
  • QueryInterface详解 COM

    QueryInterface详解 COMQueryInterface接口查询IUnknown:      所有的COM接口均需要继承IUnknown接口。因此,若某个用户拥有一个IUnknown接口指针,它并不需要知道它所拥有的接口指针到底是什么类型的,而只需要通过此接口就可以用来查询其他接口就行了。      由于所有的COM接口都继承了IUnknown,每个接口的vbtl的前三项都是QueryInterface,A

    2022年6月29日
    28
  • 小树311_森林小道

    小树311_森林小道原题链接森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过C​i​​ 公斤。公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从S​j​​ 号城市运输到T​j​​ 号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中

    2022年8月9日
    3
  • android之requestWindowFeature详解[通俗易懂]

    requestWindowFeature可以设置的值有:        1.DEFAULT_FEATURES:系统默认状态,一般不需要指定        2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定        3.FEATURE_CUSTOM_TITLE:自定义标题。当需要自定义标题时必须指定。如:标题是一个按钮时

    2022年3月10日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号