本文主要介紹如何使用sql存儲(chǔ)過(guò)程簡(jiǎn)化復(fù)雜操作(如何使用sql存儲(chǔ)過(guò)程),下面一起看看如何使用sql存儲(chǔ)過(guò)程簡(jiǎn)化復(fù)雜操作(如何使用sql存儲(chǔ)過(guò)程)相關(guān)資訊。
內(nèi)容1。存儲(chǔ)過(guò)程2。為什么使用存儲(chǔ)過(guò)程3。執(zhí)行存儲(chǔ)過(guò)程4。創(chuàng)建存儲(chǔ)過(guò)程5。摘要本文介紹了什么是sql存儲(chǔ)過(guò)程,為什么使用存儲(chǔ)過(guò)程,如何使用存儲(chǔ)過(guò)程,以及創(chuàng)建和使用存儲(chǔ)過(guò)程的基本語(yǔ)法。
一、存儲(chǔ)過(guò)程到目前為止,我們使用的大多數(shù)sql語(yǔ)句都是針對(duì)一個(gè)或多個(gè)表的單語(yǔ)句。并不是所有的操作都這么簡(jiǎn)單,經(jīng)常會(huì)有一些復(fù)雜的操作需要多條語(yǔ)句才能完成,比如下面這種情況。
為了處理訂單,必須進(jìn)行檢查以確保庫(kù)存中有相應(yīng)的商品。如果物品有貨,需要預(yù)留,不會(huì)賣給別人,減少物品數(shù)據(jù),以反映正確的庫(kù)存。沒(méi)有庫(kù)存的項(xiàng)目需要訂購(gòu),這需要與供應(yīng)商進(jìn)行一些互動(dòng)。關(guān)于哪些物品入庫(kù)(并且可以立即發(fā)貨),哪些物品退訂,需要通知相應(yīng)的客戶。這顯然不是一個(gè)完整的例子,它甚至超出了本文的范圍,但它足以表達(dá)我們的意思。執(zhí)行這個(gè)過(guò)程需要對(duì)許多表使用多個(gè)sql語(yǔ)句。
此外,要執(zhí)行的具體sql語(yǔ)句及其順序并不固定,它們可能會(huì)根據(jù)物品是否在庫(kù)存中而變化。
那么,如何寫代碼呢?您可以單獨(dú)編寫每個(gè)sql語(yǔ)句,并根據(jù)結(jié)果有條件地執(zhí)行其他語(yǔ)句。每次需要這個(gè)過(guò)程時(shí)(以及每個(gè)需要它的應(yīng)用程序),都必須完成這些任務(wù)。
您可以創(chuàng)建存儲(chǔ)過(guò)程。簡(jiǎn)單地說(shuō),存儲(chǔ)過(guò)程是一個(gè)或多個(gè)保存起來(lái)供以后使用的sql語(yǔ)句。它們可以被視為批處理文件,盡管它們的功能并不僅限于批處理。
描述:不適用于sqlite。
sqlite不支持存儲(chǔ)過(guò)程。
說(shuō)明:還有。
存儲(chǔ)過(guò)程非常復(fù)雜,全面介紹需要很大篇幅。
市場(chǎng)上有專門介紹存儲(chǔ)過(guò)程的書籍。
本文不打算解釋存儲(chǔ)過(guò)程的全部?jī)?nèi)容,只是簡(jiǎn)單介紹一下,讓讀者了解一下它們的功能。
因此,這里給出的例子只提供了oracle和sql server的語(yǔ)法。
第二,為什么要使用存儲(chǔ)過(guò)程?我們知道什么是存儲(chǔ)過(guò)程,那么為什么要使用它們呢?原因有很多。以下是一些主要的。
通過(guò)將處理封裝在一個(gè)易于使用的單元中,可以簡(jiǎn)化復(fù)雜的操作(如前面的示例所述)。由于不需要重復(fù)建立一系列的處理步驟,保證了數(shù)據(jù)的一致性。如果所有開發(fā)人員和應(yīng)用程序使用相同的存儲(chǔ)過(guò)程,則使用的代碼是相同的。上一點(diǎn)的延伸是為了防止出錯(cuò)。需要執(zhí)行的步驟越多,出錯(cuò)的可能性就越大。防止錯(cuò)誤確保了數(shù)據(jù)的一致性。簡(jiǎn)化變更管理。如果表名、列名或業(yè)務(wù)邏輯(或其他內(nèi)容)發(fā)生變化,那么只需更改存儲(chǔ)過(guò)程的代碼。使用它的人不會(huì)。;我甚至不需要知道這些變化。上一點(diǎn)的延伸就是安全性。對(duì)基礎(chǔ)數(shù)據(jù)的訪問(wèn)受到存儲(chǔ)過(guò)程的限制,減少了數(shù)據(jù)損壞(無(wú)意識(shí)或其他原因造成的數(shù)據(jù)損壞)的幾率。因?yàn)榇鎯?chǔ)過(guò)程通常以編譯的形式存儲(chǔ),所以dbms處理命令的工作量減少了,性能也提高了。有一些sql元素和特性只能在單個(gè)請(qǐng)求中使用,存儲(chǔ)過(guò)程可以使用它們來(lái)編寫更強(qiáng)大、更靈活的代碼。換句話說(shuō),使用存儲(chǔ)過(guò)程有三個(gè)主要好處,即簡(jiǎn)單性、安全性和高性能。顯然,它們都很重要。但是,在將sql代碼轉(zhuǎn)換成存儲(chǔ)過(guò)程之前,您還必須了解它的一些缺點(diǎn)。
不同dbms中存儲(chǔ)過(guò)程的語(yǔ)法是不同的。事實(shí)上,要編寫一個(gè)真正可移植的存儲(chǔ)過(guò)程幾乎是不可能的。
然而,存儲(chǔ)過(guò)程的自調(diào)用(名稱和數(shù)據(jù)傳遞)可以保持相對(duì)的可移植性。
所以如果需要移植到另一個(gè)dbms上,至少客戶端應(yīng)用程序代碼不需要改動(dòng)。
一般來(lái)說(shuō),編寫存儲(chǔ)過(guò)程比編寫基本的sql語(yǔ)句更復(fù)雜,需要更高的技能和更豐富的經(jīng)驗(yàn)。
因此,許多數(shù)據(jù)庫(kù)管理員將限制存儲(chǔ)過(guò)程的創(chuàng)建作為一種安全措施(主要受前面缺陷的影響)。
盡管有這些缺點(diǎn),存儲(chǔ)過(guò)程還是非常有用的,應(yīng)該使用。事實(shí)上,大多數(shù)dbms都有各種用于管理數(shù)據(jù)庫(kù)和表的存儲(chǔ)過(guò)程。有關(guān)更多信息,請(qǐng)參見特定的dbms文檔。
描述:can 不寫存儲(chǔ)過(guò)程?你仍然可以使用它。
大多數(shù)dbms將編寫存儲(chǔ)過(guò)程所需的安全性和訪問(wèn)權(quán)限與執(zhí)行存儲(chǔ)過(guò)程所需的安全性和訪問(wèn)權(quán)限區(qū)分開來(lái)。
這是一件好事,即使你可以 t(或don 我不想)編寫自己的存儲(chǔ)過(guò)程,但是您仍然可以在適當(dāng)?shù)臅r(shí)候執(zhí)行其他存儲(chǔ)過(guò)程。
三、執(zhí)行存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程的執(zhí)行比編寫要頻繁得多,所以讓 讓我們首先介紹存儲(chǔ)過(guò)程的執(zhí)行。
執(zhí)行存儲(chǔ)過(guò)程的sql語(yǔ)句很簡(jiǎn)單,即execute。
execute接受存儲(chǔ)過(guò)程名和任何需要傳遞給它的參數(shù)。
看看下面的例子(你可以 因?yàn)榇鎯?chǔ)過(guò)程addnewproduct不支持。;尚不存在):
執(zhí)行add new product( ;jts01 , 填充埃菲爾鐵塔和。;,6.49, 長(zhǎng)毛絨玩具的文字拉圖爾埃菲爾鐵塔在紅色白色和藍(lán)色 );這里,執(zhí)行一個(gè)名為addnewproduct的存儲(chǔ)過(guò)程,向products表中添加一個(gè)新產(chǎn)品。
addnewproduct有四個(gè)參數(shù)。,即:供應(yīng)商id(供應(yīng)商表的主鍵)、產(chǎn)品名稱、價(jià)格和描述。
這四個(gè)參數(shù)匹配存儲(chǔ)過(guò)程中的四個(gè)預(yù)期變量(定義為存儲(chǔ)過(guò)程本身的組件)。此存儲(chǔ)過(guò)程向products表中添加一個(gè)新行,并將傳入的屬性分配給相應(yīng)的列。
我們注意到在products表中有另一個(gè)列prod_id需要一個(gè)值,它是這個(gè)表的主鍵。
為什么這個(gè)值沒(méi)有作為屬性傳遞給存儲(chǔ)過(guò)程?為了確保正確生成這個(gè)id,最好自動(dòng)生成這個(gè)id(而不是依賴終端用戶的輸入)。
這就是這個(gè)例子使用存儲(chǔ)過(guò)程的原因。這里 存儲(chǔ)過(guò)程的作用是:
驗(yàn)證傳遞的數(shù)據(jù),確保四個(gè)參數(shù)都有值;生成一個(gè)用作主鍵的唯一id;將新產(chǎn)品插入到products表中,并將生成的主鍵和傳遞的數(shù)據(jù)存儲(chǔ)在適當(dāng)?shù)牧兄小_@是存儲(chǔ)過(guò)程執(zhí)行的基本形式。對(duì)于特定的dbms,可能包括以下執(zhí)行選項(xiàng)。
參數(shù)是可選的,并且在沒(méi)有提供參數(shù)時(shí)具有默認(rèn)值。參數(shù)沒(méi)有按順序給出,參數(shù)值以 參數(shù)=值 。輸出參數(shù),允許存儲(chǔ)過(guò)程更新正在執(zhí)行的應(yīng)用程序中使用的參數(shù)。用select語(yǔ)句檢索數(shù)據(jù)。允許存儲(chǔ)過(guò)程向正在執(zhí)行的應(yīng)用程序返回值的返回代碼。四、創(chuàng)建存儲(chǔ)過(guò)程如前所述,存儲(chǔ)過(guò)程的編寫非常重要。為了獲得感性認(rèn)識(shí),讓 讓我們看一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程的例子,它計(jì)算郵件列表中有電子郵件地址的客戶。
以下是該流程的oracle版本:
create procedure mailing list count(list count out integer)isv _ rows integer;從not cust_email為空的客戶開始選擇count(*)到v _ rowslist count : = v _ rows;結(jié)束;這個(gè)存儲(chǔ)過(guò)程有一個(gè)名為listcount的參數(shù)。此參數(shù)從存儲(chǔ)過(guò)程返回值,而不是將值傳遞給存儲(chǔ)過(guò)程。
關(guān)鍵字out用于表示這種行為。oracle支持in(向存儲(chǔ)過(guò)程傳遞值)、out(從存儲(chǔ)過(guò)程返回值,如此處所示)和inout(向存儲(chǔ)過(guò)程傳遞值和從存儲(chǔ)過(guò)程返回值)類型的參數(shù)。
存儲(chǔ)過(guò)程的代碼包含在begin和end語(yǔ)句中,其中執(zhí)行了一個(gè)簡(jiǎn)單的select語(yǔ)句,該語(yǔ)句檢索帶有電子郵件地址的客戶。然后用檢索到的行數(shù)設(shè)置listcount(要傳遞)。輸出參數(shù))。
調(diào)用oracle示例如下:
var return value number exec mailing list count(: return value);選擇returnvalue這段代碼聲明一個(gè)變量來(lái)保存存儲(chǔ)過(guò)程返回的任何值,然后執(zhí)行存儲(chǔ)過(guò)程,再用select語(yǔ)句顯示返回值。
以下是此過(guò)程的sql server版本。
create procedure mailinglistcountasdeclare @ cnt integer select @ cnt = count(*)from customers where not cust _ email為空;return @ cnt此存儲(chǔ)過(guò)程沒(méi)有參數(shù)。調(diào)用程序檢索sql server返回代碼提供的值。
其中,一個(gè)名為@cnt的局部變量是用declare語(yǔ)句聲明的(sql server中所有的局部變量名稱都是以@開頭的);
然后在select語(yǔ)句中使用這個(gè)變量來(lái)包含count函數(shù)返回的值;最后,使用return @cnt語(yǔ)句將計(jì)數(shù)返回給調(diào)用程序。
調(diào)用sql server示例如下:
declare @ return value in execute @ return value = mailing list count;select @ returnvalue這段代碼聲明一個(gè)變量來(lái)保存存儲(chǔ)過(guò)程返回的任何值,然后執(zhí)行存儲(chǔ)過(guò)程,再用select語(yǔ)句顯示返回值。
下面是另一個(gè)例子,這次是在orders表中插入一個(gè)新訂單。這個(gè)程序只適用于sql server,但是它說(shuō)明了存儲(chǔ)過(guò)程的一些用途和技術(shù):
create procedure new order @ cust _ id char(10)as-聲明變量declare @order_num integer -對(duì)于訂單號(hào)-獲取當(dāng)前最大訂單號(hào)select @order_num=max(order_num)。從訂單-確定下一個(gè)訂單編號(hào)select @ order _ num = @ order _ num 1-將新訂單插入orders (order _ num,order _ date,cust _ id)值(@ order _ num,getdate,@ c。ust _ id)-返回訂單號(hào)return @ order _ num此存儲(chǔ)過(guò)程在orders表中創(chuàng)建新訂單。
它只有一個(gè)參數(shù),即下訂單的客戶的id。訂單號(hào)和訂單日期在存儲(chǔ)過(guò)程中自動(dòng)生成。
代碼首先聲明一個(gè)局部變量來(lái)存儲(chǔ)訂單號(hào)。接下來(lái),檢索當(dāng)前的最大訂單號(hào)(使用max函數(shù))并將其增加1(使用select語(yǔ)句)。
然后使用insert語(yǔ)句插入一個(gè)由新生成的訂單號(hào)、當(dāng)前系統(tǒng)日期(由getdate函數(shù)檢索)和傳遞的客戶id組成的訂單。
最后,使用return @order_num返回訂單號(hào)(需要它來(lái)處理訂購(gòu)的商品)。
請(qǐng)注意這段代碼是注釋的,在編寫存儲(chǔ)過(guò)程時(shí)應(yīng)該添加更多的注釋。
描述:注釋代碼
所有代碼都應(yīng)該被注釋,存儲(chǔ)過(guò)程也不例外。添加注釋不影響性能,所以沒(méi)有缺陷(除了增加寫時(shí)間)。
注釋代碼有很多好處,包括讓別人(和你自己)更容易理解和更安全地修改代碼。
注釋代碼的標(biāo)準(zhǔn)是在代碼前面加上-(兩個(gè)連字符)。
有些dbms還支持其他注釋語(yǔ)法,但所有dbms都支持-,所以在注釋代碼時(shí)最好使用這種語(yǔ)法。
以下是同一sql server代碼的一個(gè)非常不同的版本:
create procedure new order @ cust _ id char(10)as-insert new order insert into orders(cust _ id)values(@ cust _ id)-return order num select order _ num = @ @ identity;此存儲(chǔ)過(guò)程還在orders表中創(chuàng)建新訂單。這一次,dbms生成訂單號(hào)。
大多數(shù)數(shù)據(jù)庫(kù)管理系統(tǒng)支持這一功能;在sql server中,這些自動(dòng)遞增的列稱為標(biāo)識(shí)字段,而在其他dbms中,它們稱為自動(dòng)編號(hào)或序列。
傳遞給該流程的參數(shù)也是一個(gè),即下訂單的客戶id。
沒(méi)有給出訂單編號(hào)和訂單日期,dbms使用默認(rèn)值(getdate函數(shù))作為日期,訂單編號(hào)是自動(dòng)生成的。
如何獲取這個(gè)自動(dòng)生成的id?在sql server上,可以在全局變量@@identity中獲得,該變量返回到調(diào)用程序(這里使用select語(yǔ)句)。
正如您所看到的,在存儲(chǔ)過(guò)程的幫助下,有許多方法可以完成同樣的工作。然而,所選擇的方法受到所使用的dbms的特性的限制。
五.總結(jié)書本文介紹了什么是存儲(chǔ)過(guò)程以及為什么使用存儲(chǔ)過(guò)程。我們介紹了執(zhí)行和創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)法,以及使用存儲(chǔ)過(guò)程的一些方法。
存儲(chǔ)過(guò)程是一個(gè)非常重要的主題,一篇文章不可能涵蓋所有內(nèi)容。
各種dbms有不同的存儲(chǔ)過(guò)程實(shí)現(xiàn)。您使用的dbms可能會(huì)提供這里提到的一些功能,但還有其他功能沒(méi)有提到。有關(guān)更詳細(xì)的介紹,請(qǐng)參考特定的dbms文檔。
原文鏈接: -stored-procedures/
(完)
標(biāo)簽:
存儲(chǔ)過(guò)程語(yǔ)句
了解更多如何使用sql存儲(chǔ)過(guò)程簡(jiǎn)化復(fù)雜操作(如何使用sql存儲(chǔ)過(guò)程)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。
4g卡能用5G手機(jī)嗎(4g卡能用5g手機(jī)嗎 速度怎么樣)
win10企業(yè)版系統(tǒng)怎么轉(zhuǎn)換為專業(yè)版的(win10企業(yè)版怎么轉(zhuǎn)換成專業(yè)版)
內(nèi)置手機(jī)電池怎么更換,oppo怎樣換電池視頻
6s的照片導(dǎo)入11(怎么把6s手機(jī)里照片全部導(dǎo)入到電腦)
2021年2000左右的手機(jī)推薦哪個(gè)比較好(2021年2000元左右的手機(jī)哪款性價(jià)比最高)
如何使用 sql 存儲(chǔ)過(guò)程簡(jiǎn)化復(fù)雜的操作(sql怎么使用存儲(chǔ)過(guò)程)_1
windows替換蘋方字體(win10更換字體為蘋果字體)
充電寶歸還了為什么還顯示在使用怎么辦(充電寶歸還了為什么還顯示在使用是不是還繼續(xù)扣費(fèi)著)
路由器的基本技術(shù)與協(xié)議是什么(路由器的基本技術(shù)與協(xié)議的關(guān)系)
ps沒(méi)有字體怎么改字體顏色(ps字體怎么改變)
水維修電話是多少,您好天津塘沽的自來(lái)水公司的維修電話是多少
電腦主機(jī)一般多少瓦,電腦一般多少瓦
密室逃脫18紅藍(lán)黃的轉(zhuǎn)盤(密室逃脫18旋轉(zhuǎn)紅黃藍(lán))
電腦桌面背景圖片唯美清新(電腦桌面背景可愛(ài)高清)
華碩電腦官方客服熱線號(hào)碼,ASUS客服
顯卡安裝后顯示器不顯示,顯卡風(fēng)扇會(huì)轉(zhuǎn)就是屏幕不亮
抖音隨拍是什么標(biāo)簽(抖音隨拍是什么類型)
win 10筆記本怎么開啟麥克風(fēng)(筆記本windows10麥克風(fēng)沒(méi)聲音怎么設(shè)置)
win7任務(wù)欄怎么透明度(windows7任務(wù)欄怎么透明)
微信uwp與微信forwindows區(qū)別(wxfor和wxkey是什么用)