MySQL 创建存储过程示例

1. 创建存储过程

mysql> use sample2;
Database changed
mysql> select * from t1;
+------+
| id   |
+------+
|  100 |
|  200 |
+------+
2 rows in set (0.03 sec)

mysql> DELIMITER $$
mysql> CREATE PROCEDURE proce01()
    -> READS SQL DATA
    ->  BEGIN
    ->  select * from t1;
    -> END $$
Query OK, 0 rows affected (0.02 sec)

mysql> DELIMITER ;
mysql> call proce01();
+------+
| id   |
+------+
|  100 |
|  200 |
+------+
2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

2. 查看存储过程信息,包括定义:

mysql> show procedure status like 'proce01' \G
*************************** 1. row ***************************
                  Db: sample2
                Name: proce01
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2018-05-31 15:26:07
             Created: 2018-05-31 15:26:07
       Security_type: DEFINER
             Comment:
character_set_client: gbk
collation_connection: gbk_chinese_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

mysql> show create procedure proce01 \G
*************************** 1. row ***************************
           Procedure: proce01
            sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `proce01`()
    READS SQL DATA
BEGIN
select * from t1;
END
character_set_client: gbk
collation_connection: gbk_chinese_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

mysql> select * from information_schema.routines where routine_name = 'proce01' \G
*************************** 1. row ***************************
           SPECIFIC_NAME: proce01
         ROUTINE_CATALOG: def
          ROUTINE_SCHEMA: sample2
            ROUTINE_NAME: proce01
            ROUTINE_TYPE: PROCEDURE
               DATA_TYPE:
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
          DTD_IDENTIFIER: NULL
            ROUTINE_BODY: SQL
      ROUTINE_DEFINITION: BEGIN
select * from t1;
END
           EXTERNAL_NAME: NULL
       EXTERNAL_LANGUAGE: NULL
         PARAMETER_STYLE: SQL
        IS_DETERMINISTIC: NO
         SQL_DATA_ACCESS: READS SQL DATA
                SQL_PATH: NULL
           SECURITY_TYPE: DEFINER
                 CREATED: 2018-05-31 15:26:07
            LAST_ALTERED: 2018-05-31 15:26:07
                SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
         ROUTINE_COMMENT:
                 DEFINER: root@localhost
    CHARACTER_SET_CLIENT: gbk
    COLLATION_CONNECTION: gbk_chinese_ci
      DATABASE_COLLATION: utf8_general_ci
1 row in set (0.01 sec)

3. 删除存储过程

mysql> drop procedure proce01;

Query OK, 0 rows affected (0.02 sec)


参考资料:《深入浅出MySQL》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL是一个流行的关系型数据库管理系统,支持存储过程,可以用来实现复杂的数据库操作。下面是一个MySQL复杂存储过程示例: 假设我们有两个表:用户表(user)和订单表(order),用户表包含用户的姓名(name)和年龄(age),订单表包含订单号(order_number)和金额(amount)。 我们的目标是创建一个存储过程,根据用户的姓名查询该用户的订单总金额。 首先,我们需要创建这两个表: ``` CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT ); CREATE TABLE order ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_number VARCHAR(50), amount DECIMAL(10, 2), FOREIGN KEY (user_id) REFERENCES user(id) ); ``` 然后,我们可以创建一个存储过程来实现这个功能: ``` DELIMITER // CREATE PROCEDURE get_order_total_amount(IN user_name VARCHAR(50), OUT total_amount DECIMAL(10, 2)) BEGIN SELECT SUM(amount) INTO total_amount FROM user u JOIN order o ON u.id = o.user_id WHERE u.name = user_name; END; // DELIMITER ; ``` 以上存储过程接受一个输入参数 `user_name`,通过 `JOIN` 来连接用户表和订单表,然后使用 `SUM` 函数计算订单总金额,并将结果保存到输出参数 `total_amount` 中。 我们可以调用这个存储过程来获取特定用户的订单总金额: ``` SET @user_name = '张三'; CALL get_order_total_amount(@user_name, @total_amount); SELECT @total_amount; ``` 以上代码中,我们通过设置用户姓名和定义一个变量来存储订单总金额,并通过调用存储过程来获取结果。 这个示例展示了如何使用MySQL存储过程实现复杂的数据库操作,包括表的创建存储过程的定义和调用等。存储过程可以帮助我们封装常用的数据库逻辑并提高数据库的性能和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值