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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • redis分布式锁的实现(setNx命令和Lua脚本)

    redis分布式锁的实现(setNx命令和Lua脚本)前言本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结分布式锁概览在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式。但是现在公司都是流行分布式架构,在分布式环境下,如何保证不同节点的线程同步执行呢?实际上,对于分布式场景,我们可以使用分布式锁,它是控制分布式系统之间互斥访问共享资源的一种方式。比如说

    2022年5月20日
    164
  • c语言oj得pe,ACM入门之OJ~

    c语言oj得pe,ACM入门之OJ~所谓OJ,顾名思义OnlineJudge,一个用户提交的程序在OnlineJudge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被OnlineJudge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态:通过(Ac…

    2022年6月17日
    43
  • Jlink或者stlink用于SWD接口下载程序「建议收藏」

    Jlink或者stlink用于SWD接口下载程序「建议收藏」最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

    2022年4月25日
    96
  • 回归分析中自变量取舍、检验及多重共线性处理(VIF)「建议收藏」

    回归分析中自变量取舍、检验及多重共线性处理(VIF)「建议收藏」A1正交假定:误差项矩阵与X中每一个x向量都不相关高斯-马尔科夫定理:若满足A1和A2假定,则采用最小二乘法得到回归参数估计是最佳线性无偏估计方程估计值b1和b2可以看做偏回归系数,也是相应自变量对y的一种偏效应偏效应:在控制变量下,各自变量X对因变量Y的净效应残差项:针对具体模型而言,被定义为样本回归模型中观测值与预测值之差误差项:针对总体真实回归模型而言,它由一些不可观测因素或测量…

    2022年5月30日
    66
  • 小议ODT[通俗易懂]

    小议ODT[通俗易懂]不少人看了我写的一篇ODT的文章后仍然觉得不明白:http://blog.csdn.net/Testing_is_believing/archive/2007/09/04/1772334.aspx ODT是TC特有的一个东西,不同于关键字驱动测试。ODT不是在单元测试中使用的,其作用是把数据和脚本中的测试对象构建到一个树上,然后就可以使用一条语句遍历这棵树,读取树中包含的测试数据,

    2025年9月8日
    4
  • Unity3D安装_3D杀号APP

    Unity3D安装_3D杀号APPUnity3D是一个跨平台的游戏开发引擎,它能够帮助开发者快速构建游戏场景,进行游戏开发与发布。它支持将开发好的作品发布到Windows、MacOS、Android、iOS、Linux等多种平台。另外,Unity3D官方版本目前可以运行在Windows和MacOS上,当然还有可以运行在Linux上的非官方版本。

    2022年8月10日
    6

发表回复

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

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