3.6 存储过程支持方式
存储过程通过注解的方式支持
3.6.1 Syntax
Create procedure
/Hint/
CREATE
[DEFINER = user]
PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
/Hint/
CREATE
[DEFINER = user]
FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
Valid SQL routine statement
和MySQL语法的区别如下,绿色代表增加的部分,也就是hint
+ /Hint/
CREATE
[DEFINER = user]
PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
+ /Hint/
CREATE
[DEFINER = user]
FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
Valid SQL routine statement
drop procedure
/Hint/ DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
和MySQL语法的区别如下,绿色代表增加的部分,也就是hint
+ /Hint/
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
call procedure
[/Hint/] CALL sp_name([parameter[,...]])
[/Hint/] CALL sp_name[()]
和MySQL语法的区别如下,绿色代表增加的部分,也就是hint
+ [/Hint/]
CALL sp_name([parameter[,...]])
+ [/Hint/]
CALL sp_name[()]
3.6.2 举例
删除存储过程:
/*!dble:sql=select 1 from account */drop procedure if exists proc_arc;
创建存储过程:
/*!dble: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不会对存储过程的结果进行汇聚运算,只能由应用端自行完成。