最近公司需要用Greenplum,在调用 jdbc的时候遇到了一些问题。由于我们前提的业务都是使用 sqlserver,sqlserver的 procedure 在前端展示做数据源的时候才用的非常多,很多procedure 都是返回了多个结果集,这种需求在greenplum实现起来就没有sqlserver方便。GreenPlum的储存过程都是function多结果集需要用 SETOF refcursor 。这里不得不吐槽下greenplum的资料真的很少,专门的jdbc的例子都很少,很多都是pg的,遇到一些问题很难找到官方的提问途径,加了几个群好像都是石沉大海问的。扯远了言归正传,参考了pg的jdbc,有一段关于 refcursor 的例子,但是没有提供关于 SETOF refcursor,按照这个例子测试 只能获取到第一个结果集,后续的几个结果集都无法获取

// set up a connection
String url = "jdbc:postgresql://localhost/test";
Properties props = new Properties();
... other properties ...
// Ensure EscapeSyntaxCallmode property set to support procedures if no return value
props.setProperty("escapeSyntaxCallMode", "callIfNoReturn");
Connection con = DriverManager.getConnection(url, props); // Setup procedure to call.
Statement stmt = con.createStatement();
stmt.execute("CREATE TEMP TABLE temp_val ( some_val bigint )");
stmt.execute("CREATE OR REPLACE PROCEDURE commitproc(a INOUT bigint) AS '"
+ " BEGIN "
+ " INSERT INTO temp_val values(a); "
+ " COMMIT; "
+ " END;' LANGUAGE plpgsql");
stmt.close(); // As of v11, we must be outside a transaction for procedures with transactions to work.
con.setAutoCommit(true); // Procedure call with transaction
CallableStatement proc = con.prepareCall("{call commitproc( ? )}");
proc.setInt(1, 100);
proc.execute();
proc.close();

看了他官方的几个例子,实在是找不到 关于 SETOF refcursor 的例子,问了一圈好像都没有人知道,看了他官方的几个例子,跟踪了几次jdbc,综合了下几个例子的demo,尝试了下的一下写法,测试成功,只能感慨下自己的领悟能力不够=。=.

function 定义

CREATE OR REPLACE FUNCTION usp_hdw_jk_getAllHzJbxx (
kssj varchar, ----开始时间
jssj varchar, ----结束时间
val varchar, ----查询值
startnum Integer, ----分页开始
endnum Integer, ----分页结束
refcursor,
refcursor
)

  

JDBC DEMO

