MySQL 存儲過程返回多個值


MySQL  存儲過程返回多個值

 

在本教程中,您將學習如何編寫/開發返回多個值的存儲過程。

MySQL存儲函數只返回一個值。要開發返回多個值的存儲過程,需要使用帶有INOUTOUT參數的存儲過程。

返回多個值的存儲過程示例

我們看看 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,執行程序即可,不在產生警告。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM