1. 程式人生 > >java面試問題:oracle儲存過程(procedure)和函式(function)的區別

java面試問題:oracle儲存過程(procedure)和函式(function)的區別

oracle儲存過程(procedure)和函式(function)的區別

儲存過程 函式
用於在資料庫中完成特定的操作或者任務(如插入、刪除等) 用於特定的資料(如選擇)
程式頭部宣告用procedure 程式頭部宣告用function
程式頭部宣告時不需描述返回型別 程式頭部宣告時要描述返回型別,而且PL/SQL塊中至少要包含一個有效的return語句
可以使用in/out/in out 三種模式的引數 可以使用in/out/in out 三種模式的引數
可作為一個獨立的PL/SQL語句來執行 不能獨立執行,必須作為表示式的一部分呼叫
可以通過out/in out返回0個或多個值 通過return語句返回一個值,且該值要與宣告部分一致,也可以是通過out型別的引數帶出的變數
SQL語句(DML或SELECT)中不可呼叫儲存過程 SQL語句(DML或SELECT)中可以呼叫儲存過程

定義:

  • 儲存過程(Stored Procedure )是一組為了完成特定功能的SQL
    語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

    儲存過程是資料庫中的一個重要物件,任何一個設計良好的資料庫應用程式都應該用到儲存過程。

    儲存過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化後儲存在資料庫伺服器中,應用程式使用時只要呼叫即可。

    在Oracle 中,若干個有聯絡的過程可以組合在一起構成程式包。

優 點:

  • 1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。

    2.當對資料庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此複雜操作用儲存過程封裝起來與資料庫提供的事務處理結合一起使用。

    3.儲存過程可以重複使用,可減少資料庫開發人員的工作量。

    4.安全性高,可設定只有某使用者才具有對指定儲存過程的使用權。

儲存過程的優缺點

  • 優點:減少網路互動的成本。
    缺點:
    1.不可移植性,每種資料庫的內部程式設計語法都不太相同,當你的系統需要相容多種資料庫時,最好不要用儲存過程。

    2.學習成本高,DBA一般都擅長寫儲存過程,但並不是每個程式設計師都能寫好儲存過程,除非你的團隊有較多的開發人員熟悉寫儲存過程,否則後期系統維護會產生問題。
    3.業務邏輯多處存在,採用儲存過程後也就意味著你的系統有一些業務邏輯不是在應用程式裡處理,這種架構會增加一些系統維護和除錯成本。
    4.儲存過程和常用應用程式語言不一樣,它支援的函式及語法有可能不能滿足需求,有些邏輯就只能通過應用程式處理。
    5.如果儲存過程中有複雜運算的話,會增加一些資料庫服務端的處理成本,對於集中式資料庫可能會導致系統可擴充套件性問題。

    6.為了提高效能,資料庫會把儲存過程程式碼編譯成中間執行程式碼(類似於Java的class檔案),所以更像靜態語言。當儲存過程引用的對像(表、檢視等等)結構改變後,儲存過程需要重新編譯才能生效,在24*7高併發應用場景,一般都是線上變更結構的,所以在變更的瞬間要同時編譯儲存過程,這可能會導致資料庫瞬間壓力上升引起故障。

區別:

  • 函式:只能返回一個變數的限制。而儲存過程可以返回多個。而函式是可以嵌入在sql中使用的,可以在select中呼叫,而儲存過程不行。執行的本質都一樣。
    函式限制比較多,比如不能用臨時表,只能用表變數還有一些函式都不可用等等。而儲存過程的限制相對就比較少。
    1.一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。
    2.對於儲存過程來說可以返回引數,而函式只能返回值或者表物件。
    3.儲存過程一般是作為一個獨立的部分來執行(EXEC執行),而函式可以作為查詢語句的一個部分來呼叫(SELECT呼叫),由於函式可以返回一個表物件,因此它可以在查詢語句中位於FROM關鍵字的後面。
    4.當儲存過程和函式被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裡沒有相應的查詢語句,SQL Manager就會對儲存過程和函式進行編譯。 Procedure cache中儲存的是執行計劃 (execution plan) ,當編譯好之後就執行procedure cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中儲存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。儲存在cache中的plan在下次執行時就不用再編譯了。