public static void main(String[] args) throws SQLException {
try {
Connection conn = DriverManager.getConnection("jdbc:postgresql://192.168.x.xxx:5432/hdw", "xxx", "xxx");
if (conn != null) {
System.out.println("Connected to the database!");
} else {
System.out.println("Failed to make connection!");
} conn.setAutoCommit(false); CallableStatement callableStatement = conn.prepareCall(" { call usp_hdw_jk_getAllHzJbxx(?,?,?,?,?,?,?) }");
callableStatement.setString(1 , "2020-08-01 00:00:00");
callableStatement.setString(2, "2021-08-21 00:00:00");
callableStatement.setString(3, "6900718984");
callableStatement.setInt(4, 1);
callableStatement.setInt(5, 1000);
callableStatement.setObject(6, "a", Types.OTHER);
callableStatement.setObject(7, "b", Types.OTHER); ResultSet resultSet = callableStatement.executeQuery(); while (resultSet.next()) {
ResultSet rs1 = (ResultSet) resultSet.getObject(1);
int count = rs1.getMetaData().getColumnCount();
while (rs1.next()) {
for (int i = 1; i <= count; i++) {//遍历列
System.out.print(rs1.getMetaData().getColumnLabel(i) + ": " + rs1.getString(i)+" ");
}
System.out.print("\n");
}
rs1.close();
}
resultSet.close();
callableStatement.close();
conn.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

Greenplum Jdbc 调用 SETOF refcursor的更多相关文章

  1. Java数据库连接——JDBC调用存储过程,事务管理和高级应用

    一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...

  2. 使用 JDBC 调用函数 & 存储过程

    /** * 如何使用 JDBC 调用存储在数据库中的函数或存储过程 */ @Test public void testCallableStatment() { Connection connectio ...

  3. jdbc调用存储过程的方法

    ----------------------------jdbc调用存储过程的方法---------------------------------------------------private ...

  4. 使用JDBC调用数据库的存储过程

    本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...

  5. JDBC调用存储过程

    一. JDBC调用存储过程 (1)使用存储过程SQL编写的程序代码,等一段语句和控制流语句.在创建时被编译成机器代码和存储在数据库中的client转让. 存储过程具有以下优势: 1.所生成的机器代码被 ...

  6. Java数据库连接--JDBC调用存储过程,事务管理和高级应用

    相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...

  7. JDBC调用存储过程的例子

    下面是我学到了Oracle存储过程,在这里跟大家简单的分享一下利用JDBC调用存储过程的例子: 废话就不啰嗦,现在就直接上机代码. 首先我利用的是Oracle中默认的 scott 数据库里的 emp员 ...

  8. JDBC(13)—JDBC调用存储过程和函数

    步骤: JDBC调用存储过程和函数 步骤: ①:通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例,在使用Connection对象的pre ...

  9. Java JDBC调用存储过程:无参、输入带参、输出及输出带参

    Java JDBC调用存储过程:无参.输入带参.输出及输出带参 示例代码: package xzg; import java.sql.CallableStatement; import java.sq ...

  10. Oracle使用jdbc调用带游标参数的存储过程

    package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...

随机推荐

  1. 2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di

    2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同.实现一个叫「餐盘」的类 DinnerPlates, Di ...

  2. 记录一次运行vue项目一直不成功的经历

    参考:https://blog.csdn.net/qq_17162169/article/details/115718002 如果前端项目一直起不来,直接删除扩展文件夹试试 // npm安装vue y ...

  3. 三维模型3DTile格式轻量化在三维展示效果上的重要性分析

    三维模型3DTile格式轻量化在三维展示效果上的重要性分析 三维模型3DTile格式轻量化在三维展示效果上扮演着至关重要的角色.随着计算机图形学和虚拟现实技术的不断发展,我们已经可以创建和渲染非常精细 ...

  4. 记录--用JS轻松实现一个录音、录像、录屏的工具库

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近项目遇到一个要在网页上录音的需求,在一波搜索后,发现了 react-media-recorder 这个库.今天就跟大家一起研究一 ...

  5. abp9 .net8 升级错误记录

    错误一. Cannot find compilation library location for package 'System.Security.Cryptography.Pkcs' 修复方法:  ...

  6. 基于VB6的磁性移动窗体 - 开源研究系列文章

    这次继续整理代码.这个磁性窗体是以前大学的时候开发的,当时模仿的Winamp的效果进行的编程.当时的时候有Windows API函数能够进行处理,但是XP的年代,那个API只是移动的虚框,而不是移动窗 ...

  7. KingbaseES数据库批量加载数据的最佳方法

    前言 本文讨论在KingbaseES数据库服务器中批量加载数据的方法,以及空数据库中的初始数据加载和增量数据加载的最佳做法. 批量加载方法 以下数据加载方法按照从最耗时到最不耗时的顺序排列: 1.运行 ...

  8. KingbaseES 参数设置优先级别

    Oracle的参数可以设置system和session级别,当设置了session级别的参数时,会覆盖值system级别. KingbaseES除了该两个级别外,还有database级别.user/r ...

  9. Java中split的用法及一个金典入坑题目

    split() 方法根据匹配给定的正则表达式来拆分字符串. 注意: . . $. | 和 * 等转义字符,必须得加 \\. 注意:多个分隔符,可以用 | 作为连字符. 语法 public String ...

  10. CSS设置图片根据div的大小等比例缩放

    1 .img{ 2 position: absolute; 3 background:url("../images/success.png") no-repeat; 4 width ...