最近公司需要用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. 复习精简版快速学vue3

    vue2中.如果给一个之前没有定义的属性赋值,会得不到时实更新: this.obj.b=2 //由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说v ...

  2. Django 初步使用

    Django 框架系列 目录 Django 框架系列 一. 安装启用 1.1 主流web框架概述 1.2 安装版本 1.3 启动的两种方式 1)命令行创建 2)pycharm创建 3)两种方式的区别 ...

  3. 从0开始搭建开发环境 -实现servlet原生开发

    开发环境:  JDK1.8 + Servlet + Mysql 搭建项目 项目搭建参考博客 https://www.cnblogs.com/oyww-2027/p/15347137.html File ...

  4. if (ctx.ifTo(ctx.property, next)) return

    if (ctx.ifTo(ctx.property, next)) return if (ctx.ifGoto(ctx.property, 'functionName')) return 试试 a & ...

  5. 深入浅出Java多线程(十二):线程池

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十二篇内容:线程池.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代软件开发中,多线程编程已经成为应对 ...

  6. C#之winform捕获Console.WriteLine内容到日志文件

    问题描述 之前接手同事的项目,是一个类似于服务端后台的Winform程序,主界面隐藏起来,只再任务栏显示程序图标. 整个项目里面没有日志记录功能,全靠Console.WriteLine打印信息.自己调 ...

  7. TypeScript必知三部曲(二)JSX的编译与类型检查

    在本三部曲系列的第一部中,我们介绍了TypeScript编译的两种方案(tsc编译.babel编译)以及二者的重要差异,同时分析了IDE是如何对TypeScript代码进行类型检查的.该部分基本涵盖了 ...

  8. CSS(复合选择器、显示模式、背景属性)

    一.emmet语法 1.简介 Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法. 快速生成HTML结构语法 快速生成CSS样式 ...

  9. 记录--H5 视频兼容性处理总结

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 概述 最近在负责公司官网的开发,在 H5 播放视频时,遇到很多兼容问题,所以总结下在 H5 播放时,遇到的兼容性问题,并封装一个 Vide ...

  10. 创建远程仓库&克隆项目(Github)

    创建远程仓库 在GitHub上注册一个账号,之后creat a new repository 创建的远程仓库把它看作一个百度网盘就可以了 克隆项目 1.远程仓库可以下载\克隆到本地 code :git ...