zoukankan      html  css  js  c++  java
  • mysql 存储过程

    创建

    • ‘;’为创建存储过程的结束标志,使用DELIMITER $$可更改标志
    • 格式

    CREATE PROCEDURE <procedure_name>([<IN | OUT | INOUT> <param_name> <param_type>])
    BEGIN
    sql
    END;

    CREATE PROCEDURE myprocedure(IN param INTEGER)
    BEGIN
         SELECT * FROM tb_role WHERE tb_role.role_id = param;
    END;
    
    

    删除

    DROP PROCEDURE myprocedure;
    

    调用

    CALL myprocedure(1);
    

    检索数据库中的存储过程

    SHOW PROCEDURE STATUS WHERE db='database_name';
    

    查看存储过程

    SHOW CREATE PRECEDURE database_name.procedure_name;
    

    参数

    参数类型:INOUTINOUT代表输入、输出、输入输出

    IN

    • 可以为常量或变量
    • 输入参数只作为参数传递,不改变自身值
    CREATE PROCEDURE testparam(IN param INTEGER)
    BEGIN
         SELECT param;
         SET param = 2;
         SELECT param;
    END;
    ------------
    SET @param = 1;
    CALL testparam(@param);
    SELECT @param;  --此时param为1,输入参数只作为参数传递,不改变自身值
    

    OUT

    • 只能为变量
    • 输出参数会改变参数值
    CREATE PROCEDURE testparam(OUT param INTEGER)
    BEGIN
         SELECT param; -- 此处为null,因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null
         SET param = 2;
         SELECT param;
    END;
    ------------
    SET @param = 1;
    CALL testparam(@param);
    SELECT @param;  --此时param为2,存储过程会改变输出参数值
    

    INOUT

    • 只能是变量
    • 既可以向过程传递参数,也可以将参数作为返回值

    变量定义

    局部变量

    定义
    DECLARE <var_name> <var_type> DEFAULT <var_value>

    • 局部变量只能在存储过程中定义
    CREATE PROCEDURE testvar()
    BEGIN
         DECLARE var varchar(20) DEFAULT 'hello world!'; -- 局部变量定义
         select var as title;
    END;
    

    赋值

    CREATE PROCEDURE testvar()
    BEGIN
         DECLARE var varchar(20) DEFAULT 'hello world!'; -- 局部变量
         set var = '你好世界';
         select var as title;
    END;
    

    用户变量

    • 用户变量名一般以@开头

    定义

          SET @param = 'hello world!';
    

    删除/赋值

          SET @param = null;
    

    INTO

    可用于查询变量赋值

    SET @cnt = 0;
    select count(*) INTO cnt from tb_user;
    

    BEGIN/END作用域

    • BEGIN/END可命名,局部变量作用域只在当前语句内
    CREATE PROCEDURE test()
    BEGIN
         BEGIN
              DECLARE var varchar(20) DEFAULT '123';
              BEGIN
                   DECLARE var varchar(20) DEFAULT '456';
                   select var title; --456
              END;
              select var title; -- 123
         END;
    END;
    

    IF/ELSE

    IF <exp> THEN
    <sql>
    ELSE
    <sql>
    END;

    CREATE PROCEDURE get_user_name(IN param INTEGER)
    BEGIN
         DECLARE cnt INTEGER DEFAULT 0;
         select count(*) INTO cnt from tb_user;--将统计值赋值给局部变量--
         IF param > cnt THEN
            select concat('param need <', cnt) 'msg';
         ELSE
             select u.name 'name' from tb_user u where u.user_id = param;
         END IF;
    END;
    

    CASE

    • 语法
      CASE <var>
      WHEN <var> THEN
      <sql>
      WHEN <var> THEN
      <sql>
      ELSE
      <sql>
      END CASE;
    CREATE PROCEDURE test_case(IN param INTEGER)
    BEGIN
         CASE param
         WHEN 1 THEN
              insert into tb_auth (auth_name, auth_desc, create_time)
               VALUE('test','',date_format(now(),'%Y-%m-%d'));
         WHEN 2 THEN
              insert into tb_auth (auth_name, auth_desc, create_time)
               VALUE('test','',date_format(now(),'%Y-%m-%d %h:%i:%s'));
         ELSE
               insert into tb_auth (auth_name, auth_desc, create_time)
               VALUE('test','',date_format(now(),'%h:%i:%s'));
         END CASE;
    END;
    

    WHILE

    • 语法
      WHILE <exp> DO
      <sql>
      END WHILE;
    CREATE PROCEDURE test_while(IN param INTEGER)
    BEGIN
         DECLARE cnt INTEGER DEFAULT 0;
         WHILE cnt < param DO
               INSERT INTO tb_role (role_name, role_desc, create_time) VALUE('','','');
               SET cnt = cnt + 1;
         END WHILE;
    END;
    
  • 相关阅读:
    利用配置不当提权
    MS14-068提权
    ettercap局域网DNS切换到恶意网址
    brute爆破
    MS11-080提权
    CSRF实战靶场 --致谢大哥
    本地提权
    域内信息收集 powershell收集域内信息
    域内信息的收集
    tomcat上传内容报错
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/13894290.html
Copyright © 2011-2022 走看看