3.6 存储过程支持方式
3.6.1 Syntax
Create procedure
/Hint/ CREATE [DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
/Hint/ CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type [characteristic ...] routine_body
drop procedure
/Hint/ DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
call procedure
[/Hint/] CALL sp_name([parameter[,...]])
[/Hint/] CALL sp_name[()]
3.6.2 举例
删除存储过程:
/*!dble:sql=select 1 from account */drop procedure if exists proc_arc;
创建存储过程:
/*!dblle:sql=select 1 from account */create procedure proc_arc(userid1 int)
begin
insert into account_arc select * from account where userid=userid1;
update account set arc_flag=true,arc_time=now() where userid=userid1;
end;
调用存储过程:
/*!dble:sql=select 1 from account */call proc_arc(1);
3.6.3 限制
- dble支持存储过程和自定义函数的透传,存储过程的开发完全使用MySQL的语法,开发、调试与部署的方法同单机MySQL相同。存储过程和自定义函数需要在所有节点上创建,节点扩容的时候也需要考虑存储过程和自定义函数的迁移。
- 存储过程和自定义函数是直接发送到节点上执行,中间件不参与运算,因此要慎重使用,需要保证过程的内部不出现跨节点运算。
- 存储过程调用时,要在调用语句之前增加注解,系统根据注解透传到节点运行,存储过程的执行路径以及执行结果的正确性由开发者保证。对于只是写入数据,不返回结果的存储过程,需要注意避免重复写入数据。对于返回结果的存储过程,需要特别注意返回结果的正确性。dble不会对存储过程的结果进行汇聚运算,只能由应用端自行完成。
- 由于dble支持了多语句执行,这个部分在创建存储过程中存在影响,所以当前的存储过程创建还存在另一个限制,要求创建存储过程的前端连接必须在登录过程中CLIENT_MULTI_STATEMENTS 为false,也就是不允许进行多语句,否则存储过程的sql会按照多语句的逻辑进行切分,导致sql语法错误