程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 用 REXX 編寫用於 DB2 Universal Database 的腳本: 快速學習 REXX

用 REXX 編寫用於 DB2 Universal Database 的腳本: 快速學習 REXX

編輯:DB2教程

簡介

如果您在 IBM 操作系統下編寫過程序,那麼肯定聽說過 Rexx。Rexx 是 IBM 隨其大型主機、中型操作系統和更低端操作系統一起捆綁的腳本和命令語言。您可能不清楚的是,Rexx 幾乎可以在世界上各種其他的操作系統上運行。您可以免費下載用於各版本的 Windows®、Linux、UNIX®、BSD、Mac OS 和 DOS 以及很多其他系統的 Rexx。它甚至可以在用於手持設備的三大主流操作系統 Windows CE、Palm OS 和 SymBian/EPOC32 上運行。

這意味著,如果您學習 Rexx,就可以知道一種可以在從大型主機到手持設備的各種地方運行的腳本語言。Rexx 是一種通用的語言,它強大得足以適合大型主機,但是又靈活得足以適合其他平台。最棒的是,Rexx 容易學習。

在本文中,我將對 Rexx 作一個簡要的介紹,作為使用它訪問 IBM DB2 UDB 數據的基礎。(在後續的文章中,我將給出並討論更多的 Rexx 腳本示例,以便更深入地解釋如何專門為 DB2 應用程序編寫 Rexx 腳本。)我將對 Rexx 語言進行概述,並展示學習 Rexx 語言是多麼的容易。我還將描述很多可用的免費和開放源碼的 Rexx 解釋器,並告訴您在哪裡可以下載這些解釋器。最重要的是,我將為您指出 Web 上提供的其他免費信息來源(參閱參考資料)。在幾天時間內,您可以學習使用 Rexx 編程,Rexx 是一種腳本語言,適用於幾乎任何編程問題,並且幾乎可以在任何機器上運行。

快速了解 Rexx

您已經知道 Rexx 容易學習,那麼現在就來驗證一下吧。下面是一個完整的 Rexx 腳本:

input = 'invoice_file.txt'      /* Name the input file    */
do while lines(input) > 0    /* Do while "lines to read"  */
 
     input_line = linein(input)     /* Read in the next line   */
     if pos("INVOICE OVERDUE", input_line) > 0  then
       say "Found it! Here's where:" input_line  
     else
       say "Not found in this line:"  input_line  
end

這個腳本從一個輸入文件讀取所有的行,每次讀取一行,並掃描各行,以發現短語 INVOICE OVERDUE。如果該腳本發現了這個短語,則寫出一條消息以及短語所在的行。它還通過一條合適的 "not found" 消息顯示被排除的行。

在該腳本中,第一行將輸入文件的名稱(這裡是 invoice_file.txt)賦給一個名為 input 的變量。這是一個簡單的賦值語句,與大多數編程語言中的一樣。在 Rexx 中,賦給變量的字符串或文字可以用單引號或雙引號括起來:

input = ‘invoice_file.txt’        /* Name the input file    */

接下來的 do while 循環逐行處理輸入文件中的輸入行。它使用內置的 lines 函數來判斷在輸入文件中是否還有未讀到的行。如果沒有剩下要讀的行,則 lines 函數返回 0:

do while  lines(input) > 0    /* Do while there are lines to read */

在 Rexx 中,所有內置函數都很容易識別,因為這些函數後面都會緊跟著括號,括號中包含函數的輸入參數。函數與緊隨的左括號之間不能有空格。前面的語句表明,lines 函數只帶有一個參數,該參數就是它將測試其 "end of file" 的文件的名稱。記住,在我們的腳本中,變量 input 指的是名為 invoice_file.txt 的輸入文件。

現在便到了程序的核心。這一行使用 Rexx 的 pos 內置函數來判斷輸入行是否包含字符串 INVOICE OVERDUE:

if pos("INVOICE OVERDUE", input_line) > 0  then

pos 函數返回 INVOICE OVERDUE 在給定行中出現的位置。或者,如果在行中沒有找到該短語,則返回 0。

這條語句中的測試讓該腳本寫一行文本到顯示屏幕上,表明字符串 INVOICE OVERDUE 是否存在於輸入行中。然後,Rexx 的 say 指令寫輸出行。在我們的例子中,say 指令有兩個操作對象。第一個操作對象是用引號括起來的一個字符串文字,第二個操作對象是包含文件中當前行的變量。say 指令可以帶任意個操作對象,它會自動將這些操作對象連接在一起,並將它們發送到用戶的顯示屏幕:

  if pos("INVOICE OVERDUE", input_line) > 0  then
   say "Found it! Here’s where:" input_line
  else
   say "Not found in this line:"  input_line

好了。您已經看到了一個完整的 Rexx 腳本。從中可以看出,Rexx 在語法方面要求很少,而且沒有“專用字符”。這是不是使之成為容易的語言的原因呢?

Rexx 為什麼容易

我給出的簡單腳本演示了 Rexx 的易用性。例如,它表明您不需要聲明或預定義程序變量。您可以在任何時候、任何地方直接引用一個新的變量,Rexx 會定義這個變量。例如,程序中的第一行通過給變量 input 賦一個值自動定義該變量。在使用這個變量之前,不需要聲明或預定義該變量。

同樣也不需要聲明變量的數據類型。在 Rexx 中,所有變量都是無類型的。而且,變量包含可變長度的字符串,變量的內容便定義了變量的類型。如果您將一個看上去像是數值的字符串賦給一個變量,那麼 Rexx 將允許您在此變量上執行計算。如果將一個字符串賦給一個變量,那麼 Rexx 將允許您在此變量上執行字符串操作(例如解析、模式匹配或並置)。有些語言要求預定義變量,並指定變量的“數據類型”,而 Rexx 則通過變量的內容和使用情況動態地定義變量。必要時,Rexx 透明地轉換數據,並且將很多細節工作自動化,這一點把使用其他語言的程序員吸引了過來。

下面是一個簡單的例子:

a = 3       /* Create a numeric variable          */
b = "4"      /* This string value also represents a number */
  
say  a + b    /* Displays the numeric result: 7       */
say a || b   /* Concatenate the two strings together…    */
             /* Displays: 34               */
    
c = "Hi!"     /* Create variable that is a character string */
  
say  a + c   /* This results in error! You can not     */
          /* add a character value to a number      */
-> SYNTAX: Bad arithmetic conversion (error 41)

該代碼首先創建兩個變量,這兩個變量包含表示數的值。(在 Rexx 中,數 是由數字組成的任何串,中間可以包含小數點,前面還可以有符號。數還可以用科學或工程計數法中的指數形式表達。)第三條語句展示了兩個數的相加,第四條語句表明這兩個變量還可以看作是由單個數字組成的字符串。第四條語句通過並置操作符 || 將兩個字符串(恰好是由數字組成的字符串)並置或粘貼在一起。最後兩行表明,雖然 Rexx 可以隨時自動執行轉換,但它不允許將非數字字符串與一個數相加。在計算中,只有包含數值的變量才可以看作數。

讓我們回到最初的那個例子:掃描字符串 INVOICE OVERDUE 的腳本。注意,該腳本不打開它的輸入文件。文件很像是變量,在使用之前無需顯式地定義它們 — 您可以直接開始讀或寫文件。同樣,程序在使用文件之後不必關閉文件,因為當程序終止時文件會自動關閉。我也沒有正式地結束該腳本(您可以編寫一個 Rexx 出口指令來結束 Rexx 代碼,但這不是必需的)。

