8.7.4 mysql 内置功能 - 存储过程

一 存储过程

一 存储过程介绍

存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

使用存储过程的优点:

#1. 用于替代程序写的SQL语句,实现程序与sql解耦
#2. 基于网络传输,传别名的数据量小,而直接传sql数据量大

使用存储过程的缺点:

#1. 程序员扩展功能不方便

补充:程序与数据库结合使用的三种方式

#方式一:
    MySQL:存储过程
    程序:调用存储过程

#方式二:
    MySQL:
    程序:纯SQL语句

#方式三:
    MySQL:
    程序:类和对象,即ORM(本质还是纯SQL语句)

二 创建简单存储过程(无参)

delimiter //
create procedure p1()
BEGIN
    select * from score;
END //
delimiter ;

#在mysql中调用
call p1() 

#在python中基于pymysql调用
cursor.callproc(‘p1‘)
print(cursor.fetchall())

mysql> use cmz;
Database changed
mysql> show tables;
+---------------+
| Tables_in_cmz |
+---------------+
| class         |
| class_grade   |
| course        |
| score         |
| student       |
| teacher       |
| teacher2cls   |
+---------------+
7 rows in set (0.00 sec)

mysql> delimiter //  # 表示sql语句的结束是// 而不是;
mysql> create procedure p1()
    -> BEGIN
    ->     select * from score;
    -> END //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ; # 还原sql语句的结束标志位;
mysql> call p1();  # 调用存储过程
+-----+------------+-----------+-------+
| sid | student_id | course_id | score |
+-----+------------+-----------+-------+
|   1 |          1 |         1 |    60 |
|   2 |          1 |         2 |    59 |
|   3 |          2 |         2 |    59 |
|   4 |          3 |         2 |    80 |
+-----+------------+-----------+-------+
4 rows in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

操作过程

pycharm下调用存储过程

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
import pymysql

# 建立连接
conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="cmz",
    passwd="cmz",
    db="cmz",    # 建有存储过程的库
    charset="utf8"
)

# 拿到游标
cursor = conn.cursor()
cursor.callproc("p1")  # 调用存储过程,p1 位存储过程名字
print(cursor.fetchall())  # 拿到数据

cursor.close()
conn.close()

结果是

C:\Python35\python.exe D:mysql模块之存储过程.py
((1, 1, 1, 60), (2, 1, 2, 59), (3, 2, 2, 59), (4, 3, 2, 80))

结果和在终端上一致

三 创建存储过程(有参)

对于存储过程,可以接收参数,其参数有三类:
#in          仅用于传入参数用
#out         仅用于返回值用
#inout       既可以传入又可以当作返回值
mysql> delimiter //
mysql> create procedure p2(in n1 int,in n2 int,out res int)
    -> BEGIN
    ->     select * from score where course_id=n1 and score >n2 ;
    ->     set res = 1;
    -> END //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> set @x=0;
Query OK, 0 rows affected (0.00 sec)

mysql> call p2(2,60,@x);  # 在mysql中调用
+-----+------------+-----------+-------+
| sid | student_id | course_id | score |
+-----+------------+-----------+-------+
|   4 |          3 |         2 |    80 |
+-----+------------+-----------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> select @x; # 查看执行后的结果
+------+
| @x   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

在pycharm中

import pymysql

# 建立连接
conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="cmz",
    passwd="cmz",
    db="cmz",
    charset="utf8"
)

# 拿到游标
cursor = conn.cursor()
cursor.callproc(‘p2‘,(2,60,0))   # 在python中基于pymysql调用,0 相当于set @x=0
print(cursor.fetchall())
cursor.execute("select @_p2_2")  # @_p2_0=2 表示第一个参数,@_p2_1=60 表示第二个参数,@_p2_2=0表示第三个参数
print(cursor.fetchall())         # 查询select查询结果

cursor.close()
conn.close()

结果

C:\Python35\python.exe D:MySQL/mysql模块之存储过程.py
((4, 3, 2, 80),)
((1,),)

应用程序与数据库结合使用
方式1:
python: 调用存储过程
MySQL: 编写存储过程

方式2:
Python 编写纯生SQL
MySQL

方式3:
Python ORM->纯生SQL
MySQL

原文地址:https://www.cnblogs.com/caimengzhi/p/8586538.html

时间: 2024-08-29 20:30:00

8.7.4 mysql 内置功能 - 存储过程的相关文章

mysql 内置功能 存储过程 删除存储过程

删除存储过程 drop procedure proc_name; 原文地址:https://www.cnblogs.com/mingerlcm/p/9947770.html

mysql 内置功能目录

mysql 内置功能 视图介绍  mysql 内置功能 视图 使用 mysql 内置功能 触发器介绍  mysql 内置功能 触发器 实验 原文地址:https://www.cnblogs.com/mingerlcm/p/9953649.html

mysql内置功能

事务 事务由一个或多个sql语句组成一个整体,如果所有的语句执行成功那么修改将会全部生效,如一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的语句都执行成功才会将修改加入到数据库中. 特性: 事务具体四大特性,也就是经常说的ACID 1. 原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响.   2. 一

数据库:mysql内置功能-事务

一 事物 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); #原子操作 start transacti

14 MySQL 内置功能--视图/触发器

#视图 select * from course inner join teacher on course.teacher_id=teacher.tid; create view course2teacher as select * from course inner join teacher on course.teacher_id=teacher.tid; #触发器 CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR

数据库:mysql内置功能-触发器

一 触发器 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 一 创建触发器 # 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN ... END # 插入后 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN ... END # 删除前 CREATE TRIG

数据库:mysql内置功能-视图

一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql>

mysql 内置功能 函数 date_format函数

创建数据库db12 create database db12 charset=utf8; use db12; 准备表和记录 CREATE TABLE blog ( id INT PRIMARY KEY auto_increment, NAME CHAR (32), sub_time datetime ); 插入记录 INSERT INTO blog (NAME, sub_time) VALUES ('第1篇','2015-03-01 11:31:21'), ('第2篇','2015-03-11

mysql 内置功能 视图介绍

之前的多表查询本质是把多张有关系的表连接在一起组成一张虚拟表,从而进行查询 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意