写点什么

【YashanDB 知识库】MySQL 返回结果集的存储过程的改写方法

作者:YashanDB
  • 2025-02-08
    广东
  • 本文字数:1118 字

    阅读完需:约 4 分钟

本文内容来自 YashanDB 官网,原文内容请见 https://www.yashandb.com/newsinfo/7396989.html?templateId=1718516


概述

MySQL 的存储过程可返回结果集,改写到 YashanDB,需要转换成返回 SYS_REFCURSOR 的函数,而且上层应用代码(例如:JDBC)也需要调整。

 

问题

MySQL 的存储过程可返回结果集,请看以下示例的存储过程 proc1。

DELIMITER $$
CREATE PROCEDURE proc1(p_start int, p_end int)
begin
select 1 c1, 'name1' c2
union all
select 2, 'name2'
union all
select 3, 'name3'
union all
select 4, 'name4';
end $$
DELIMITER ;
复制代码


执行存储过程 proc1,会返回存储过程 proc1 内部的查询结果。

mysql> call proc1(1,2);
+----+-------+
| c1 | c2 |
+----+-------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
+----+-------+
4 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
复制代码


而且,MySQL JDBC 可调用存储过程 proc1 并直接获得 ResultSet,从而 ResultSet 通过获得存储过程 proc1 内部的查询结果。

CallableStatement callableStatement = conn.prepareCall("CALL PROC1(?,?)");
callableStatement.setInt(1, 1);
callableStatement.setInt(2, 10);

ResultSet rs = callableStatement.executeQuery();

while (rs.next()){
String c2 = rs.getString("c2");
System.out.println(c2);
}
复制代码


解决方法

MySQL 的存储过程可返回结果集,改写到 YashanDB,需要转换成返回 SYS_REFCURSOR 的函数 proc1。

CREATE OR REPLACE FUNCTION proc1(p_start number, p_end number) RETURN sys_refcursor as
cur sys_refcursor;
begin
OPEN cur FOR
select 1 c1, 'name1' c2 from dual
union all
select 2, 'name2' from dual
union all
select 3, 'name3' from dual
union all
select 4, 'name4' from dual;
RETURN cur;
end;
/
复制代码


而且,上层应用代码(例如:JDBC)也需要调整,在 YashanDB 通过为函数 proc1 的输出参数绑定为 REF_CURSOR。调用函数后,REF_CURSOR 输出参数可转换为 ResultSet,然后通过 ResultSet 获得内部的查询结果。

CallableStatement callableStatement = conn.prepareCall("{? = call FUNC1(?,?)}");
callableStatement.registerOutParameter(1, Types.REF_CURSOR);
callableStatement.setInt(2, 1);
callableStatement.setInt(3, 10);
callableStatement.execute();
ResultSet rs = (ResultSet) callableStatement.getObject(1);

while (rs.next()){
String c2 = rs.getString("c2");
System.out.println(c2);
}
复制代码


发布于: 刚刚阅读数: 4
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法_数据库_YashanDB_InfoQ写作社区