8.7.4 mysql 內置功能 - 存儲過程
阿新 • • 發佈:2018-03-17
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 內置功能 - 存儲過程