【MybatisPuls】如何调用DM存储过程并返回多结果集
一、创建DM存储过程
CREATE OR REPLACE PROCEDURE your_procedure ( result1 OUT CURSOR, result2 OUT CURSOR ) AS BEGIN -- 打开第一个结果集 OPEN result1 FOR SELECT top 10 * FROM 表; -- 打开第二个结果集 OPEN result2 FOR SELECT top 10 * FROM 表; END;
--SQL测试存储过程
sql 调用过程 输出
declare
row1 表%ROWTYPE;
row2 表%ROWTYPE;
result1 CURSOR ;
result2 CURSOR ;
BEGIN
-- 调用存储过程,并接收输出参数
your_procedure( result1, result2);
-- 循环输出结果集1的数据
LOOP
FETCH result1 INTO row1;
EXIT WHEN result1%NOTFOUND; -- 当结果集为空时退出循环
-- 输出数据
DBMS_OUTPUT.enable;
DBMS_OUTPUT.PUT_LINE(row1.name);
END LOOP;
CLOSE result1;
end;
二、Mybatis Puls 调用
server层:只能使用map传参,接参
Map<String, Object> parameterMap = new HashMap<>(); parameterMap.put("outParam1", null); // 对应第一个结果集 parameterMap.put("outParam2", null); // 对应第二个结果集 baseMapper.getMultipleResults(parameterMap); Object map1=parameterMap.get("outParam1"); Object map2=parameterMap.get("outParam2");
mapper层:
void getMultipleResults(Map<String,Object> p);
XML实现
<select id="getMultipleResults" statementType="CALLABLE" resultSets="result1,result2"> {CALL your_procedure(#{outParam1, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=employeeResultMap}, #{outParam2, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=departmentResultMap})} </select>
注意:
--statementType="CALLABLE" --调用存储过程,存储函数
--resultSets:指定用于加载复杂类型的结果集名字
--jdbcType=CURSOR 游标类型,
--javaType=java.sql.ResultSet 一般设置
这里的 javaType 属性是可选的,如果留空并且 jdbcType 是 CURSOR,它会被自动地被设为 ResultMap。