本文内容来自 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);
}
复制代码
评论