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