11.【轉(zhuǎn)】python調(diào)mysql 帶輸入?yún)?shù)的存儲(chǔ)過(guò)程

原文:https://blog.ansheng.me/article/python-full-stack-way-mysql-stored-procedures

Python全棧之路系列之MySQL存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程是一個(gè)SQL語(yǔ)句集合埋虹,當(dāng)主動(dòng)去調(diào)用存儲(chǔ)過(guò)程時(shí),其中內(nèi)部的SQL語(yǔ)句會(huì)按照邏輯執(zhí)行涂滴。

存儲(chǔ)過(guò)程過(guò)接收的參數(shù)

參數(shù)描述

in僅用于傳入?yún)?shù)用

out僅用于返回值用

inout既可以傳入又可以當(dāng)作返回值

創(chuàng)建存儲(chǔ)過(guò)程

創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程

-- 修改SQL語(yǔ)句的結(jié)束符為%delimiter%-- 創(chuàng)建這個(gè)存儲(chǔ)過(guò)程先刪除DROPPROCEDUREIFEXISTSproc_p1%CREATEPROCEDUREproc_p1()-- 開(kāi)始BEGIN-- SQL語(yǔ)句塊select*fromcolor;-- 結(jié)束END%-- 把SQL語(yǔ)句的結(jié)束符改為;delimiter;

通過(guò)call調(diào)用存儲(chǔ)過(guò)程

callproc_p1();

輸出為

+-----+--------+| nid | title? |+-----+--------+|? 1 | red? ? ||? 2 | yellow |+-----+--------+2 rowsinset(0.00 sec)Query OK, 0 rows affected(0.01 sec)

刪除存儲(chǔ)過(guò)程

DROPPROCEDUREproc_p1;

實(shí)例

創(chuàng)建一個(gè)存儲(chǔ)過(guò)程凰狞,接收一個(gè)參數(shù)办铡,傳入的參數(shù)就是顯示數(shù)據(jù)的個(gè)數(shù)贯钩,

delimiter%DROPPROCEDUREIFEXISTSproc_p1%createPROCEDUREproc_p1(-- i1就是傳入的參數(shù),傳入的數(shù)據(jù)類型必須是int類型ini1int)BEGIN-- 定義兩個(gè)局部變量d1和d2惯裕,數(shù)據(jù)類型都為int隅很,d1默認(rèn)值為空撞牢,d2默認(rèn)值為1DECLAREd1int;DECLAREd2intDEFAULT1;-- d1的值等于傳入過(guò)來(lái)的i1加上定義的局部變量d2的值SETd1=i1+d2;-- 查找person_info表中的nid大于d1的數(shù)據(jù)SELECT*FROMperson_infoWHEREnid>d1;END%delimiter;

查詢,括號(hào)內(nèi)輸入定義的參數(shù)

CALL proc_p1(4);

顯示結(jié)果

+-----+------+------------------+-------------+----------+----------+---------+-----------+| nid | name | email? ? ? ? ? ? | phone? ? ? | part_nid | position | caption | color_nid |+-----+------+------------------+-------------+----------+----------+---------+-----------+|? 6 | w? ? | as@anshengme.com | 13800138000 |? ? ? ? 5 | Python? | NULL? ? |? ? ? NULL ||? 9 | aa? | a@ansheng.me? ? | 13800138000 |? ? ? ? 3 | DBA? ? ? | NULL? ? |? ? ? ? 2 ||? 10 | b? ? | b.ansheng.me? ? | 13800138000 |? ? ? ? 3 | DBA? ? ? | NULL? ? |? ? ? ? 1 |+-----+------+------------------+-------------+----------+----------+---------+-----------+3 rowsinset(0.00 sec)Query OK, 0 rows affected(0.01 sec)

這次把nid大于5的數(shù)據(jù)全部輸出出來(lái)了外构,傳入的值是4普泡,我們?cè)趦?nèi)部讓4+1了,所以就是大于5的數(shù)據(jù).

delimiter%DROPPROCEDUREIFEXISTSproc_p1%createPROCEDUREproc_p1(-- 接收了三個(gè)參數(shù)审编,類型都是intini1int,inoutiiint,outi2int)BEGIN-- 定義一個(gè)局部變量d2,默認(rèn)值是3歧匈,數(shù)據(jù)類型為intDECLAREd2intDEFAULT3;-- ii = ii + 1setii=ii+1;-- 如果傳入的i1等于1IFi1=1THEN-- i2 = 100 + d2seti2=100+d2;-- 如果傳入的i1等于2ELSEIFi1=2THEN-- i2 = 200 + d2seti2=200+d2;-- 否則ELSE-- i2 = 1000 + d2seti2=1000+d2;ENDIF;END%delimiter;

查看數(shù)據(jù)

set@o=5;CALLproc_p1(1,@o,@u);SELECT@o,@u;

顯示的結(jié)果

+------+------+| @o? | @u? |+------+------+|? ? 6 |? 103 |+------+------+1 rowinset(0.00 sec)

使用pymysql模塊操作存儲(chǔ)過(guò)程

Python代碼為:

