如何使用 sql 存儲過程簡化復(fù)雜的操作(sql怎么使用存儲過程)_1

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

硬盤接口種類圖片,IDE SATA 和SATA2 硬盤的接口如何分別
智能電視中HDMI與RJ45接口的ESD保護方案
愛奇藝崩潰是因為什么電視劇(愛奇藝視頻為什么閃退怎么辦)
歐姆龍CPM1A系列PLC程序和指令的理解方法
生活泵房設(shè)計一般說明有哪些?
怎么刪除云空間里面的內(nèi)容(怎樣刪除云空間的內(nèi)容記錄)
1210W2F2740T5E今日價格,在線查庫存
手機端怎么拍套餐,手機如何查套餐
三招教你辨別春茶、夏茶和秋茶
凍土地基樁基礎(chǔ)施工要點
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos