什麼是存儲過程?

定義:
        將常用的或很複雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來,   那麼以後要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
        講到這裏,可能有人要問:這麼說存儲過程就是一堆SQL語句而已啊?
        Microsoft公司爲什麼還要添加這個技術呢?
        那麼存儲過程與一般的SQL語句有什麼區別呢?

        存儲過程的優點:
          1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
          2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此複雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
          3.存儲過程可以重複使用,可減少數據庫開發人員的工作量
          4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
        存儲過程的種類:
          1.系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,
          如   sp_help就是取得指定對象的相關信息
          2.擴展存儲過程   以XP_開頭,用來調用操作系統提供的功能
          exec   master..xp_cmdshell   'ping   10.8.16.1'
          3.用戶自定義的存儲過程,這是我們所指的存儲過程
          常用格式
          Create   procedure   procedue_name
          [@parameter   data_type][output]
          [with]{recompile|encryption}
          as
          sql_statement
        解釋:  
        output:表示此參數是可傳回的
        with   {recompile|encryption}
        recompile:表示每次執行此存儲過程時都重新編譯一次
        encryption:所創建的存儲過程的內容會被加密
        如:
          表book的內容如下
          編號   書名   價格
          001   C語言入門   $30
          002   PowerBuilder報表開發   $52
          實例1:查詢表Book的內容的存儲過程
          create   proc   query_book
          as  
          select   *   from   book
          go
          exec   query_book
          實例2:加入一筆記錄到表book,並查詢此表中所有書籍的總金額
          Create   proc   insert_book
          @param1   char(10),@param2   varchar(20),@param3   money,@param4   money   output
          with   encryption   ---------加密
          as
          insert   book(編號,書名,價格)   Values(@param1,@param2,@param3)
          select   @param4=sum(價格)   from   book
          go
          執行例子:  
          declare   @total_price   money  
          exec   insert_book   '003','Delphi   控件開發指南',$100,@total_price
          print   '總金額爲'+convert(varchar,@total_price)
          go
       
存儲過程的3種傳回值:
          1.以Return傳回整數
          2.以output格式傳回參數
          3.Recordset
        傳回值的區別:
          output和return都可在批次程式中用變量接收,而recordset則傳回到執行批次的客戶端中  
        實例3:設有兩個表爲Product,Order,其表內容如下:
          Product
          產品編號   產品名稱   客戶訂數  
          001   鋼筆   30  
          002   毛筆   50  
          003   鉛筆   100  
          Order  
          產品編號   客戶名   客戶訂金
          001   南山區   $30
          002   羅湖區   $50
          003   寶安區   $4
        請實現按編號爲連接條件,將兩個表連接成一個臨時表,該表只含編號.產品名.客戶名.訂金.總金額,
        總金額=訂金*訂數,臨時表放在存儲過程中
        代碼如下:
          Create   proc   temp_sale
          as
          select   a.產品編號,a.產品名稱,b.客戶名,b.客戶訂金,a.客戶訂數*   b.客戶訂金   as總金額
          into   #temptable   from   Product   a   inner   join   Order   b   on   a.產品編號=b.產品編號
          if   @@error=0  
          print   'Good'
          else
          print   'Fail'
          go

--------------------------------------------------------------------------------------------------------------------

存儲過程介紹  

一、先介紹一下什麼是存儲過程  
存儲過程是利用SQL   Server所提供的Tranact-SQL語言所編寫的程序。Tranact-SQL語言是SQL   Server提供專爲設計數據庫應用程序的語言,它是應用程序和SQL   Server數據庫間的主要程序式設計界面。它好比Oracle數據庫系統中的Pro-SQL和Informix的數據庫系統能夠中的Informix-4GL語言一樣。這類語言主要提供以下功能,讓用戶可以設計出符合引用需求的程序:  
1)、變量說明  
2)、ANSI兼容的SQL命令(如Select,Update….)  
3)、一般流程控制命令(if…else…、while….)  
4)、內部函數  

二、存儲過程的書寫格式  

CREATE   PROCEDURE   [擁有者.]存儲過程名[;程序編號]  
[(參數#1,…參數#1024)]  
[WITH  
{RECOMPILE   |   ENCRYPTION   |   RECOMPILE,   ENCRYPTION}  
]  
[FOR   REPLICATION]  
AS   程序行  

其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數  
(SQL   Server   7.0以上版本),參數的使用方法如下:  

@參數名   數據類型   [VARYING]   [=內定值]   [OUTPUT]  

每個參數名前要有一個“@”符號,每一個存儲過程的參數僅爲該程序內部使用,參數的類型除了IMAGE外,其他SQL   Server所支持的數據類型都可使用。  
[=內定值]相當於我們在建立數據庫時設定一個字段的默認值,這裏是爲這個參數設定默認值。[OUTPUT]是用來指定該參數是既有輸入又有輸出值的,也就是在調用了這個存儲過程時,如果所指定的參數值是我們需要輸入的參數,同時也需要在結果中輸出的,則該項必須爲OUTPUT,而如果只是做輸出參數用,可以用CURSOR,同時在使用該參數時,必須指定VARYING和OUTPUT這兩個語句。  

例子:  
CREATE   PROCEDURE   order_tot_amt   @o_id   int,@p_tot   int   output   AS  
SELECT   @p_tot   =   sum(Unitprice*Quantity)  
FROM   orderdetails  
WHERE   ordered=@o_id  

例子說明:  
該例子是建立一個簡單的存儲過程order_tot_amt,這個存儲過程根據用戶輸入的定單ID號碼(@o_id),由定單明細表(orderdetails)中計算該定單銷售總額[單價(Unitprice)*數量(Quantity)],這一金額通過@p_tot這一參數輸出給調用這一存儲過程的程序  

三、在SQL   Server中執行存儲過程  

在SQL   Server的查詢分析器中,輸入以下代碼:  
declare   @tot_amt   int  
execute   order_tot_amt   1,@tot_amt   output  
select   @tot_amt  

以上代碼是執行order_tot_amt這一存儲過程,以計算出定單編號爲1的定單銷售金額,我們定義@tot_amt爲輸出參數,用來承接我們所要的結果

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章