不支持引用外部变量不执行接收多个结果集,只返回第一个结果集,从第二个结果集开始丢弃
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.支持全局,分片存储过程(后续)
