不支持引用外部变量不执行接收多个结果集,只返回第一个结果集,从第二个结果集开始丢弃
1.21-2021-12-21存储过程支持多结果集返回
支持接收affectRow
由于客户端对存储过程的实现不同,也与mysql版本有关系,注意设置mycat模拟的mysql版本
需要支持更多情况请咨询mycat2作者
透传SQL下发(不经过SQL优化器处理)
/*+ MYCAT:TARGET(c0) */ {call xxxxx}
/*+ MYCAT:TARGET(c1,c2) */ {call xxxxx}
参数为集群名字或数据源名字,该注释不会修改sql,而是直接把sql直接发送到多个集群或者数据源,它不支持返回结果集的存储过程,仅支持无结果集的存储过程
2.通过配置普通存储过程,实现存储过程映射
{
"customTables":{},
"globalTables":{},
"normalProcedures":{
"delete_matches":{
"createProcedureSQL":"CREATE PROCEDURE mysql.`delete_matches` (\n\tIN p_id INTEGER\n)\nBEGIN\n\tDELETE FROM db1.`travelrecord`\n\tWHERE id = p_id;\nEND",
"locality":{
"procedureName":"delete_matches",
"schemaName":"mysql",
"targetName":"prototype"
}
}
},
"schemaName":"mysql",
"shardingTables":{},
"targetName":"prototype"
}
该配置可以实现把逻辑库mysql的delete_matches存储过程映射到集群prototype的物理库mysql的delete_matches
它支持暂时返回一个结果集的存储过程,也支持无结果集的存储过程,后面会完善多结果集等情况.
3.直接使用存储过程创建,在客户端执行创建存储过程,即可自动进行上述2的配置,但是集群默认是prototype
execute(mycatConnection,"DROP PROCEDURE IF EXISTS mysql.`select_matches`");
String s = " CREATE PROCEDURE mysql.`select_matches`(\n" +
"\tIN p_id INTEGER\n" +
")\n" +
"BEGIN\n" +
"select * FROM db1.`travelrecord` WHERE id = p_id;\n" +
"END";
execute(mycatConnection, s);
deleteData(mycatConnection,"db1","travelrecord");
execute(mycatConnection, "INSERT INTO `db1`.`travelrecord` (`id`) VALUES ('1');");
CallableStatement callableStatement = mycatConnection.prepareCall(" CALL mysql.select_matches(1)");
boolean execute = callableStatement.execute();
Assert.assertTrue(execute);
ResultSet resultSet = callableStatement.getResultSet();
boolean next = resultSet.next();
Assert.assertTrue(next);
4.支持全局,分片存储过程(后续)