資料庫儲存過程及其與函式區別
一、儲存過程的概念
儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯後儲存在資料庫中。
儲存過程是資料庫中的一個重要物件,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。
儲存過程是由 流控制 和 SQL語句書寫的過程,這個過程經編譯和優化後儲存在資料庫伺服器中。
儲存過程 可由應用程式通過一個呼叫來執行,而且允許使用者宣告變數。
同時,儲存過程可以接收和輸出引數、返回執行儲存過程的狀態值,也可以巢狀呼叫。
二、儲存過程與函式的區別
1.一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。
2.對於儲存過程來說可以返回引數(output),而函式
3.儲存過程一般是作為一個獨立的部分來執行,而函式可以作為查詢語句的一個部分來呼叫,由於函式可以返回一個表物件,因此它可以在查詢語句中位於FROM關鍵字的後面。
三、儲存過程的功能
這類語言主要提供以下功能,讓使用者可以設計出符合引用需求的程式:
① 變數說明
② ANSI相容的SQL命令(如Select,Update….)
③ 一般流程控制命令(if…else…、while….)
④ 內部函式
四、儲存過程的優點
① 儲存過程的能力大大增強了SQL語言的功能和靈活性。
儲存過程可以用流控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的 運算。
② 可保證資料的安全性和完整性。
理由1:通過儲存過程可以使沒有許可權的使用者在控制之下間接地存取資料庫,從而保證資料的安全。
理由2:通過儲存過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。
③ 在執行儲存過程前,資料庫已對其進行了語法和句法分析,並給出了優化執行方案。
這種已經編譯好的過程可極大地改善SQL語句的效能。
由於執行SQL語句的大部分工作已經完成,所以儲存過程能以極快的速度執行。
④ 可以降低網路的通訊量。
理由:客戶端呼叫儲存過程只需要傳儲存過程名和相關引數即可,與傳輸SQL語句相比自然資料量少了很多。
⑤ 使體現企業規則的運算程式放入資料庫伺服器中,以便:
1). 集中控制。
2). 當企業規則發生變化時在伺服器中改變儲存過程即可,無須修改任何應用程式。
企業規則的特點是要經常變化,如果把體現企業規則的運算程式放入應用程式中,則當企業規則發生變化時,就需要修改應用程式工作量非常之大(修改、發行和安裝應用程式)。
如果把體現企業規則的運算放入儲存過程中,則當企業規則發生變化時,只要修改儲存過程就可以了,應用程式無須任何變化。
【儲存過程優點概括】
1.執行速度更快 – 在資料庫中儲存的儲存過程語句都是編譯過的
2.允許模組化程式設計 – 類似方法的複用
3.提高系統安全性 – 防止SQL注入
4.減少網路流通量 – 只要傳輸儲存過程的名稱
五、儲存過程缺點
① 除錯麻煩,但是用 PL/SQL Developer 除錯很方便!彌補這個缺點。
② 移植問題,資料庫端程式碼當然是與資料庫相關的。但是如果是做工程型專案,基本不存在移植問題。
③ 重新編譯問題,因為後端程式碼是執行前編譯的,如果帶有引用關係的物件發生改變時,受影響的儲存過程、包將需要重新編譯(不過也可以設定成執行時刻自動編譯)。
④ 如果在一個程式系統中大量的使用儲存過程,到程式交付使用的時候隨著使用者需求的增加會導致資料結構的變化,接著就是系統的相關問題了,最後如果使用者想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。
六、儲存過程的種類
① 系統儲存過程:以sp開頭,用來進行系統的各項設定.取得資訊.相關管理工作。
② 本地儲存過程:使用者建立的儲存過程一般以usp開頭,是由使用者建立並完成某一特定功能的儲存過程,事實上一般所說的儲存過程就是指本地儲存過程。
③ 臨時儲存過程:分為兩種儲存過程:
一是本地臨時儲存過程,以井字號(#)作為其名稱的第一個字元,則該儲存過程將成為一個存放在tempdb資料庫中的本地臨時儲存過程,且只有建立它的使用者才能執行它;
二是全域性臨時儲存過程,以兩個井字號(##)號開始,則該儲存過程將成為一個儲存在tempdb資料庫中的全域性臨時儲存過程,全域性臨時儲存過程一旦建立,以後連線到伺服器的任意使用者都可以執行它,而且不需要特定的許可權。
④ 遠端儲存過程:在SQL Server2005中,遠端儲存過程(Remote Stored Procedures)是位於遠端伺服器上的儲存過程,通常可以使用分散式查詢和EXECUTE命令執行一個遠端儲存過程。
⑤ 擴充套件儲存過程:擴充套件儲存過程(Extended Stored Procedures)是使用者可以使用外部程式語言編寫的儲存過程,而且擴充套件儲存過程的名稱通常以xp_開頭。
七、定義儲存過程語法
“[ ]” 裡面的內容表示可選項
create proc 儲存過程名
@引數1 資料型別 [=預設值] [output],
@引數2 資料型別 [=預設值] [output],
...
as
SQL語句
八、儲存過程例子
1、定義儲存過程:
create proc usp_StudentByGenderAge
@gender nvarchar(10) [='男'],
@age int [=30]
as
select * from MyStudent where [email protected] and [email protected]
2、執行儲存過程:
Situation One(呼叫預設的引數):
exec usp_StudentByGenderAge
Situation Two(呼叫自己指定的引數):
exec usp_StudentByGenderAge '女',50
或者指定變數名 exec usp_StudentByGenderAge @age=50,@gender='女'
3、對儲存過程進行修改
alter proc usp_StudentByGenderAge
@gender nvarchar(10) [='男'],
@age int [=30],
--加output表示該引數是需要在儲存過程中賦值並返回的
@recorderCount int output
as
select * from MyStudent where [email protected] and [email protected]
set @recorderCount=(select count(*) from MyStudent where
[email protected] and [email protected])
–output引數的目的,就是呼叫者需要傳遞一個變數進來,然後在儲存過程中為該變數完成賦值工作,儲存過程執行完成以後,將執行的對應結果返回給傳遞進來的變數。(與C#中的out原理一模一樣)
呼叫(記住這裡的語法!)因為該儲存過程前面還有其他引數,所以要把 @recorderCount寫上,該儲存過程執行後,相當與完成了以上的查詢工作,同時將查詢結果得到的條數賦值給了@count變數。(@count是當做引數傳給usp_StudentByGenderAge,當儲存過程執行完畢以後,將得到的條數返回給@count)
declare @count int
exec usp_StudentByGenderAge @recorderCount=@count output
print @count
相關推薦
資料庫儲存過程及其與函式區別
一、儲存過程的概念 儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯後儲存在資料庫中。 儲存過程是資料庫中的一個重要物件,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。 儲存過程是由 流控
oracle資料庫儲存過程中建立函式
最近,專案需要通過呼叫儲存過程初始化資料庫,根據使用者名稱建立該使用者下的所有表的檢視但是因為在專案中,檢視是通過execute immediate 字串 實現的,所以想,那麼函式的建立是否也可以使用這種方式呢:說幹就幹,最後還真成功了 程式碼如下 CREATE OR RE
sql(join中on與where區別) / NVL函式 / oracle儲存過程中is和as區別 / JAVA呼叫資料庫儲存過程
left join :左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join: 內連線,又叫等值連線,只返回兩個表中連線欄位相等的行。 full join:外連線,返回兩個表中的行:left jo
實習複習--資料庫儲存過程與儲存函式&&觸發器8
儲存過程: 1定義:就是為了適用於針對資料庫的某一個重複功能的開發。就是多條sql語句的集合, 2使用規則 建立儲存過程create procedure 儲存過程名(in/out/inout 引數名 資料型別) begin sql語句的集合 end 3儲存
Oracle資料庫儲存過程和函式的區別
儲存過程 函式 作為PL/SQL語句執行 作為表示式的一部分呼叫 在規範中不包含RETURN子句 必須在規範中包含RETURN子句 不返回任何值 必須返回單個值 可以包含RETURN語句,但是與函式不同,它不能用於返回值 必須包含至少一條
資料庫儲存過程,觸發器,遊標,函式
MySQL5 中添加了儲存過程的支援。 大多數SQL語句都是針對一個或多個表的單條語句。並非所有的操作都這麼簡單。經常會有一個完整的操作需要多條才能完成。 儲存過程簡單來說,就是為以後的使用而儲存的一條或多條MySQL語句的集合。可將其視為批檔案。雖然他們的
資料庫儲存過程及儲存函式
儲存過程 在java中經常用封裝的思想來提高程式碼的重用性,在java中為什麼要定義方法?原因是有一個功能是需要在不同的地方多次使用的,如果在每一個需要呼叫的地方都寫一遍會造成程式碼量很大,所以我們把他抽取成單獨的方法,在需要使用的時候呼叫這個方法。同樣的道理,如果同一個資料庫操作需要被多次使用
MySQL - - 【檢視】【觸發器】【儲存過程】【函式】【事物】【資料庫鎖】【資料庫備份】
目錄 檢視 觸發器 儲存過程 函式 事物 資料庫鎖 資料庫備份 1 檢視 檢視:是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料 檢視有如下特點; 1 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關
Sql資料庫儲存過程傳值(傳遞資料表名,列名),sp_executesql函式的使用
遇到的專案需求是:對幾個不同的資料表和相應的欄位進行類似的操作,表的名稱和相關的列名可以作為儲存過程的引數傳遞,這樣可以使用遊標遍歷不同表格的不同的列,再使用相同函式求出返回值進行統一的處理。由於專案中表的資料龐大,關係複雜,此處做簡化處理,描述大致意思。(此處的資料庫是SQ
orcle資料庫儲存過程和儲存函式初學總結
先看一個簡單的儲存過程,不帶引數create or replace Procedure sayhelloworld as begin dbms_output.put_line('hello wo
SQL資料庫 儲存過程、索引、檢視與臨時表
--資料庫程式設計2. --儲存過程 exec --執行速度快:儲存過程是編譯之後的語句,儲存在資料庫的內容;儲存過程的操作只有一次。--系統儲存過程 存放在master資料庫中,都以“sp_”或“xp_”開頭 exec sp_databasesexec sp_r
SQL2000系統表、儲存過程、函式的功能介紹及應用2009年01月21日 星期三 11:38雖然使用系統儲存過程、系統函式與資訊架構檢視已經可以為我們提供了相當豐富的元資料資訊,但是對於某些特殊的元資料資訊,我們仍然需要直接對系統表進行查詢。因為SQL
雖然使用系統儲存過程、系統函式與資訊架構檢視已經可以為我們提供了相當豐富的元資料資訊,但是對於某些特殊的元資料資訊,我們仍然需要直接對系統表進行查詢。因為SQL Server 將所有資料庫物件的資訊均存放在系統表中,作為 SQL Server 的管理、開發人員,瞭解各個系統表的作用將有助於我們瞭解 SQL
navicat 匯出資料庫 儲存過程 函式
匯出儲存過程 選單欄- 工具 - 資料傳輸 - target改為檔案。。。 If you want to export stored procedures to a sql file, you can try Data Transfer feature. (
給大家說明。資料庫技術之儲存過程設計與實現
儲存過程的生成流程圖 在上一篇的文章中我們知道了由一個儲存過程的語句生成一個語法樹,但是這個語法樹的儲存在資料庫系統中,這裡給出一個儲存過程的儲存方案 可以看出儲存過程的原來的sql語句是儲存在一張表裡面的。並且也把儲存過程的語法樹儲存在了記憶體中,方便執行,不用再
搜尋資料庫儲存過程或者函式中的內容
資料庫儲存過程或者函式中,有可能在開發過程中寫死了某些值,例如郵箱,在某人離職的時候,接替人必須要進行切換,如果才能按照關鍵字快速的搜尋資料庫儲存過程及函式中的內容呢? 針對SQL server和Oracle分別進行介紹 1.SQL server(以2008的版本為例) sys.sql_modu
Linux 執行DB2資料庫匯入儲存過程/自定義函式指令碼檔案命令
匯入儲存過程/自定義函式: db2 -td@ -vf 檔名 其中,@是語句表示為結束符。 執行自定義函式指令碼: db2 -td@ -vf holidayfunction.sq
自動記錄資料庫儲存過程的更新和改變,併產生日誌
一、 簡介 使用環境:SQL Server 在專案開發過程中,專案管理者通常都很希望對專案的開發進展有一個日誌的記錄。程式碼的記錄和管理可以通過TFS或者VSS等工
關於MySQL資料庫儲存過程的感想
以下只是學習路上的淺薄感想,如理解有所偏差,還請有識之士指正! 一、儲存過程意義理解 關於儲存過程,我的理解是對資料庫語言進行程式設計呼叫,就像Java程式碼類程式設計寫一個具有某種特定功能的方法去進行呼叫一樣。資料庫的儲存過程是一組相關聯的sql語句或函式,通過進行組合形成模
Oracle資料庫總結(七)--varchar與varchar2區別
varchar -- 存放定長的字元資料,最長2000個字元; varchar2 -- 存放可變長字元資料,最大長度為4000字元。 目前沒有本質的區別 但是:varchar2是oracle提供的獨特的資料型別oracle保證在任何版本
sqlserver 只有函式和擴充套件儲存過程才能從函式內部執行
一個SQLServer的自定義函式中呼叫一個自定義的儲存過程,執行此函式後發出如下提示:“只有函式和擴充套件儲存過程才能從函式內部執行"。原因:函式只能使用簡單的sql語句,邏輯控制語句,複雜一點的儲存過程是不能呼叫的,在函式裡也不能使用execute sp_executesql 或者execute 。解決方