importpymysqlconn=pymysql.connect(host="127.0.0.1",port=3306,user='root',passwd='as',db="dbname")cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)# 執(zhí)行存儲(chǔ)過(guò)程row=cursor.callproc("proc_p2",(1,2,3))# 存儲(chǔ)過(guò)程的查詢結(jié)果selc=cursor.fetchall()print(selc)# 獲取存儲(chǔ)過(guò)程返回effect_row=cursor.execute('select @_proc_p2_0, @_proc_p2_1, @_proc_p2_2')# 取存儲(chǔ)過(guò)程返回值result=cursor.fetchone()print(result)conn.commit()cursor.close()conn.close()

顯示的結(jié)果

C:\Python\Python35\python.exe D:/PycharmProjects/pymysql_存儲(chǔ)過(guò)程.py[{'nid': 1,'name':'man1'},{'nid': 2,'name':'man2'},{'nid': 3,'name':'man3'}]{'@_proc_p2_1': 3,'@_proc_p2_0': 1,'@_proc_p2_2': 103}Process finished withexitcode 0

存儲(chǔ)過(guò)程使用into

into其實(shí)就是把一個(gè)select的執(zhí)行結(jié)果當(dāng)作另一個(gè)select的參數(shù)垒酬,例如下面的實(shí)例:

delimiter%DROPPROCEDUREIFEXISTSproc_p2%CREATEPROCEDUREproc_p2()BEGIN-- 定義一個(gè)局部變量n,類型為intDECLAREnint;-- 獲取color_nid = 2的數(shù)據(jù)并賦值給nSELECTcolor_nidintonFROMperson_infowherecolor_nid=2;-- 輸出nid = n的數(shù)據(jù)SELECT*fromcolorWHEREnid=n;END%delimiter;

執(zhí)行

call proc_p2();

結(jié)果

+-----+--------+| nid | title? |+-----+--------+|? 2 | yellow |+-----+--------+1 rowinset(0.00 sec)Query OK, 0 rows affected(0.01 sec)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末件炉,一起剝皮案震驚了整個(gè)濱河市勘究,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斟冕,老刑警劉巖口糕,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異磕蛇,居然都是意外死亡景描,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)秀撇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)超棺,“玉大人,你說(shuō)我怎么就攤上這事呵燕√幕妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵再扭,是天一觀的道長(zhǎng)氧苍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泛范,這世上最難降的妖魔是什么让虐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮敦跌,結(jié)果婚禮上澄干,老公的妹妹穿的比我還像新娘逛揩。我一直安慰自己,他們只是感情好麸俘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布辩稽。 她就那樣靜靜地躺著,像睡著了一般从媚。 火紅的嫁衣襯著肌膚如雪逞泄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天拜效,我揣著相機(jī)與錄音喷众,去河邊找鬼。 笑死紧憾,一個(gè)胖子當(dāng)著我的面吹牛到千,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赴穗,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼憔四,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了般眉?” 一聲冷哼從身側(cè)響起了赵,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甸赃,沒(méi)想到半個(gè)月后柿汛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埠对,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年络断,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠窗。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妓羊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稍计,到底是詐尸還是另有隱情躁绸,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布臣嚣,位于F島的核電站净刮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硅则。R本人自食惡果不足惜淹父,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怎虫。 院中可真熱鬧暑认,春花似錦困介、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至粮彤,卻和暖如春根穷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背导坟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工屿良, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惫周。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓尘惧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闯两。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褥伴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自這里 存儲(chǔ)過(guò)程簡(jiǎn)介 我們常用的操作數(shù)據(jù)庫(kù)語(yǔ)言SQL語(yǔ)句在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行漾狼,而存儲(chǔ)過(guò)程(Sto...
    杜七閱讀 2,379評(píng)論 4 27
  • 原文鏈接 MySQL存儲(chǔ)過(guò)程詳解 1.存儲(chǔ)過(guò)程簡(jiǎn)介 我們常用的操作數(shù)據(jù)庫(kù)語(yǔ)言SQL語(yǔ)句在執(zhí)行的時(shí)候需要要先編譯,然...
    亞斯咪妮閱讀 2,670評(píng)論 1 30
  • mysql 高級(jí)語(yǔ)句 一饥臂、存儲(chǔ)過(guò)程 1.什么是存儲(chǔ)過(guò)程: 就是一組SQL語(yǔ)句集逊躁,功能強(qiáng)大,可以實(shí)現(xiàn)一些比較復(fù)雜的邏...
    君滿樓001閱讀 3,071評(píng)論 0 0
  • oracle存儲(chǔ)過(guò)程常用技巧 我們?cè)谶M(jìn)行pl/sql編程時(shí)打交道最多的就是存儲(chǔ)過(guò)程了隅熙。存儲(chǔ)過(guò)程的結(jié)構(gòu)是非常的簡(jiǎn)單的...
    dertch閱讀 3,476評(píng)論 1 12
  • 圖片發(fā)自簡(jiǎn)書(shū)App 1 在醫(yī)院的病房里看見(jiàn)陳飛的時(shí)候稽煤,陳飛正在歪著頭看著窗外的風(fēng)景,怔怔的在想些什么囚戚,夏玲推開(kāi)房門(mén)...
    蜃言閱讀 404評(píng)論 0 2