HaloDB对MySQL存储过程的兼容及使用
Halo数据库作为一款通用型数据库,特别注重兼容性,以适应不同的应用场景,满足企业的数据存储处理等需求。
一、前置条件
Halo-mysql模式使用存储过程需要创建plmyssql扩展。
create extension plmyssql;

二、存储过程的创建及调用
1. 存储过程语法
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name 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 [begin_label:] BEGIN [statement_list] …… END [end_label]
通过Mysql协议对存储过程进行创建及管理
声明语句结束符,可以自定义:
DELIMITER $$ 或 DELIMITER //
2. 存储过程参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] parameter data_type...])
-
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
-
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
-
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
delimiter create or replace procedure proc(in a int, in b int, out sum int) begin set sum = a + b; end; // call proc(1, 2, @var1);// select @var1;//

3. 创建及调用存储过程
3.1 简单创建存储过程
mysql> delimiter // mysql> create or replace procedure proc1() -> begin -> select * from dept where id =1; -> select * from emp where id = 1; -> end; -> // Query OK, 0 rows affected (0.00 sec) mysql> call proc1()// +----+-----------+ | id | name | +----+-----------+ | 1 | 研发部 | +----+-----------+ 1 row in set (0.00 sec) +----+--------+--------+---------+------------+---------+ | id | name | gender | salary | join_date | dept_id | +----+--------+--------+---------+------------+---------+ | 1 | 张三 | 男 | 7200.00 | 2013-02-24 | 1 | +----+--------+--------+---------+------------+---------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
3.2 声明和使用普通变量
delimiter create procedure proc2()begin declare de_name varchar(10) default ''; set de_name = "abc"; set @var = de_name;end;// call proc2();//select @var;//

3.3 流程控制语句
IF 条件判断
create or replace procedure proc5(in num int) begin if num < 0 then set @var = '负数'; elseif num = 0 then set @var = '不是正数也不是负数'; else set @var = '正数'; end if; end; // call proc5(-1);// call proc5(0);// select @var;// call proc5(1);// select @var;//
CASE 条件语句
create or replace procedure proc6(in num int) begin case when num < 0 then set @var = '负数'; when num = 0 then set @var = '不是正数也不是负数'; else set @var = '负数'; end case; end; // call proc61(-1);// select @var;// call proc61(0);// select @var;// call proc61(1);// select @var;//

WHILE 循环语句
create or replace procedure proc7() begin while @var < 10 do set @var = @var + 1; end while; end; // set @var = 0;// call proc7();// select @var;//

REPEAT循环语句
create or replace procedure proc8() begin repeat set @var = @var + 1; until @var >= 10 end repeat; end; // set @var = 1;// call proc8();// select @var;//

LOOP 循环语句
create or replace procedure proc9() begin loop_sum: loop set @var = @var + 1; if @var < 10 then iterate loop_sum; -- 继续下一次循环迭代 end if; leave loop_sum; -- 退出循环 end loop loop_sum; end; // set @var = 0;// call proc9();// select @var;//

3.4 存储过程中调用存储过程
create or replace procedure proc_outer() begin call proc_inner(); end; // create or replace procedure proc_inner() begin set @var_inner = 'proc_inner'; end; // set @var_inner = NULL;// call proc_outer();// select @var_inner;//

3.5 存储过程中使用PREPARE
create or replace procedure proc_prepare() begin prepare proc_prepare_p1 from 'select * from tab_proc1 where id=?'; set @var_id = 1; execute proc_prepare_p1 using @var_id; set @var_id = 3; execute proc_prepare_p1 using @var_id; end; // set @var_id = NULL;// call proc_prepare();// set @var_id = 5;// execute proc_prepare_p1 using @var_id;// deallocate prepare proc_prepare_p1;//

三、存储过程管理
存储过程的管理主要包括:显示过程、显示过程源码、删除过程。
-
查看
--显示存储过程 mysql> SHOW CREATE PROCEDURE proc_prepare; --显示指定数据库的存储过程 mysql> show procedure status where db ='mytest'; --显示特定模式的存储过程,要求显示名称中包含“proc2”的存储过程 mysql> show procedure status where name like'proc2%';

-
删除
--删除存过程 mysql> DROP PROCEDURE proc_prepare; Query OK, 0 rows affected (0.00 sec)
本次内容介绍至此,其他功能等待您来发现。谢谢!!