【數據庫知識掃描】 | SQL複習-末篇 復學第19課 使用存儲過程

之所以這一篇又開始學習,之前使用markdown版本,觀感不是那麼自然,所以一直沒有完成。而我沉迷於心態的各種調整與周遭環境的動態適應中,沒有動起筆,完成這篇早就該在四月底完成的博文(課程學習)。

所以,譴責的話要少講一點。學習的動力提升一點,比如,順利畢業什麼的。

這節複習課就從存儲過程開始講起,首先我們要知道,我們學習的存儲過程到底是個什麼東西?

19.1 存儲過程

這就要跟我們前面學習到的大多數SQL語句聯繫起來,那些針對一表或多表操作的單條語句完成了,許多業務場景下的數據需求。但實際業務場景下,我們操出一條一條的SQL語句來滿足數據需求,不太現實,所以需要有多條語句組合起來,完成以下這些情況的目標:

  • □ 爲了處理訂單,必須覈對以保證庫存中有相應的物品。

  • □ 如果物品有庫存,需要預定,不再出售給別的人,並且減少物品數據以反映正確的庫存量。

  • □ 庫存中沒有的物品需要訂購,這需要與供應商進行某種交互。

  • □ 關於哪些物品入庫(並且可以立即發貨)和哪些物品退訂,需要通知相應的顧客。

上面這些情況,並不罕見,業務中很多處理確實需要針對多表操作(雖然身爲學習者的我並沒有多少多表經驗),需要執行的具體SQL語句次序啥的也不固定,可能根據庫存物品餘量而變化。

那麼我們的代碼編寫工作,就可以創建一個存儲過程,存儲過程就是爲了多次使用而保存的一或多條SQL語句,理解成批文件,和有些腳本文件類似,雖然它們的作用並不僅僅爲批處理。

加個備註:因爲Access和SQLite不支持存儲過程,而MySQL 5 已經支持存儲過程(最開始的學習介紹已經提到過,這次的複習使用MySQL的版本是5.7,所以可以順利跟進)。書裏只提到Oracle和SQL Server的語法,如果我需要MySQL,我肯定會直接上網搜的(希望看到學習筆記的你,有需要也自行檢索)。

19.2 爲什麼要使用存儲過程

瞭解存儲過程是啥,那麼我們爲啥用它,這裏我還沒往下看,大概率猜測一下,節省重複勞動。再來看看書上的,書上這樣提到:

□ 通過把處理封裝在一個易用的單元中,可以簡化複雜的操作。

□ 由於不要求反覆建立一系列處理步驟,因而保證了數據的一致性。如果所有開發人員和應用程序都使用同一存儲過程,則所使用的代碼都是相同的。這一點的延伸就是防止錯誤。需要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了數據的一致性。□ 簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容)有變化,那麼只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化。這一點的延伸就是安全性。通過存儲過程限制對基礎數據的訪問,減少了數據訛誤(無意識的或別的原因所導致的數據訛誤)的機會。

□ 因爲存儲過程通常以編譯過的形式存儲,所以DBMS處理命令所需的工作量少,提高了性能。

□ 存在一些只能用在單個請求中的SQL元素和特性,存儲過程可以使用它們來編寫功能更強更靈活的代碼。

我並不打算把這段內容展開來說,一是一眼掃過去,感覺把簡單的東西複雜化了,二是下面有個很準確的概括,就是簡單、安全、高性能

這當然算是存儲過程的優點,也是我們選擇它解決需求的理由,但它有沒有不好的地方?當然。

如果算是不同DBMS語法不同的話,可移植性不高是一個。

另外,編寫它並不是什麼簡單的事情,我們需要再學習學習,簡單的基本SQL語句會了不一定能寫出準確優美的存儲過程,這裏提到許多DBA(數據庫管理員,後不再說明)把限制存儲過程的創建作爲安全措施。

具體編寫,得參看相應的DBMS文檔。大多數DBMS將編寫存儲過程所需的安全和訪問權限與執行存儲過程所需的安全和訪問權限區分開了,即使不編寫自己的存儲過程,也能用別人的。

19.3 執行存儲過程

那麼,我們還是來看看怎麼執行,怎麼使用。一次編寫,多次執行。

執行的SQL語句爲:EXECUTE。 接受存儲過程名和需要傳遞來的任何參數,來,走個例子:

EXECUTE AddNewProduct('JTS01','Stuffed Eiffel Tower',6.49,'Plush stuffed toy with the text LaTour Eiffel in red white and blue');

很奇怪,一直在報錯。

瞄了一眼時間,居然十一點半了,有些拖拉星人要養成習慣啊,回家學習,早日完成這個課程的學習,加強對SQL的理解。

打個中斷先睡覺,明天接着寫。

slogan是要喊的!刻意練習,每日精進!!!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章