如果我有1個調用2個其他COBOL DB2子程序的COBOL DB2程序,那麼它將創建多少個DBRM,包,計劃?如果我正在更改任何一個子程序,那麼我是否需要重新編譯並綁定所有程序?我非常困惑DBRM,計劃和程序包。COBOL DB2程序
問候, 瑪納斯
如果我有1個調用2個其他COBOL DB2子程序的COBOL DB2程序,那麼它將創建多少個DBRM,包,計劃?如果我正在更改任何一個子程序,那麼我是否需要重新編譯並綁定所有程序?我非常困惑DBRM,計劃和程序包。COBOL DB2程序
問候, 瑪納斯
噢,我的...這是一個很大的話題所以這 答案將是非常簡單的,因此不完整的。
答案在某種程度上取決於您是使用DB/2預編譯程序還是使用聯合編譯程序。對於這個 答案我會假設你正在使用預編譯器。如果你正在使用聯合編譯器,原理幾乎相同,但機制有點不同。
這裏的目標是產生:
它們之間的所有內容都支持爲您的程序創建適當的DB/2計劃 的機制。
的力學
每個程序和/或含DB/2語句子程序需要 要由DB/2預編譯預處理。預編譯器 創建一個DBRM(數據庫請求模塊)。預編譯還會通過在所有EXEC SQL...END-EXEC
語句中評論 來更改源程序,並用對DB/2子系統的特定調用來替換它們。 然後,您使用常規的COBOL編譯器編譯預處理器發出的代碼,以生成一個目標模塊,然後將其鏈接到可執行文件中。
預編譯生成的DBRM包含程序中包含的 的SQL語句列表,以及DB/2用於 將這些特定SQL語句與程序關聯的一些其他信息。 DBRM通常寫入 一個永久性數據集(通常是PDS),然後輸入到DB/2 Binder,其中程序中每個SQL語句的特定訪問路徑編譯爲DB/2 可以實際使用。 DB/2的綁定器的功能與編譯器對COBOL的功能大致相同。 將DBRM視爲源代碼,將Binder作爲編譯器。
當DBRM綁定時生成的訪問路徑信息需要存儲在某個地方,以便在您的程序調用DB/2時可以定位和使用 。
在哪裏把粘結劑輸出?您的選擇是將其綁定到一個包或直接到一個計劃。
最短路徑是將一組DBRM直接綁定到一個Plan中。然而,就像許多捷徑一樣,這可能不是最有效的事情(稍後我會談及其原因)。
大多數大型系統不會將DBRM直接綁定到計劃中,它們將綁定到一個包中。綁定 包存儲在DB/2子系統中(與計劃相同)。那麼什麼是套餐? A包裝是綁定的單個 DBRM。另一方面,計劃通常包含多個DBRM的訪問路徑。
現在我們有一套軟件包,每個軟件包包含其各自DBRM的SQL訪問路徑,其中 源自給定的 程序。我們需要從這些方面構建一個計劃。爲此,通常由您的數據庫管理員創建一套綁定卡 。綁定卡只是DB/2 Binder(它們不是打孔卡)的一種「源代碼」 。 綁定卡定義了給定計劃的哪些包形成 。然後將它們提交給將其組裝成計劃的Binder。注意: 您也可能聽到提及的集合,這些只是名稱分組的軟件包,其中 已由您的DBA定義。
總之,我們有以下過程:
Program -> (Pre-Compiler) -> Modified Program -> (COBOL compiler) -> Object -> (Link) -> Load Module -> DBRM -> (DB/2 Bind) -> Package Bind Cards -> (DB/2 Bind) -> DB/2 Plan Package(s) ->
兩個根本性這裏輸出是一個加載模塊(可執行COBOL程序)和DB/2計劃。程序 和Plan一起在您的JCL中,您必須將EXEC語句 中的計劃名稱與程序一起運行。
利用這短暫的,並且高度簡化,背景,讓我們嘗試回答你的問題:
如何可以創建DBRMs?每含SQL EXEC
陳述
程序
一個DBRM多少包創建?
包由一個DBRM構建而成。源程序和包裝之間存在1:1的對應關係
創建了多少個計劃?
任何給定的包可能包含在多個集合和/或多個綁定卡集中。這 意味着一個給定的包可能包含在多個計劃中。
如果我改變一個程序受到什麼影響?
如果您將DBRM直接綁定到計劃中,則必須重新綁定使用 即DBRM的每個計劃。這可能是一個非常耗時且容易出錯的命題。
但是,如果您將DBRM綁定到一個包中,那麼您只需重新綁定該包。 由於程序和軟件包之間存在1:1的對應關係,因此只需要執行一次綁定 即可。計劃需要反彈的唯一時間是在定義它的綁定卡集中添加或刪除包或集合 。
使用軟件包的優勢應該從上面清楚,這就是爲什麼大多數 商店不會將DBRM直接綁定到計劃中,而是使用軟件包代替。
非常感謝尼爾:)它減少了我的困惑...... :) – Saisha 2010-08-11 06:59:31