MySQL 存儲過程返回多個值
在本教程中,您將學習如何編寫/開發返回多個值的存儲過程。
MySQL存儲函數只返回一個值。要開發返回多個值的存儲過程,需要使用帶有INOUT
或OUT
參數的存儲過程。
返回多個值的存儲過程示例
我們看看 orderinfo 表
表中數據
以下存儲過程接受點買家姓名,並返回各個狀態的訂單總數。
-- 手動創建存儲過程 CheckOrderStatus use test; DROP PROCEDURE IF EXISTS CountOrderByStatus; DELIMITER $$ use test$$ CREATE PROCEDURE CheckOrderStatus( IN cust_name VARCHAR(20), OUT 50Count INT, OUT 60Count INT, OUT 80Count INT, out 90Count INT) BEGIN -- 50Count SELECT count(*) INTO 50Count FROM orderinfo WHERE buyer_name = cust_name AND order_status = '50'; -- 60Count SELECT count(*) INTO 50Count FROM orderinfo WHERE buyer_name = cust_name AND order_status = '60'; -- 80Count SELECT count(*) INTO 50Count FROM orderinfo WHERE buyer_name = cust_name AND order_status = '80'; -- 90Count SELECT count(*) INTO 50Count FROM orderinfo WHERE buyer_name = cust_name AND order_status = '90'; END$$ DELIMITER ;
除IN
參數之外,存儲過程還需要4
個額外的OUT
參數:50Count, 50Count, 50Count 和 50Count。 在存儲過程中,使用帶有COUNT函數的SELECT語句根據訂單狀態獲取相應的訂單總數,並將其分配給相應的參數。
要使用CountOrderByStatus存儲過程,可以傳遞客戶名稱和四個用戶定義的變量來獲取輸出值。
執行存儲過程后,使用SELECT
語句輸出變量值。
call CheckOrderStatus('哪吒',@50Count,@60Count,@80Count,@90Count); SELECT @50Count,@60Count,@80Count,@90Count;
從Python調用返回多個值的存儲過程
以下代碼片段顯示如何從Python程序中調用返回多個值的存儲過程。
import pymysql def callProcedure1(name): '''調用存儲過程, 輸入參數:姓名,輸出:統計狀態數; 使用輸出參數方式''' count1 = '' count2 = '' count3 = '' count4 = '' db = pymysql.connect('127.0.0.1','adil','helloyyj','test',3306,charset='UTF8') cur = db.cursor() # 調用 CheckOrderStatus 存儲過程,傳入4個參數 cur.callproc('CheckOrderStatus', args= (name, count1, count2, count3,count4)) # 以 python 固定格式獲取返回的值:@_存儲過程名_0, 第一個返回值 t = cur.execute('SELECT @_CheckOrderStatus_0,@_CheckOrderStatus_1,@_CheckOrderStatus_2,@_CheckOrderStatus_3;') print(t) data = cur.fetchall() print(data) if data : for rec in data: for i in range(len(rec)): print(rec[i]) cur.close() db.close() def callProcedure12(name): '''調用存儲過程, 輸入參數:編號,在線時間,輸出:帳號,密碼; 使用select返回記錄方式''' db = pymysql.connect('127.0.0.1', 'adil', 'helloyyj', 'test1', 3306, charset='UTF8') cur =db.cursor() # 調用 存儲過程 cur.execute('call CheckOrderStatus1("哪吒",@50Count,@60Count,@80Count,@90Count)') # 執行 select 獲取 參數返回值 t1 = cur.execute('SELECT @50Count,@60Count,@80Count,@90Count;') print(t1) data=cur.fetchall() print(data) if data : for rec in data: for i in range(len(rec)): print(rec[i]) cur.close() db.close() if __name__=='__main__': # callProcedure1('哪吒') callProcedure12('哪吒')
遇到的問題:
有上可知,程序執行成功了,但是有一個Warning。
Warning: (3719, "'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.") result = self._query(query) # 3719,“3719:'utf8'目前是該別名的別名 字符集UTF8MB3,將來會被UTF8MB4取代 發布。請考慮使用UTF8MB4以明確無誤。
所以新建了一個數據庫 test1,字符集為:utf8mb4,如下。
再次創建存儲過程 CheckOrderStatus1,執行程序即可,不在產生警告。