在針對 DB2 存儲過程的開發(fā)中,您是否覺得 DB2 提供的開發(fā)工具雖然功能強大,但是執(zhí)行速度較慢,稍顯笨重,而我們的日常開發(fā)中僅僅使用了一些比較常用的功能。你是否覺得雖然其工具操作起來比較直觀,但是在處理大量創(chuàng)建、修改操作或者重復執(zhí)行一些操作時就會比較費時?是否感覺使用其工具,無法方便的記錄跟蹤我們執(zhí)行過的操作?如果您有上述的問題,本文會給您提供一個解決辦法——使用 Windows 腳本進行 DB2 存儲過程開發(fā)。腳本通常執(zhí)行速度快捷,靈活;善于處理批量操作;以文本格式編寫的腳本也方便我們查看具體我們執(zhí)行了哪些操作。腳本的特點恰恰幫助我們解決了剛剛提到的問題。
本文主要討論使用 Windows 腳本與 DB2 交互的一些常用技巧和方法。介紹了利用 Windows 的腳本(批處理程序)連接數(shù)據(jù)庫,查詢表結(jié)構(gòu),UDF之間的引用關系,存儲過程中使用了哪些表等等。同時通過一個演示項目的開發(fā)過程的介紹來展示如何使用文中的腳本進行開發(fā)。
背景知識簡介
Windows 腳本常用命令
Windows 腳本也稱之為批處理程序,是一個包含了一些需要順序執(zhí)行的 Windows 命令的文本文件,其擴展名為 bat 或 cmd。由于本文的腳本需要傳入?yún)?shù),讀者需要在控制臺中執(zhí)行本文提供的 Windows 腳本。
下面是 Windows 中的一些常用命令和符號。這里僅僅列出一些說明,如果想了解 Window 命令的詳細信息,請參考本文提供的參考資料。
REM:行注釋命令,它不會被執(zhí)行,只是起一個注釋的作用,便于代碼的閱讀和維護;
ECHO:命令主要參數(shù)有 OFF 和 ON,用于控制是否在控制臺上顯示正在執(zhí)行的命令。也可以使用 ECHO message 來顯示一個特定的消息;
GOTO: 即為跳轉(zhuǎn)的意思。在腳本中以“:XXX”構(gòu)建一個標號然后用GOTO XXX 來執(zhí)行標號后的命令;
CALL: 命令用于在主腳本執(zhí)行過程中調(diào)用子腳本,當子腳本執(zhí)行完畢后再繼續(xù)執(zhí)行主腳本。如果我們不使用 CALL 來調(diào)用子腳本,而是在主腳本中直接調(diào)用子腳本,那么被調(diào)用的子腳本執(zhí)行完畢,也就表示主腳本執(zhí)行的完畢,主腳本后續(xù)的命令將不會被執(zhí)行;
PAUSE: 暫時停止腳本的執(zhí)行;
PROMPT: 修改命令提示符。PROMPT [text]。text 表示新的提示符。 $P 代表當前路徑,$G 代表 >;
START: 打開一個新的窗口執(zhí)行某個命令。如果 START 后面跟的是一個文件名,那么 Windows 會調(diào)用打開該種文件的程序?qū)⑵浯蜷_。例如,如果你設定 notepad(記事本)為 *.log 文件的打開程序。那么執(zhí)行 START my.log 命令后,Windows 會啟動 notepad(記事本)程序,并且打開 my.log 文件;
符號(@):@ 符號可以關閉當前命令行的回顯。我們從上面知道用命令 echo off 可以關掉整個批處理的命令回顯但卻不能不顯示 echo off 這個命令?,F(xiàn)在我們在這個命令前加上 @,這樣 echo off 這一命令就被 @ 關閉了回顯,從而達到所有命令均不回顯的要求;
管道(輸出重定向)命令 > 和 >>:將命令輸出的結(jié)果重定向到特定文件中, > 與 >> 的區(qū)別在于,> 會清除文件中原來的內(nèi)容,然后把輸出結(jié)果寫入文件,而 >> 只會追加內(nèi)容到文件中,而不會改動其中原有的內(nèi)容;
Windows 腳本參數(shù):我們可以向腳本傳遞參數(shù),并且可以在腳本中通過 %n 來引用。腳本每次能處理的變量從 %0~%9 共 10 個。其中 %0 默認為批處理的文件名。
DB2 CLP 簡介
DB2 Command Line Processor(DB2 CLP)是所有 DB2 產(chǎn)品中都有的,可以使用這個應用程序運行 DB2 命令、操作系統(tǒng)命令或 SQL 語句。DB2 CLP 可以成為強大的工具,因為它能夠?qū)⒔?jīng)常使用的命令或語句序列存儲在批處理文件中,可以在必要的時候運行這些批處理文件。在 Windows 系統(tǒng)中,必須先(從普通命令窗口)運行 db2cmd 命令來啟動 DB2 命令行環(huán)境。
在什么時候使用本文介紹的腳本?
腳本的優(yōu)勢在于可以重復執(zhí)行。如果一個任務會被執(zhí)行多次,或者被多人執(zhí)行。那么將該任務編寫成腳本會提高任務的執(zhí)行效率和準確性。本文介紹的腳本都是一些在我們進行存儲過程開發(fā)和調(diào)試中經(jīng)常用到的。讀者在后面會漸漸體會到腳本給我們帶來的便利。
DB2 系統(tǒng)表的功能
編寫針對 DB2 的腳本,我們需要首先了解 DB2 為我們提供了哪些命令和信息。DB2 為我們提供了大量的命令例如連接數(shù)據(jù)庫,執(zhí)行一個 SQL 文件,獲得表結(jié)構(gòu)的信息等等。我們會在下面解釋具體的腳本的同時對一些簡單的 DB2 命令進行解釋說明。同時,DB2 把數(shù)據(jù)庫對象的很多信息都存儲到了系統(tǒng)表中。熟悉這些系統(tǒng)表就能夠通過 SQL 語句獲得我們需要的信息。下面我們先來學習一下 DB2 系統(tǒng)表。
在 DB2 數(shù)據(jù)庫被創(chuàng)建的時候,DB2 會創(chuàng)建一些系統(tǒng)表。這些系統(tǒng)表中記錄了所有數(shù)據(jù)庫對象的信息,表或視圖的列的數(shù)據(jù)類型,約束的定義,對象的權(quán)限和對象之間的依賴關系等。這些系統(tǒng)表的模式為 SYSIBM,其表名以 SYS 作為前綴。例如: SYSTABLES、SYSVIEWS 等等。DB2 為這些系統(tǒng)表建立了相對應的只讀視圖。這些視圖的模式是 SYSCAT,它們的內(nèi)容是其相對應的系統(tǒng)表的全部或者部分內(nèi)容。這些視圖的名字沒有 SYS 的前綴。例如:SYSCAT.TABLES 是 SYSIBM.SYSTABLES 的視圖。
我們可以通過 LIST TABLES FOR SYSTEM 或 LIST TABLES FOR SCHEMA schemaname 命令查看所有的系統(tǒng)表和相關的視圖信息。下面我們會介紹一些本文用到的系統(tǒng)表和視圖。
SYSCAT.TABLES:數(shù)據(jù)庫中對象的信息,包括 table,view,nickname 和 alias 的一些定義。詳細說明見表 1。
表 1. SYSCAT.TABLES 視圖的說明
列名數(shù)據(jù)類型描述
TABSCHEMAVARCHAR(128)記錄 schema 的名字
TABNAMEVARCHAR(128)記錄數(shù)據(jù)庫對象的名稱。包括表、視圖、別名等
TYPECHAR(1)表示該數(shù)據(jù)庫對象是表,視圖還是別名 (’T’表示table; ’V’表示 view; ’N’ 表示nickname; ’A’ 表示 alias。)
COLCOUNTSMALLINT表或視圖中列的個數(shù)
……
SYSCAT.VIEWS:視圖的定義信息。詳細說明見表 2。
表 2. SYSCAT.VIEWS 視圖的說明
列名數(shù)據(jù)類型描述
VIEWSCHEMAVARCHAR(128)視圖的 Schema
VIEWNAMEVARCHAR(128)視圖名稱
READONLYCHAR(1)視圖是否只讀:
Y = 視圖是只讀
N = 視圖不是只讀
VALIDCHAR(1)視圖狀態(tài)是否合法:
Y = 視圖狀態(tài)合法(valid)
X = 視圖狀態(tài)不合法(invalid)
TEXTCLOB (64K)視圖的源程序(DDL)
……
SYSCAT.ROUTINES:DB2 UDF,系統(tǒng)方法(system-generated method),用戶定義方法(user-defined method)和存儲過程(SP)的定義。我們可以認為該視圖包含了數(shù)據(jù)庫中程序的定義。
本文主要討論使用 Windows 腳本與 DB2 交互的一些常用技巧和方法。介紹了利用 Windows 的腳本(批處理程序)連接數(shù)據(jù)庫,查詢表結(jié)構(gòu),UDF之間的引用關系,存儲過程中使用了哪些表等等。同時通過一個演示項目的開發(fā)過程的介紹來展示如何使用文中的腳本進行開發(fā)。
背景知識簡介
Windows 腳本常用命令
Windows 腳本也稱之為批處理程序,是一個包含了一些需要順序執(zhí)行的 Windows 命令的文本文件,其擴展名為 bat 或 cmd。由于本文的腳本需要傳入?yún)?shù),讀者需要在控制臺中執(zhí)行本文提供的 Windows 腳本。
下面是 Windows 中的一些常用命令和符號。這里僅僅列出一些說明,如果想了解 Window 命令的詳細信息,請參考本文提供的參考資料。
REM:行注釋命令,它不會被執(zhí)行,只是起一個注釋的作用,便于代碼的閱讀和維護;
ECHO:命令主要參數(shù)有 OFF 和 ON,用于控制是否在控制臺上顯示正在執(zhí)行的命令。也可以使用 ECHO message 來顯示一個特定的消息;
GOTO: 即為跳轉(zhuǎn)的意思。在腳本中以“:XXX”構(gòu)建一個標號然后用GOTO XXX 來執(zhí)行標號后的命令;
CALL: 命令用于在主腳本執(zhí)行過程中調(diào)用子腳本,當子腳本執(zhí)行完畢后再繼續(xù)執(zhí)行主腳本。如果我們不使用 CALL 來調(diào)用子腳本,而是在主腳本中直接調(diào)用子腳本,那么被調(diào)用的子腳本執(zhí)行完畢,也就表示主腳本執(zhí)行的完畢,主腳本后續(xù)的命令將不會被執(zhí)行;
PAUSE: 暫時停止腳本的執(zhí)行;
PROMPT: 修改命令提示符。PROMPT [text]。text 表示新的提示符。 $P 代表當前路徑,$G 代表 >;
START: 打開一個新的窗口執(zhí)行某個命令。如果 START 后面跟的是一個文件名,那么 Windows 會調(diào)用打開該種文件的程序?qū)⑵浯蜷_。例如,如果你設定 notepad(記事本)為 *.log 文件的打開程序。那么執(zhí)行 START my.log 命令后,Windows 會啟動 notepad(記事本)程序,并且打開 my.log 文件;
符號(@):@ 符號可以關閉當前命令行的回顯。我們從上面知道用命令 echo off 可以關掉整個批處理的命令回顯但卻不能不顯示 echo off 這個命令?,F(xiàn)在我們在這個命令前加上 @,這樣 echo off 這一命令就被 @ 關閉了回顯,從而達到所有命令均不回顯的要求;
管道(輸出重定向)命令 > 和 >>:將命令輸出的結(jié)果重定向到特定文件中, > 與 >> 的區(qū)別在于,> 會清除文件中原來的內(nèi)容,然后把輸出結(jié)果寫入文件,而 >> 只會追加內(nèi)容到文件中,而不會改動其中原有的內(nèi)容;
Windows 腳本參數(shù):我們可以向腳本傳遞參數(shù),并且可以在腳本中通過 %n 來引用。腳本每次能處理的變量從 %0~%9 共 10 個。其中 %0 默認為批處理的文件名。
DB2 CLP 簡介
DB2 Command Line Processor(DB2 CLP)是所有 DB2 產(chǎn)品中都有的,可以使用這個應用程序運行 DB2 命令、操作系統(tǒng)命令或 SQL 語句。DB2 CLP 可以成為強大的工具,因為它能夠?qū)⒔?jīng)常使用的命令或語句序列存儲在批處理文件中,可以在必要的時候運行這些批處理文件。在 Windows 系統(tǒng)中,必須先(從普通命令窗口)運行 db2cmd 命令來啟動 DB2 命令行環(huán)境。
在什么時候使用本文介紹的腳本?
腳本的優(yōu)勢在于可以重復執(zhí)行。如果一個任務會被執(zhí)行多次,或者被多人執(zhí)行。那么將該任務編寫成腳本會提高任務的執(zhí)行效率和準確性。本文介紹的腳本都是一些在我們進行存儲過程開發(fā)和調(diào)試中經(jīng)常用到的。讀者在后面會漸漸體會到腳本給我們帶來的便利。
DB2 系統(tǒng)表的功能
編寫針對 DB2 的腳本,我們需要首先了解 DB2 為我們提供了哪些命令和信息。DB2 為我們提供了大量的命令例如連接數(shù)據(jù)庫,執(zhí)行一個 SQL 文件,獲得表結(jié)構(gòu)的信息等等。我們會在下面解釋具體的腳本的同時對一些簡單的 DB2 命令進行解釋說明。同時,DB2 把數(shù)據(jù)庫對象的很多信息都存儲到了系統(tǒng)表中。熟悉這些系統(tǒng)表就能夠通過 SQL 語句獲得我們需要的信息。下面我們先來學習一下 DB2 系統(tǒng)表。
在 DB2 數(shù)據(jù)庫被創(chuàng)建的時候,DB2 會創(chuàng)建一些系統(tǒng)表。這些系統(tǒng)表中記錄了所有數(shù)據(jù)庫對象的信息,表或視圖的列的數(shù)據(jù)類型,約束的定義,對象的權(quán)限和對象之間的依賴關系等。這些系統(tǒng)表的模式為 SYSIBM,其表名以 SYS 作為前綴。例如: SYSTABLES、SYSVIEWS 等等。DB2 為這些系統(tǒng)表建立了相對應的只讀視圖。這些視圖的模式是 SYSCAT,它們的內(nèi)容是其相對應的系統(tǒng)表的全部或者部分內(nèi)容。這些視圖的名字沒有 SYS 的前綴。例如:SYSCAT.TABLES 是 SYSIBM.SYSTABLES 的視圖。
我們可以通過 LIST TABLES FOR SYSTEM 或 LIST TABLES FOR SCHEMA schemaname 命令查看所有的系統(tǒng)表和相關的視圖信息。下面我們會介紹一些本文用到的系統(tǒng)表和視圖。
SYSCAT.TABLES:數(shù)據(jù)庫中對象的信息,包括 table,view,nickname 和 alias 的一些定義。詳細說明見表 1。
表 1. SYSCAT.TABLES 視圖的說明
列名數(shù)據(jù)類型描述
TABSCHEMAVARCHAR(128)記錄 schema 的名字
TABNAMEVARCHAR(128)記錄數(shù)據(jù)庫對象的名稱。包括表、視圖、別名等
TYPECHAR(1)表示該數(shù)據(jù)庫對象是表,視圖還是別名 (’T’表示table; ’V’表示 view; ’N’ 表示nickname; ’A’ 表示 alias。)
COLCOUNTSMALLINT表或視圖中列的個數(shù)
……
SYSCAT.VIEWS:視圖的定義信息。詳細說明見表 2。
表 2. SYSCAT.VIEWS 視圖的說明
列名數(shù)據(jù)類型描述
VIEWSCHEMAVARCHAR(128)視圖的 Schema
VIEWNAMEVARCHAR(128)視圖名稱
READONLYCHAR(1)視圖是否只讀:
Y = 視圖是只讀
N = 視圖不是只讀
VALIDCHAR(1)視圖狀態(tài)是否合法:
Y = 視圖狀態(tài)合法(valid)
X = 視圖狀態(tài)不合法(invalid)
TEXTCLOB (64K)視圖的源程序(DDL)
……
SYSCAT.ROUTINES:DB2 UDF,系統(tǒng)方法(system-generated method),用戶定義方法(user-defined method)和存儲過程(SP)的定義。我們可以認為該視圖包含了數(shù)據(jù)庫中程序的定義。