Rexx 除了為您執行這些隱式操作之外,Rexx 還很容易,因為它是一種格式自由的語言。您可以隨意使用空格、空白行和縮進。作為一個簡單的例子,您也可以像下面這樣來編寫 if 語句,而結果是一樣的:

      if pos("INVOICE OVERDUE", input_line) > 0 
    then say "Found it! Here’s where:" input_line
    else say "Not found in this line:"  input_line

就格式而言,Rexx 是編程語言中最為寬松的。而且,它不是大小寫敏感的。它的指令、函數和變量可以用大寫、小寫或大小寫混合的形式編寫。例如,您也可以將變量名 input_line 寫為 INPUT_LINE、Input_Line 或 Input_line;對於 Rexx 來說這都是一樣的。還有一種編寫 if 語句的方法,即使用大小寫將 Rexx 指令和函數與語句的其他部分區分開來:

IF POS("INVOICE OVERDUE", Input_Line) > 0 THEN SAY "Found it! Here’s where:" Input_Line ELSE SAY "Not found in this line:" Input_Line

Rexx 為什麼強大

除了它的易用性外,Rexx 的基本設計使得它成為一種強大的語言。如 圖 1 所示,Rexx 有大約 20 條指令作為一個小小的核心。這個核心周圍有大約 70 個內置函數。這樣一來,基礎的東西很容易學習,然後又可以逐漸增長函數方面的知識。這同時也意味著 Rexx 的強大性。除了內置函數外,Rexx 腳本很容易訪問免費的外部函數庫、工具和接口。這涉及每種能想像到的接口,包括數據庫訪問、圖形用戶界面、XML、Web 服務器編程、圖、 MIDI 接口、Windows Registry 更新、語音合成以及 apache 編程 — 只要您提供名稱,Rexx 就能訪問。

圖 1. Rexx 的組成

用 REXX 編寫用於 DB2 Universal Database 的腳本: 快速學習 REXX

Rexx 之所以強大,很大程度上是因為它是一種“膠水”語言。Rexx 腳本容易發出操作系統命令。因此,數年前 IBM 就選擇 Rexx 作為用於其大型主機和其他操作系統的“命令過程語言”。Rexx 將現有的代碼粘合在一起 — 不管代碼的形式是操作系統命令、界面 API、服務、小配件、對象、函數、接口還是工具 — 並利用這一點獲得更大的生產率。這就是 Rexx 之類的腳本語言比傳統的、需要編譯的編程語言(如 C++、C、COBOL 或 Java™)要強大得多的原因。雖然這些語言通過一定的努力也可以發出操作系統命令以及使用一般的接口,但 Rexx 之類的腳本語言是專門為此而設計的。

Rexx 最強大的特性之一是數組(在其他編程語言中有時候也稱為表)的實現。使數組強大的原因是,數組不但可以通過數字下標索引,而且還可以用字符串作為數組的下標。因此,數組支持所謂的按內容尋址的存儲器或關聯存儲器。這使得 Rexx 數組的威力遠遠超出了編程語言中表的威力,後者只支持數字下標。例如,數組可以支持字典查詢,並為高級類型的數據結構,例如鍵-值對、鏈接表、雙鏈表和樹形成基礎。數組是將變量與值以對程序最有意義的任何方式相關聯的常用手段,所以更應該將它們稱作復合變量。

Rexx 特性

接下來,我將簡要地描述 Rexx 的一些其他特性。該語言包括一組完整的指令,用於控制程序邏輯(例如 do、do while、if、if-then-else、select、call、return 和 exit)。它支持結構化程序設計 和模塊性,這是作為廣為接受的程序設計最佳實踐的原則。但是 Rexx 是一種強大的語言,包括用於非結構化邏輯的指令,在少數情況下需要用到這些指令。這些指令包括 iterate、leave、do until、do forever 和 signal (大致類似於其他語言中的 goto)。

我曾提到,Rexx 包含 70 多個內置函數。這些函數分為字符串操作、位操作、數字、輸入/輸出、轉換、環境和雜項等類別。Rexx 腳本像調用內置函數或用戶編寫的函數一樣調用外部函數(假設已建立到外部函數庫的連接)。所以,當使用外部函數庫或附加函數庫時,Rexx 代碼像對待該語言的內置特性一樣引用那些函數。

與大多數解釋器一樣,Rexx 支持交互式調試。您可以運行一個腳本,在任何時候停止它,檢查腳本的變量,甚至重新運行代碼或者修改代碼。Rexx 內置的調試器使得發現和修復邏輯錯誤非常容易。交互式調試通常被認為比批模式調試更好(Rexx 也支持批模式調試)。

Rexx 還包括一個異常或錯誤處理程序。這可以為很多常見的錯誤條件(例如語法錯誤或算術上溢)設陷,並將控制流轉移到您自己編寫的一個專門的錯誤處理例程。異常設陷提供了通過一個單獨的例程來管理常見錯誤的標准方式。

Rexx 還支持一種名為外部數據隊列(external data queue) 的通信機制,但是通常被簡單地稱為棧。作為 Rexx 獨有的一個強大特性,棧為 Rexx 例程或程序之間的通信提供了手段。取決於主機操作系統和 Rexx 解釋器,棧支持相同機器上不同程序甚至不同機器上的不同程序之間的通信。這包括跨 Internet 的遠程通信。當然,Rexx 腳本還可以采用更傳統的通信手段,例如 TCP/IP、FTP、套接字和管道。

最後,我應該提到 Rexx 腳本的可移植性。Rexx 有一個較強的語言標准,本文提到的所有解釋器都遵從這個標准。這不僅使 Rexx 技巧可以轉移,而且表明這種腳本是可移植的。有了標准 Rexx 腳本,您可以很容易地將它在 Linux、Windows、大型主機、手持設備之間移植。如果腳本發出特定於操作系統的命令,那麼 Rexx 會提供一些免費的、跨平台接口來緩沖腳本對平台的依賴。

下載免費的 Rexx

我曾提到,Rexx 是和所有 IBM 操作系統捆綁在一起的。此外,您可以下載免費的或開放源碼的用於任何操作系統的 Rexx。一共有 8 種免費或開放源碼 Rexx 解釋器。每種解釋器都符合 Rexx 標准,所以您的 Rexx 技巧適用於所有這些解釋器,並且 Rexx 腳本在上述任意解釋器下均可運行。這些解釋器之間的不同之處在於它們所支持的平台以及所提供的額外的東西。例如,有些解釋器在手持設備上運行,其他一些解釋器提供了特定於操作系統的語言擴展,其他解釋器支持完全面向對象的編程。

下面是 6 個免費的 Rexx 解釋器的概述:

Rexx 解釋器 解釋器 平台 簡介 Regina 所有主流操作系統 最流行的 Rexx 解釋器。它擁有很大的用戶社區,這意味著可以獲得廣泛的支持,而且它完全使用免費的工具和接口。它附帶了很多額外的內置函數以及非常好的、專業的文檔。如果您剛接觸 Rexx,那麼我建議從 Regina 開始。 Rexx/imc Linux、UNIX、BSD 這是面向 UNIX 和 Linux 的解釋器,包括用於這兩種環境的擴展。它長期提供良好的支持。 BRexx Linux、UNIX、Windows CE、Mac OS、16 位和 32 位 DOS 及其他 這種非常快的解釋器占用內存很少,可以在很多平台上運行,包括資源受限的系統,例如 Windows CE、嵌入式 Linux 和 DOS。它提供了很多額外的函數及接口,並長期提供良好的支持。 Reginald Windows Reginald 為 Windows 程序員定制和擴展 Rexx。它易於使用,並且包括很多 Windows 工具,例如一個 GUI、語音、MIDI 和媒體函數。Reginald 為諸如 VBScript 之類的專用工具提供了一種標准的語言方案,並提供了包含示例在內的良好文檔。 r4 Windows r4 擴展了用於 Windows 的 Rexx,提供了很多工具,包括一個 GUI 窗體工具、彩色的文本文件浏覽器和編輯器、超過 135 種 Windows 命令工具、XML 到 Html 的自動轉換器、GUI 小配件,等等。它還包括很好的教程以及示例腳本。 用於 Palm OS 的 Rexx Palm OS 這種解釋器通過腳本將 Palm OS 應用程序與數據庫粘合在一起,腳本無需離開當前的應用程序便可運行。這些腳本可以訪問所有的 Palm 數據和資源,包括 TCP/IP、紅外線、USB 和串行通信、控制台、剪切板等。它在本地運行,帶有易於遵循的教程,其中包含很好的示例腳本。

