HaloDB对MySQL存储过程的兼容及使用

2024年 7月 25日 54.8k 0

    Halo数据库作为一款通用型数据库,特别注重兼容性,以适应不同的应用场景,满足企业的数据存储处理等需求。

一、前置条件

    Halo-mysql模式使用存储过程需要创建plmyssql扩展。

    create extension plmyssql;

    HaloDB对MySQL存储过程的兼容及使用-1

    二、存储过程的创建及调用

        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;//

            HaloDB对MySQL存储过程的兼容及使用-2

            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;//

                HaloDB对MySQL存储过程的兼容及使用-3

                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;//

                    HaloDB对MySQL存储过程的兼容及使用-4

                        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;//

                      HaloDB对MySQL存储过程的兼容及使用-5

                          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;//

                        HaloDB对MySQL存储过程的兼容及使用-6

                            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;//

                          HaloDB对MySQL存储过程的兼容及使用-7

                          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;//

                            HaloDB对MySQL存储过程的兼容及使用-8

                            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;//

                              HaloDB对MySQL存储过程的兼容及使用-9

                              三、存储过程管理

                               存储过程的管理主要包括:显示过程、显示过程源码、删除过程。

                              •   查看

                                --显示存储过程
                                mysql> SHOW CREATE PROCEDURE proc_prepare;

                                --显示指定数据库的存储过程
                                mysql> show procedure status where db ='mytest';

                                --显示特定模式的存储过程,要求显示名称中包含“proc2”的存储过程
                                mysql> show procedure status where name like'proc2%';

                                HaloDB对MySQL存储过程的兼容及使用-10

                                •   删除

                                  --删除存过程
                                  mysql> DROP PROCEDURE proc_prepare;
                                  Query OK, 0 rows affected (0.00 sec)

                                  本次内容介绍至此,其他功能等待您来发现。谢谢!!

                                  相关文章

                                  Oracle如何使用授予和撤销权限的语法和示例
                                  Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
                                  下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
                                  社区版oceanbase安装
                                  Oracle 导出CSV工具-sqluldr2
                                  ETL数据集成丨快速将MySQL数据迁移至Doris数据库

                                  发布评论