Greenplum Jdbc 调用 SETOF refcursor
最近公司需要用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的更多相关文章
- Java数据库连接——JDBC调用存储过程,事务管理和高级应用
一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...
- 使用 JDBC 调用函数 & 存储过程
/** * 如何使用 JDBC 调用存储在数据库中的函数或存储过程 */ @Test public void testCallableStatment() { Connection connectio ...
- jdbc调用存储过程的方法
----------------------------jdbc调用存储过程的方法---------------------------------------------------private ...
- 使用JDBC调用数据库的存储过程
本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...
- JDBC调用存储过程
一. JDBC调用存储过程 (1)使用存储过程SQL编写的程序代码,等一段语句和控制流语句.在创建时被编译成机器代码和存储在数据库中的client转让. 存储过程具有以下优势: 1.所生成的机器代码被 ...
- Java数据库连接--JDBC调用存储过程,事务管理和高级应用
相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
- JDBC调用存储过程的例子
下面是我学到了Oracle存储过程,在这里跟大家简单的分享一下利用JDBC调用存储过程的例子: 废话就不啰嗦,现在就直接上机代码. 首先我利用的是Oracle中默认的 scott 数据库里的 emp员 ...
- JDBC(13)—JDBC调用存储过程和函数
步骤: JDBC调用存储过程和函数 步骤: ①:通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例,在使用Connection对象的pre ...
- Java JDBC调用存储过程:无参、输入带参、输出及输出带参
Java JDBC调用存储过程:无参.输入带参.输出及输出带参 示例代码: package xzg; import java.sql.CallableStatement; import java.sq ...
- Oracle使用jdbc调用带游标参数的存储过程
package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...
随机推荐
- ANDROID : NEW IDEA
•前言 学习了 Android 开发后,小脑袋瓜中时不时会蹦跶出一些想法: 这些想法大都是我现在实现不了的,所以就需要记录一下,等学到相关知识时,在着手解决. •NEW IDEA 1 将一款 APP( ...
- ansible 自动化运维(1)
ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量 ...
- 整数输入框 InputNumberIntZen.vue 只能输入整数 不能输入.等其他字符
这版的输入限制堪称完美 perfect! 20230712 更新 加入 onBlurHandle 如果输入的02 失焦的时候 变成2 <!--数字输入框 只能输入数字 整型 InputNumbe ...
- linux下命令行打开文件夹窗口
方法一: 使用自带的命令:nautilus . 打开当前文件夹 nautilus . 打开指定路径文件夹 nautilus ddd/ccc/ 方法二:xdg-open xdg-open 命令相当于在 ...
- vue入门教程之-属性、事件和双向绑定
vue入门教程之-属性.事件和双向绑定 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 htt ...
- 小程序登录V2
参考:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801(通知) https:/ ...
- 大年学习linux(第三节---用户管理)
三.用户管理 用户和用户组操作命令 ld Finger Pwck 检查/etc/passwd配置文件内的信息与实际主文件夹是否存在,还可比较/etc/passwd和/etc/shadow的信息是否一致 ...
- 不要升级!不要升级!MacOS 14.4 引发Java 应用崩溃
如果最近您收到了MacOS 14.4的升级提醒,那么建议你暂时先不要升级! 在x上,Java开发领域的一些大v们,也发现了这个问题,并提醒大家不要升级. 根据Java官方发布的文章了解到,该问题主要是 ...
- linux磁盘管理、网络
一 磁盘管理 1 查看磁盘空间的占用 df -h 显示人类易读的方式 linux下磁盘命名格式 /dev/sd[a-z] 2 查看目录的占用空间 du -s 查看目录 -h 显示人类易读的方式 du ...
- uni学习笔记分享
目录介绍 01.遇到问题汇总 02.关于布局设置 03.基础语法总结 04.关于交互问题 06.关于回传数据 07.关于网络请求 08.关于页面刷新 09.关于注意问题 10.待解决和思考 01.遇到 ...