除了這些標准的過程 Rexx 解釋器以外,還有兩種面向對象的 Rexx 解釋器。它們是完全面向對象的語言,帶有完整而強大的類庫。它們支持所有 OOP 原理,包括類繼承、繼承、多重繼承、封裝、抽象和多態。這兩種產品都是標准的過程 Rexx 的超集,所以通過使用標准 Rexx 特性和函數便可以立即開始用它們來編程,然後逐漸涉及面向對象特性。此外,標准的 Rexx 腳本可以不作修改地在這兩種解釋器下運行:

面向對象 Rexx 解釋器 解釋器 平台 簡介 Open Object Rexx Windows、Linux、UNIX 這是傳統 Rexx 的完全面向對象的超集。它由 IBM 開發,在 2004 年末成為開放源碼的。現在它由 Rexx Language Association 升級和維護,是最廣泛使用的面向對象 Rexx 解釋器。 roo! Windows roo! 也是傳統 Rexx 的完全面向對象的超集。它與標准 r4 Rexx 解釋器來自相同的公司,附帶了同樣豐富的 Windows 工具。它還包括簡潔易懂的教程,幫助理解標准 Rexx 編程與面向對象 Rexx 編程之間的差異。

最後要提到的是,還有一種用於 Java 環境的 Rexx,即 NetRexx。在本文中討論的所有 Rexx 解釋器當中,只有這種解釋器不符合 Rexx 語言標准 — 所以稱其為“類 Rexx”最為恰當。這種解釋器的作用是將 Rexx 的易用性帶入到 Java 環境。NetRexx 腳本使用 Java 類,它們可以通過 Java 腳本創建 Java 類。NetRexx 允許編寫 applet、應用程序和 servlet,而不會與 Java 中繼承於 C 的語法發生沖突。您甚至可以使用它來創建 Java Beans 和生成帶有完整注釋的 Java 代碼。NetRexx 同時支持客戶端和服務器端腳本,可以在任何 Java 虛擬機(JVM)上運行。

接下來的內容

在我接下來的文章中,我將更多地涉及 Rexx 編程的技術方面,並提供一些實用的編程示例。這些示例腳本將演示如何使用 Rexx 作為快速開發訪問 DB2 UDB 數據的程序的工具。除了傳授更多關於 Rexx 腳本編制的知識外,還將提供相應的實用數據庫示例。我將采用 Regina Rexx 解釋器,它為示例腳本訪問 Windows 服務器上的 DB2 UDB。但是我要使用的 Rexx 和數據庫接口都可以在 Linux、UNIX 和其他操作系統之間移植。

使用像 Rexx 這樣的開放源碼語言的一大好處是,可以隨處找到很多免費的相關參考資料(參閱 參考資料)。

開放源碼/免費軟件運動是我們這個時代偉大的技術傳奇之一。當今另一個大趨勢就是腳本編制。Rexx 立足於這兩大趨勢的交叉點。它提供了一種免費的、易於使用的、強大的、標准化的通用腳本語言。有了它,就可以快速地為各種不同問題編寫程序,並且成本很低。盡情編寫腳本吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved