Halo数据库作为一款通用型数据库,特别注重兼容性,以适应不同的应用场景,满足企业的数据存储处理等需求。
一、前置条件
Halo-mysql模式使用存储过程需要创建plmyssql扩展。
create extension plmyssql;
二、存储过程的创建及调用
1. 存储过程语法
CREATE[DEFINER = { user | CURRENT_USER }]PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_bodyproc_parameter:[ IN | OUT | INOUT ] param_name typecharacteristic: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)beginset 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()begindeclare 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)beginif num < 0 thenset @var = '负数';elseif num = 0 thenset @var = '不是正数也不是负数';elseset @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)begincasewhen 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()beginwhile @var < 10 doset @var = @var + 1;end while;end;//set @var = 0;//call proc7();//select @var;//

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

LOOP 循环语句
create or replace procedure proc9()beginloop_sum: loopset @var = @var + 1;if @var < 10 theniterate 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()begincall proc_inner();end;//create or replace procedure proc_inner()beginset @var_inner = 'proc_inner';end;//set @var_inner = NULL;//call proc_outer();//select @var_inner;//

3.5 存储过程中使用PREPARE
create or replace procedure proc_prepare()beginprepare 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)
本次内容介绍至此,其他功能等待您来发现。谢谢!!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




