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)
本次内容介绍至此,其他功能等待您来发现。谢谢!!