sql腳本和存儲過程區別
不同點:
1、標識符不同。函數的標識符為FUNCTION,過程為:PROCEDURE。
2、函數中有返回值,且必須返回,而過程可以沒有返回值。
3、過程無返回值類型,不能將結果直接賦值給變數;函數有返回值類型,調用時,除在select中,必須將返回值賦給變數。
4、函數可以在select語句中直接使用實現對欄位進行計算,而存儲過程不能,
例如:假設已有函數fun_getAVG() 返回number類型絕對值。
那麼select fun_getAVG(col_a) from table 這樣是可以的。
5、函數一般處理簡單的邏輯方便,存儲過程一般處理復雜的邏輯,
相同點:
1、二者都可以有輸出
2、二者寫法邏輯上很相似
② 存儲過程與SQL語句如何選擇
資料庫擅長存儲與索引,在目前的互聯網系統架構中,伺服器的擴展要比存儲的擴展更簡單,
需要考慮系統可能的瓶頸在伺服器還是數據存儲,存儲過程有它的優點,應該在開發中合理的選用。
應用存儲過程的優點
存儲過程是一組預先創建並用指定的名稱存儲在資料庫伺服器上的
SQL
語句,將使用比較頻繁或者比較復雜的操作,預先用
SQL
語句寫好並存儲起來,以後當需要資料庫提供相同的服務時,只需再次執行該存儲過程。
1.具有更好的性能
存儲過程是預編譯的,只在創建時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般
SQL
語句每執行一次就編譯一次,因此使用存儲過程可以提高資料庫執行速度。
2.功能實現更加靈活
存儲過程中可以應用條件判斷和游標等語句,有很強的靈活性,可以直接調用資料庫的一些內置函數,完成復雜的判斷和較復雜的運算。
3.減少網路傳輸
復雜的業務邏輯需要多條
SQL
語句,當客戶機和伺服器之間的操作很多時,將產生大量的網路傳輸。如果將這些操作放在一個存儲過程中,那麼客戶機和伺服器之間的網路傳輸就會減少,降低了網路負載。
4.具有更好的安全性
(1)資料庫管理人員可以更好的進行許可權控制,存儲過程可以屏蔽對底層資料庫對象的直接訪問,使用
EXECUTE
許可權調用存儲過程,無需擁有訪問底層資料庫對象的顯式許可權。
(2)在通過網路調用過程時,只有對執行過程的調用是可見的。無法看到表和資料庫對象名稱,不能嵌入SQL
語句,有助於避免
SQL
注入攻擊。
存儲過程的弊端
1.架構不清晰,不夠面向對象
存儲過程不太適合面向對象的設計,無法採用面向對象的方式將業務邏輯進行封裝,業務邏輯在存儲層實現,增加了業務和存儲的耦合,代碼的可讀性也會降低,
2.開發和維護要求比較高
存儲過程的編寫直接依賴於開發人員,如果業務邏輯改動較多,需要頻繁直接操作資料庫,大量業務降維到資料庫,很多異常不能在代碼中捕獲,出現問題較難排查,需要資料庫管理人員的幫助。
3.可移植性差
過多的使用存儲過程會降低系統的移植性。在對存儲進行相關擴展時,可能會增加一些額外的工作。
存儲過程與SQL語句如何抉擇
架構設計沒有絕對,只有在當前的場景下最合適的。
普通的項目開發中,不建議大量使用存儲過程,對比SQL語句,存儲過程適用於業務邏輯復雜,比較耗時,同時請求量較少的操作,例如後台大批量查詢、定期更新等。
(1)當一個事務涉及到多個SQL語句時或者涉及到對多個表的操作時可以考慮應用存儲過程
(2)在一個事務的完成需要很復雜的商業邏輯時可以考慮應用存儲過程
(3)比較復雜的統計和匯總可以考慮應用後台存儲過程
③ 存儲過程和sql語句有什麼區別
存儲過程和SQL語句的區別主要有以下幾點:
功能范圍:
- SQL語句:就像是個小能手,只能完成簡單的查詢、新增、修改、刪除這些基礎操作。
- 存儲過程:則是個全能選手,它是SQL語句和可選控制流語句的集合體,不僅能做SQL語句能做的,還能加上復雜的邏輯控制,比如條件判斷、循環等。
執行效率:
- SQL語句:每次執行時,資料庫都要重新解析和編譯一遍,效率相對較低。
- 存儲過程:在創建時就已經在伺服器上進行了編譯,相當於把執行計劃提前做好了,所以執行起來比單個SQL語句要快得多。
操作集合:
- SQL語句:通常只能單獨執行一個操作。
- 存儲過程:則可以包含一系列SQL語句,甚至可以在一個存儲過程中調用其他存儲過程,形成復雜的操作鏈。
簡單來說,SQL語句就像是日常中的一個個小任務,而存儲過程則是把這些小任務整合起來,形成一個高效、復雜的工作流程。