產品資訊
|
量身訂作系統
|
成功案例
|
免費試用
|
客戶服務
|
教育訓練
|
企業e化電子報
|
關於我們  
  AW&FM Blog Home


  FAQ常見問題索引
AutoWEB 3.0
FlowMaster 3.0


  AutoWEB更新程式說明公告
BPMPlus_Update_20120604
AW3_Update_20111214
AW3_Update_20111024
AW3_Update_20110718
...more

特別說明:我們正在建構全新的NewType AW&FM Blog技術部落格, 目前資料正陸續建置中,部分資訊可能還不足,我們會陸續增添更多訊息, 感謝您的支持。

按這裡登入[客戶服務系統]來詢問相關技術支援

技術文章分享
只要說我要下午茶!什麼是資料庫預存程序?
發表日期:2009/06/16   發表者:靈媒
下午茶是枯燥乏味的辦公室生活中,少數又少數的宜人活動之一;如何以高熱量的美味食物拯救漫長下午時光,這個問題的優先程度通常都會大於今天內一定要交出來的程式、報告和專案等等玩意兒。

珍奶少冰三分之一糖,雞排要切辣粉一點點,如果有人徵求跟她合吃一碗芋圓的話我參加。

只要連續一星期,每天下午你都在二秒鐘之內不換氣把上面這句話講完,從此之後,訂下午茶的時候你就不需要這麼辛苦了,因為你的同事也都學會了如何在二秒鐘內不換氣把你一貫的下午茶訂單講完。

這種情況的好處是,即使你正被綿延不絕無止盡的落落長客戶電話纏身,只要找個客戶呼吸的空檔摀住話筒講一聲我要下午茶,你的下午茶訂購就會自動處理完成。

預存程序(Stored Procedure)的魅力也許遠遠輸給下午茶,但它就是這種把多項指令打包起來的玩意兒,然後這團東西就可以在每次你需要用的時候被拿來執行,你就不用再一行一行地重寫。

再舉個既不美味又無聊的例子,
當公司內部有一名同事轉調部門時,你得先下個UPDATE指令去異動員工資料表,把這名人員的部門資料作更新;
然後,必須判斷這個人的職級職稱,如果大於2級且不是工程人員的話,必須在新部門中給予他簽核權。
認養客戶直接改為待認養...。

你需要預存程序,就如同需要一個背得出你下午茶訂購單的同事一樣。上面每道指令都用人為判斷再一行一行寫出來執行,在組織大異動的時節你早就瘋掉了;若是不慎寫錯了幾行,應該會煩到你連吃下午茶都沒心情。

<預存程序範例>
所以,應該寫一支人員異動的預存程序來處理所有人員異動的指令,只要傳入員工編號、新部門代號就會自動執行。
在MS-SQL資料庫裡,你可以寫成這樣...

CREATE PROCEDURE AccountChange @AccountID VARCHAR(50),@NDeptID VARCHAR(50)
AS
DECLARE
--變數宣告
@Degree INT,
@AccountType VARCHAR(50)

BEGIN

  --取得既有員工資料中,該名人員的身份
  SELECT @Degree=Degree,@AccountType=AccountType FROM Accounts WHERE AccountID=@AccountID

  --異動此員工所屬部門代號
  UPDATE Accounts SET DeptID=@NDeptID WHERE AccountID=@AccountID

  --如果大於2級且不是工程人員的話,必須在新部門中給予他簽核權
  IF(@Degree>2 AND @AccountType<>'Engineer')
  BEGIN
      UPDATE Accounts SET SignRight=1 WHERE AccountID=@AccountID
  END

  --認養客戶改為待認養
  UPDATE Customers SET Status=0 WHERE SalesID=@AccountID

END

<執行預存程序>
當預存程序建立之後,我們以EXECUTE指令(也可縮寫為EXEC)來執行它,並且傳入必要的引數。

EXECUTE AccountChange @AccountID='Mary',@NDeptID='Sales1'

或者也可以不指定參數名稱,直接Stored Procedure裡所記錄的順序傳入

EXEC AccountChange 'Mary','Sales1'

(註:此處僅列出二種最常用的執行語法,其他執行方式請參閱SQL線上叢書)


在AutoWEB V3系統中,這樣的語法可以寫在AutoSQL元件、AutoScript網頁(使用ExecSqlCommand指令)等處,由使用者在網頁上的動作來觸發這個預存程序。

<回傳資料>
預存程序的基本概念就是執行SQL指令作資料庫的資料處理(甚至是結構變動),並沒有提到回傳值這個地位有點模糊的話題。
這一點在MS-SQL和Oracle資料庫上就有很大的不同,在Oracle資料庫裡,預存程序真的只用於進行資枓處理,而完全沒有回傳資料的功能(事實上它還是可以回傳值給呼叫它的程式,只是無法利用SQL指令取回資料,也無法應用在AW3系統裡);但MS-SQL資料庫中,則是可以在預存程式裡 SELECT 一個表格,它真的會將SELECT指令的執行結果回傳。

所以你在AW3系統中的DATA元件資料來源設定裡,可以看到有一種模式是執行Stored Procedure,這種方式僅能夠適用於MS-SQL資料庫;在FlowMaster系統基本框架建立的版型中,搜尋功能就是使用這種方法。預存程序會先建立一個暫存表格,然後把符合的資料INSERT進這個表格,最後再SELECT出來。

而相同的功能在Oracle版本中,則是利用函數來回傳搜尋結果。

(註:搜尋功能的範例可參考由FlowMaster框架所建立的NTSP_FM_FillSearch及NTSP_FM_SignSearch)


<效能議題>
林志玲比較正還是如花比較正?
即使是這個立刻就可以回答得出來的問題,你還是多多少少地花了一點時間去思考,然後回答。

資料庫也是一樣,丟給它任何指令,即使是速度快到讓你覺得立刻就得到結果了,它都還是會把指令先編譯成一個執行計劃後才會執行。預存程序的好處是,這些指令的執行計劃在程式第一次執行時就已經編譯好了,之後的每次執行都是直接再拿來用而已,少編譯個一次二次是不會有什麼感覺,但如果這個程序是每天很多人要RUN很多次的話,積沙成塔,積粉圓成大杯粉圓,是會看出差異的。

(註:快取執行計劃還是有一些限制,例如依傳入參數後才決定最後執行的SQL指令到底修改那個表格,這類萬能型程序的執行計劃就不會被快取,因為真正執行的SQL指令並不固定)


我下回要少用食物當例子,要不然搞得我一開SQL就覺得餓了...。
(C)2006 NewType Software Systems Co., Ltd. All Rights Reserved.
新人類資訊科技股份有限公司 著作權所有,並保留一切權利。