• 沒有找到結果。

第三章 系統架構與設計

3.3 程序 (P ROCEDURE )

相較於在格網環境上撰寫應用程式,我們系統提出了讓使用者編寫能夠在 資料庫端執行的程序。使用者利用XML 來編輯一段程序,在編輯程序的過程裡,

我們提供了<if>的條件判斷,<loop>的迴圈控制,以及<call>來呼叫已存在的

<entity name="Array1">

<attr name="Date" value="2004/01/01"/>

<attr name="Owner" value="Poseidon"/>

</entity>

oracle 內儲程式,並且允許使用者在程式中插入檢查點<check point>,檢查點的

<arg name="A" />

<checkPoint label=" Point " />

<loop>

<call name=" Procedure Name " >

</call>

</proc>

的屬性”name”,則代表被呼叫的內儲程式在資料庫內的名稱,同樣的,每個內儲 程式也有自己定義的傳入參數值,也需要在此給定。標籤<loop>則是定義一個迴 圈的程式,其中的<endloop>標籤,定義著這個迴圈結束執行的條件。標籤

<checkPoint>則是提供給使用者一個類似 debugger 的機制,label 這個屬性,讓使 用者定義程式執行的一個標記,當這個內儲程式在執行時,系統會有一個使用者 介面來顯示目前執行到的檢查點。因此檢查點的設計,能夠向使用者報告目前程 式執行的程度。當程式中呼叫到其他的內儲程式,且此內儲程式中也有包含檢查 點時,亦能夠同時在使用者介面上顯現出來。

上述以<proc>為標籤來定義的程序,系統會將其轉譯成資料庫內可執行的 內儲程式,並且儲存進本地端的資料庫。除此之外,我們還定義了另一種以<prog>

為標籤的程序。

表 5 Prog Scheme

與以<proc>定義的程序最大的不同,<prog>定義的程序,可以看做是一群 工作的集合,在定義完後後並不會編譯成內儲程式儲存。表(5)中我們看到的範 例,在<prog>中的每個子標籤,可以看做是一個個獨立的工作,每個工作可以是

<prog name= "test">

<call name=" procedure name" >

<hidb name=" server 1 "

… />

<arg A ="" />

</call>

<copy tblid=””>

<hidb name="server 2"

…/>

</copy>

</prog>

呼叫資料庫內的內儲程式,或是傳送資料至遠端資料庫。<call>這個標籤是要去 呼叫name 這個屬性代表的存在資料庫內的內儲程式,而其中的<arg>的子標籤則 是指定這個內儲程序執行時所需要的參數,子標籤<hidb>則是指定了要去對哪一 台資料庫主機進行呼叫這個動作,標籤內的參數給定了對資料庫建立連線的資 訊。接下來的<copy>標籤,則會完成資料傳輸與儲存資料兩個動作,這個工作會 將本地端內的矩陣類型的資料產生.dmp 檔案,在傳輸到指定的機器上並會同時 完成輸入至資料庫的動作,而達到資料複製的目的。同樣的使用者必須要在子標 籤<hidb>中定義目的地主機。

利用<prog>編輯的程序,讓使用者決定了要將哪份工作分派至哪一台主 機,或是要將資料傳送至某台主機,也可以利用遠端主機的內儲程式對來自本端 輸入的資料作運算,來達到計算分散化平行化的目的。編輯程序完整的DTD 在 附錄(二)。

在經由<proc>標籤所定義的程序在編譯之後,會轉譯成資料庫可執行的內 儲程式並儲存在資料庫內,為了對應儲存在資料庫內部的內儲程式,我們定義了 程序(procedure)這個類型。在 Oracle 的 DBMS 環境下,當使用者建立了內儲程 式後,除了直接呼叫執行之外,並無法利用資料庫一般的DML(Data Management Language)來選取,使用者無法得知此資料庫內已存在哪些內儲程式可應用,所 以我們除了讓使用者以XML 定義內儲程式之外,也將定義的 XML 程式以及編 譯後的內儲程式,一同儲存在資料表中。表(6)為程序這個類型的定義。

表 6 Procedure Type 定義

<type name = "Procedure">

<has ints = "false"

strs = "true"

image = "false"

floats = "false"

refs = "false"/>

</type>

相關文件