(interbase之九)intebase的儲存過程、觸發器以及事件、異常 (轉)

worldblog發表於2008-01-24
(interbase之九)intebase的儲存過程、觸發器以及事件、異常 (轉)[@more@]

(interbase之九)intebase的過程、以及事件、異常

原創 to:">kylixyqh
-------------------------------------------------------------------
說明:本來我想把《interbase中文開發指南》中有關儲存過程、觸發器的章節全部照搬過來,但考慮到儲存過程、觸發器的重要性,相信大部分人已經進行了相當的研究,因此,為了節約篇幅和時間,我把其中的定義、變數宣告、語句語法等大量內容全部刪除;其中,事務處理請參照前面的帖子。請大家諒解。感興趣的可以參考有關資料。
一、使用儲存過程、觸發器的好處
1、在不需要客戶端的情況下在端複雜的操作
2、可以被多個客戶端共享使用(程式碼共享)
3、極大的減小流量,提高網路利用率
4、在伺服器端執行,速度快
5、可以將複雜的任務劃分為多個簡單的商業邏輯
6、儲存過程對某些需要週期性處理的任務特別有用
7、儲存過程在客戶端和伺服器端提供了良好的併發性
8、觸發器是維護資料一致性的基本工具
9、觸發器常被用在為插入新行提供唯一主鍵值
10、觸發器常被用來儲存一些狀態資訊
11、儲存過程和觸發器是interbase事件警告機理的有力組成部分
12、儲存過程增強了資料的性
二、何時使用儲存過程和觸發器
儲存過程:1、不需要任何客戶端資訊而在伺服器端完成的操作2、涉及到大量行的操作、運算3、頻繁的、週期性的操作4、那些被多個模組共同執行的操作
觸發器:1、before insert/update觸發器可以檢查操作是否完成以及資料的一致性,或者為那些需要唯一編號的列提供數值2、before delete觸發器可以在刪除時檢查主要明細表之間的關係,也可以終止刪除。3、所有的before觸發器均可以透過激發異常終止操作回退事務4、所有的after觸發器均可以在更改完成後做一些審計或更改其他相關表的操作。
三、儲存過程
一般的,interbase的儲存過程分為兩大類,它是根據客戶端在儲存過程時使用的不同方法劃分的。一類是選擇式儲存過程,客戶端使用語句呼叫儲存過程,此時儲存過程的作用好像和表、檢視一樣,選擇式儲存過程必須返回一個或多個數值(在客戶端的行為象資料行)或錯誤或引數資訊。另一類是執行式儲存過程,客戶端使用excute procedure來呼叫儲存過程,這類儲存過程大多數只執行一些動作而不返回數值,當然它也可以返回一些引數資訊。建立儲存過程時你一定要事先規劃好你準備按照哪一類進行編寫,這是確儲存儲過程可能正確執行的良好習慣。如果你準備將來在客戶端使用select呼叫,就遵守選擇式儲存過程的規則編寫;如果你想使用excute procedure呼叫,就按照執行式儲存過程的規則編寫。儲存過程的型別不同,suspend,exit,end的功能也不同。下面說明suspend,exit,end在兩類儲存過程中的作用。
1、suspend語句:在選擇式儲存過程中,當儲存過程向客戶端返回資料時,suspend暫時停止儲存過程的執行,即掛起儲存過程,直到客戶端獲取了返回值為止,然後接著suspend之後的語句繼續執行。suspend的作用就是當有資料要返回客戶端時防止客戶端未成功取得返回值而繼續執行儲存過程,從而有可能導致將儲存過程執行結束退出。根據上述說明,就可以瞭解,當你在選擇式儲存過程中使用select或select into等語句向客戶端返回資料(行)時,在上述語句之後一定要緊跟suspend語句。在複雜的儲存過程中,不可能只有select性質的語句,可能還有insert,update,delete等可執行語句,這時就要明白,在選擇式儲存過程中,suspend語句之後的所有可執行語句都被執行,儘管此時已經沒有值要返回給客戶端,最後的end語句終止整個儲存過程的執行。interbase不推薦在執行式儲存過程中使用suspend。因為在執行式儲存過程中,suspend語句之後的所有語句永遠都不會被執行,將直接跳轉到最後一個end語句,並返回引數,退出儲存過程。所以如果你偶爾(或不得不)沒有遵守interbase推薦的規則在執行式儲存過程中使用了suspend而產生了意料不到的結果,你就要思考一下suspend的用法了。
2、exit語句:在選擇式儲存過程中,exit語句直接將程式執行跳轉到最後一個end語句從而終止儲存過程的執行。因此,在選擇式儲存過程中,使用exit語句最理想的情況是當需要在滿足一定條件時提前結束儲存過程的執行。在執行式儲存過程中,exit也將程式執行跳轉到最後一個ennd語句,表明儲存過程的工作已經完成,同時如果有返回引數的話,將他們返回給客戶端。
3、end語句:在選擇式儲存過程中,當執行到最後一個end語句時,結束儲存過程的執行,將控制權返給客戶端,並設定sqlcode為100。在執行式儲存過程中,最後一個end語句也終止儲存過程的執行,同時將輸出引數返回給客戶端(如果有的話)。
因此,可以將suspend,exit,end三個語句的作用簡明地總結如下:suspend用於返回具有資料行性質的數值給客戶端;exit用於提前結束程式的執行;end則用於真正終止儲存過程並將輸出引數返回給客戶端。
三、儲存過程、觸發器中的事件、異常、錯誤處理
1、事件:interbase一個顯著的特點就是可以在儲存過程、觸發器中透過使用事件來進行非同步訊息處理。相信有很多人已經感受到伺服器端和客戶端進行非同步訊息處理的迫切性了。interbase在儲存過程、觸發器中允許使用post_event來幫助我們解決上述問題。所謂事件,實際就是一個自定義的訊息標識,用以實現伺服器與客戶端的非同步通訊。使用事件的方法是:在儲存過程或觸發器中用post_event("xxxxx")定義並向interbase的訊息管理佇列新增註冊訊息,這是伺服器端。在客戶端,首先註冊相應的訊息,然後當伺服器端投寄了訊息之後,客戶端對該訊息作出相應的反應。需要注意的是,如果伺服器端發起了多個相同的訊息,那麼伺服器只向客戶端投寄一個訊息而不是將所有這些訊息全部投寄給客戶端。如果你使用的IBX編寫客戶端的話,就可以很方便地使用TIBevent進行訊息處理。
2、異常:異常是interbase的一個,它實際是一個經過命名的錯誤。但是一定要注意而且區分,異常決不是用來處理intebase資料庫錯誤的(比如主鍵錯誤等),它只是用來實現所謂的商業邏輯的。比如你不允許刪除當前活動訂單中的庫存專案就可以使用者執行儲存過程欲刪除庫存時激發一個異常,表明不能進行刪除。可見,異常完全是一個商業邏輯行為。異常被激發後,整個儲存過程或觸發器將被終止,該儲存過程或觸發器所在的事務鏈將被回退,並向客戶端返回定義的有關錯誤說明。
事件與異常的比較:事件發生後,不影響程式的執行,事件在需要伺服器端通知客戶端訊息時非常重要,事件機理本身是多執行緒結構,無須客戶端一直去檢測等待;異常激發後,則終止程式執行,回退全部事務。
3、intebase錯誤處理:在interbase中,錯誤一般分為資料庫錯誤和資料庫引擎錯誤。而在儲存過程中,一般使用when....do語句進行錯誤處理,和delphi的try...exception類似。when...do可以捕獲並處理一下三類錯誤:異常(使用者自定義邏輯錯誤)、資料庫錯誤(SQL錯誤:透過變數sqlcode進行檢測)、資料庫引擎錯誤(interbase錯誤:透過變數GDde檢測)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998345/,如需轉載,請註明出處,否則將追究法律責任。

相關文章