本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7396989.html?templateId=171...
概述
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);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。