1. 程式人生 > >資料庫的儲存過程

資料庫的儲存過程

1.http://blog.sina.com.cn/s/blog_76b2c4810101b8qz.html

將常用的或很複雜的工作,預先用SQL語句寫好並用一個指定的名稱儲存起來, 那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫execute,即可自動完成命令。

1.1      儲存過程的優點

1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。       2. 資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete),可將此複雜操作用儲存過程封裝起來與資料庫提供的事務處理結合一起使用。

       3.儲存過程可以重複使用,可減少資料庫開發人員的工作量       4.安全性高,可設定只有某此使用者才具有對指定儲存過程的使用權

1.2      建立儲存過程的語法

CREATE PROC[ EDURE ] [ owner. ] procedure_name [number ]     [{ @parameter data_type }            [ARYING ] [ = default ] [ OUTPUT ]        ] [ ,...n ] [ WITH        { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

      [ FOR REPLICATION ]

      AS sql_statement [ ...n ]

引數:

owner:擁有儲存過程的使用者ID的名稱。owner必須是當前使用者的名稱或當前使用者所屬的角色的名稱。

procedure_name:新儲存過程的名稱。過程名必須符合識別符號規則,且對於資料庫及其所有者必須唯一。

Number是可選的整數,用來對同名的過程分組,以便用一條DROP PROCEDURE語句即可將同組的過程一起除去。例如,名為orders的應用程式使用的過程可以命名為orderproc;1orderproc;2等。DROP PROCEDURE orderproc

語句將除去整個組。如果名稱中包含定界識別符號,則數字不應包含在識別符號中,只應在procedure_name前後使用適當的定界符。

@parameter:過程中的引數。在CREATE PROCEDURE語句中可以宣告一個或多個引數。使用者必須在執行過程時提供每個所宣告引數的值(除非定義了該引數的預設值,或者該值設定為等於另一個引數)。儲存過程最多可以有2.100個引數。使用 @ 符號作為第一個字元來指定引數名稱。引數名稱必須符合識別符號的規則。每個過程的引數僅用於該過程本身;相同的引數名稱可以用在其它過程中。預設情況下,引數只能代替常量,而不能用於代替表名、列名或其它資料庫物件的名稱。

data_type引數的資料型別。除table之外的其他所有資料型別均可以用作儲存過程的引數。但是,cursor資料型別只能用於OUTPUT引數。如果指定cursor資料型別,則還必須指定VARYINGOUTPUT關鍵字。對於可以是cursor資料型別的輸出引數,沒有最大數目的限制。

VARYING:指定作為輸出引數支援的結果集(由儲存過程動態構造,內容可以變化)。僅適用於遊標引數。

Default引數的預設值。如果定義了預設值,不必指定該引數的值即可執行過程。預設值必須是常量或NULL。如果過程將對該引數使用LIKE關鍵字,那麼預設值中可以包含萬用字元(%_[]  [^])。

OUTPUT:表明引數是返回引數。該選項的值可以返回給EXEC[UTE]。使用OUTPUT引數可將資訊返回給呼叫過程。Textntextimage引數可用作OUTPUT引數。使用OUTPUT關鍵字的輸出引數可以是遊標佔位符。

N:表示最多可以指定2.100個引數的佔位符。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

RECOMPILE:表明SQL Server不會快取該過程的計劃,該過程將在執行時重新編譯。在使用非典型值或臨時值而不希望覆蓋快取在記憶體中的執行計劃時,請使用RECOMPILE選項。

ENCRYPTION:表示SQL Server加密syscomments表中包含CREATE PROCEDURE語句文字的條目。使用ENCRYPTION可防止將過程作為SQL Server複製的一部分發布。

FOR REPLICATION:指定不能在訂閱伺服器上執行為複製建立的儲存過程。.使用FOR REPLICATION選項建立的儲存過程可用作儲存過程篩選,且只能在複製過程中執行。本選項不能和WITH RECOMPILE選項一起使用。

AS:指定過程要執行的操作。

sql_statement:過程中要包含的任意數目和型別的Transact-SQL語句。但有一些限制。

2 .http://www.cnblogs.com/Alpha-Fly/archive/2012/04/08/2437577.html

定義儲存過程:

  create proc usp_StudentByGenderAge

  @gender nvarchar(10) [='男'],

  @age int [=30]

  as

  select * from MyStudent where [email protected] and [email protected]

  執行儲存過程:

  Situation One(呼叫預設的引數):

  exec usp_StudentByGenderAge

  Situation Two(呼叫自己指定的引數):

  exec usp_StudentByGenderAge '女',50

  或者指定變數名        exec usp_StudentByGenderAge @age=50,@gender='女'

  對儲存過程進行修改

  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 @[email protected] output

  print @count

五、使用儲存過程完成分頁

1、儲存過程程式碼

    create proc usp_page

  @page int,          ---一頁顯示多少條記錄

    @number int,   ---使用者選擇了第幾頁資料

      as

   begin

   select * from

   --小括號裡面內容是專門得到排列好的序號

   (

     select  ROW_NUMBER() over(order by(Fid))  as number

     from MyStudent

   ) as t

   where t.number>= (@number-1)*@page+1 and t.number<[email protected]*@page

   end

--參考PPT  【圖文】資料庫儲存過程_百度文庫  http://wenku.baidu.com/link?url=FFZX4KilE8Y3i8Jv0ZcapzGOduUYF5N-DcsAnkz6kP2jGdxSv6l1MeGHSwXMZdUJMDdOOmHP8SK5zhz5JwqS7EEgzl_kqdwBsSKNXOJqGrm