儲存過程簡介

2021-05-24 22:49:31 字數 4277 閱讀 9357

儲存過程是sql語句和可選控制流語句的預編譯集合,以乙個名稱儲存並作為乙個單元處理。

一、使用儲存過程的優勢:

1、模組化程式設計:只需建立過程一次並將其儲存在資料庫中,以後即可在程式中呼叫該過程任意次。

2、執行效率的優化:大批量資料操作或重複執行時,儲存過程的優勢將得到很好的體現。只需在首次執行時對其編譯即可,而執行transact-sql 語句卻每次都需編譯及優化,同時需要從客戶端重**送。

3、減少網路流量:乙個需要數百行transact-sql**的操作由一條執行過程**的單獨語句就可實現,而不需要在網路中傳送數百行**。

4、安全性:即使對於沒有直接執行儲存過程中語句的許可權的使用者,也可授予他們執行該儲存過程的許可權。

二、儲存過程的三種型別:

1、系統儲存過程:以sp_開頭,用來進行系統的各項設定。

例:sp_addlogin:建立新的 microsoft® sql server™ 登入,使使用者得以連線使用 sql server 身份驗證的 sql server 例項。

sp_adduser:為當前資料庫中的新使用者新增安全帳戶。

2、擴充套件儲存過程:以xp_開頭,用來呼叫作業系統提供的功能。

例:xp_deletemail: 刪除 microsoft® sql server™ 收件箱中的郵件。

3、使用者自定義的儲存過程。

三、儲存過程的建立語法與引數說明:

1、儲存過程的設計規則:

1、定義時儲存過程中不能使用下列語句:create default、create trigger、create view、create rule

2、儲存過程中引數的最大數目為2100

3、儲存過程中區域性變數的最大數目僅受可用記憶體的限制。

4、根據可用記憶體的不同,儲存過程的最大大小可達128mb.

5、遠端儲存過程不參與事務處理,即執行後不能進行回滾更改操作。

2、create procedure語法如下:

create proc[edure] proc_name  [;number]

[ [=default][output] ]

[,…n]

[with ]

[for replication]

as sql_statement […n]

引數說明:

1、proc_name:新建儲存過程的名稱。

2、 ;number:可選引數,用來對同名的過程分組,以便用一條drop procedure語句將同組的過程一起刪除。

3、@parameter 過程中的引數。

4、data_type:引數的資料型別。

5、default:引數的預設值。

6、output:表明引數是返回引數。使用output引數可將資訊返回給呼叫過程。

7、recompile表明sql server不會快取該過程的計畫,該過程每次執行時都會重新編譯。

encryption表示sql server加密儲存過程的內容(加密以後任何人都看不到儲存內容)。

8、for replication:可用作儲存過程篩選,且只能在複製過程中執行。不能與with recompile選項一起使用。

9、as 指定過程要執行的操作。

10、sql_statement:過程中要包含的任意數目和型別的transact-sql語句。

四、儲存過程建立例項:

1、乙個最簡單的儲存過程建立例項:

查詢表book的內容的儲存過程:

use pubs         --指定資料庫

gocreate proc query_ authors  --建立查詢book表的儲存過程

as select * from authors

goexec query_book      --執行剛才建立的儲存過程

2、使用帶有複雜select語句的簡單過程

use pubs

go--判斷pubs資料庫中是否存有此儲存過程,如有則刪除

if exists( select name from sysobjects

where name='au_info_all' and type='p')

--刪除原有的儲存過程

drop procedure au_info_all

create procedure au_info_all

as select au_lname,au_fname,title,pub_name

--多次進行內聯操作

from authors a inner join titleauthor ta

on a.au_id=ta.au_id inner join titles t

on t.title_id=ta.title_id inner join publishers p

on t.pub_id=p.pub_id

go exec au_info_all

3、              使用帶有引數的簡單過程

use pubs

goif exists (select name from sysobjects

where name='au_info' and type ='p')

drop procedure au_info      --刪除原有儲存過程

create procedure au_info

@lastname varchar(40),   --定義引數1

@firstname varchar(20)   --定義引數2

as select au_lname,au_fname,title,pub_name

from authors a inner join titleauthor ta

on a.au_id=ta.au_id inner join titles t

on t.title_id=ta.title_id inner join publishers p

on t.pub_id=p.pub_id

--引數1與引數2在條件語句中得到使用

where au_fname=@firstname and au_lname=@lastname

go execute au_info 'dull','ann'

4、             使用with encryption選項

use pubs

goif exists (select name from sysobjects

where name=』encrypt_this』 and type=』p』)  

drop procedure encrypt_this

with encryption      --with加密儲存過程內容

as select * from book

go exec sp_helptext encrypt_this

5、             使用引數預設值null建立儲存過程

create proc deafnull @table varchar(30)=null

as if @table is null

print 『table name is not null』

else

select table_name=sysobjects.name,index_name=sysindexes.name,

index_id=indid  from sysindexes inner join sysobjects

on sysobjects.id=sysindexes.id

where sysobjects.name = @table

五、儲存過程的修改與刪除

儲存過程的修改在語法上與建立儲存過程差不多,最主要的差別是儲存過程的修改是以alter為標識,儲存過程的建立是以create作為標識。

儲存過程的刪除語法為:drop proc過程名

下面用兩個實際例子來說明儲存過程的修改與刪除:

1、針對上面演示的儲存過程query_book,修改如下:

use pubs

go alter proc query_authors

as select au_id,au_lname from authors

where au_lname like 's%'

go exec query_authors

2、針對儲存過程query_book,刪除如下:

use pubs

goif exists( select * from sysobjects where name='query_authors' and type='p')

drop procedure query_authors

go

儲存過程簡介

sql語句需要先編譯然後執行,而儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫執行它。儲存過程是可程式設計的函式,在資料庫中建立並儲存,可以由sql語句和控制結構組成。當...

儲存過程簡介

將常用的或很複雜的工作,預先用sql語句寫好並用乙個指定的名稱儲存起來,那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫execute,即可自動完成命令。儲存過程的優點 1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般sql語句每執行一次就編譯一次,...

Oracle 儲存過程入門簡介

一 無返回值的儲存過程 儲存過程為 create or replace procedure testa para1 in varchar2,para2 in varchar2 as begin insert into hyq.b id i id,i name values para1,para2 e...