本文内容来自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);
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3071468/ ,如需转载,请注明出处,否则将追究法律责任。