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不会对存储过程的结果进行汇聚运算,只能由应用端自行完成。

results matching ""

    No results matching ""