1. 程式人生 > >8.7.4 mysql 內置功能 - 存儲過程

8.7.4 mysql 內置功能 - 存儲過程

hal rom () odi .py int student 存儲過程 查看

一 存儲過程

一 存儲過程介紹

存儲過程包含了一系列可執行的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

8.7.4 mysql 內置功能 - 存儲過程