/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
/Hint/ DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
[/Hint/] CALL sp_name([parameter[,...]])
[/Hint/] CALL sp_name[()]
删除存储过程:
/*!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);
call proc_arc(1);
- dble支持存储过程和自定义函数的透传,存储过程的开发完全使用MySQL的语法,开发、调试与部署的方法同单机MySQL相同。存储过程和自定义函数需要在所有节点上创建,节点扩容的时候也需要考虑存储过程和自定义函数的迁移。
- 存储过程和自定义函数是直接发送到节点上执行,中间件不参与运算,因此要慎重使用,需要保证过程的内部不出现跨节点运算。
- 存储过程调用时,要在调用语句之前增加注解,系统根据注解透传到节点运行,存储过程的执行路径以及执行结果的正确性由开发者保证。对于只是写入数据,不返回结果的存储过程,需要注意避免重复写入数据。对于返回结果的存储过程,需要特别注意返回结果的正确性。dble不会对存储过程的结果进行汇聚运算,只能由应用端自行完成。