通路美科技
公司簡介|最新消息|技術與服務| 解決方案 | 資訊區 | 聯絡我們|菁英招募|網站導覽| 回首頁
資訊區

產品新訊
訓練課程
活動&其他
技術論壇
成功案例


AcuSQL® - 使COBOL可內嵌SQL語法

無標題文件

需要 ESQL嗎?AcuSQL®或許就是您所找尋的工具

有很多應用程式在存取關聯式資料庫的資料時使用內嵌式 SQL(ESQL),因為它利用了關聯式資料庫特有的I/O方法,所以ESQL可以提供一個有效率且可行的方法來存取和維護在資料庫上的資料。

直到現在,假如您要嵌入 SQL到您的ACUCOBOL-GT®內,您必須從您的資料庫廠商取得一個預先編譯器(precompiler),並將其整合進Acucorp®的發展環境內。這雖非困難的工作,但可能會轉變成為管理層次上的隱憂。

現在 Acucorp有了一個解決方案—AcuSQL®,因為我們的AcuSQL®工具緊密的整合到發展系統與AcuBench®這個整合性開發環境,如此就讓使用ESQL建構和維護程式變得容易多了。

ESQL vs COBOL I/O

ESQL是不同於ANSI標準COBOL的I/O敘述,那些可對關聯式資料庫執行的基本ESQL運算是不同於對COBOL檔案的運算。例如:假設您要找出在某檔案內某一筆記錄的某個欄位的值,如果使用標準COBOL的I/O敘述,您將必須開啟檔案,逐筆讀取直到您找到您所想要的記錄,接著才實際讀取整筆記錄。使用索引可以加速整個過程,但除此之外對執行效益的調校就沒有其它可以做了。

使用 ESQL您可以進行一個查詢並且讓傳回來的資料就是您所要的欄位,就像您在使用COBOL的I/O,您可以使用索引,但您也可以在您的查詢上設定上限和下限。您可以使用where子句來描述其它欄位的值,其中包括非鍵值的欄位,這樣的指令可以讓SQL敘述本身做到明顯的執行效益調校,也就是讓它非常有效率。

AcuSQL®概觀

AcuSQL®提供對要嵌入在COBOL原始碼中的結構化查詢語言(SQL)敘述的支援,目前AcuSQL®對ESQL的支援是建立在IBM SQL和ISO ANSI SQL92標準上,這樣的組合相對就提供對IBM DB2和SQL92相容資料來源的存取。

AcuSQL®是經由預先編譯器和一特別的執行器動態連結程式庫的使用來支援接收且執行特別的內嵌SQL的程式。被嵌入到COBOL程式中的SQL並非ANSI標準,假如您打算編譯含有ESQL 的程式,您將會接到許多發生在SQL指令行的錯誤。為了讓編譯成功並且產生目的碼,必須進行一些處理以便將SQL改變成為COBOL編譯器與執行器所瞭解的格式。

這就是為何需要 AcuSQL®預先處理器(preprocessor), 它掃尋整個COBOL原始碼以找出ESQL,保留那些ESQL 但改成為註解格式,接著將它轉譯成標準的COBOL敘述,至於其它的程式碼則不去碰觸並保留為原來的樣式。一個成功的預先編譯會產生一個臨時檔,它接著被用來做為標準ACUCOBOL-GT®編譯動作的輸入項。

AcuSQL®選取內嵌式SQL的程式碼,其格式就像:

EXEC SQL
CREATE TABLE ACUTEST2
(EMPLOYEE_NAME CHAR(20) NOT NULL
DATE_COLUMN TIMESTAMP
VACATION_DAYS INTEGER
COMMENTS CHAR(20)
PRIMARY KEY (EMPLOYEE_NAME)
END-EXEC.

接著將它轉譯成如圖一的格式。

《圖一》

這個預先編譯的動作可開始於 AcuBench ®工作台或從 ACUCOBOL-GT® 的命令列。在 AcuBench® 中,當您在一個 ESQL 檔案上設定 ?/FONT>pre-compile?/FONT> 選項,工作台在每次專案被建製或檔案被編譯時就會自動的預先編譯該檔案。所有預先編譯的錯誤會被顯示在 AcuBench® 的輸出視窗中。在 ACUCOBOL-GT ®命令列有一組編譯旗幟可啟動預先編 譯;而錯誤則被導向到標準輸出。

在成功預先編譯接著成功的編譯後會產生一目的碼,該目的碼就已準備被執行器立即執行。當目的碼執行時, ESQL敘述(現在是標準COBOL的敘述)被傳遞給AcuSQL®的動態連結程 式庫 (DLL),它會與資料庫連結軟體溝通,建立連接,接著擷取和寫回資料和交換訊息。

AcuSQL®的執行 環境:  

  • COBOL 應用程式執行於下述主機 :

UNIX® /Linux® ,Windows® 95/98/ME, Windows NT® , Windows 2000, and Windows XP .

  • 資料來源位於下述主機平台 :
    • Windows NT, Windows 2000
    • UNIX/Linux
    • OS/390 ® (DB2 only)
    • platforms that provide ODBC level 2 connectivity to the application host
  • 資料來源種類支援 :
    • IBM DB2
    • Microsoft SQL Server
    • ISO/ANSI SQL92 accessible data sources

開發環境需求 :

  • AcuSQL ® software, Version 6
  • Disk space: 10 MB (The disk space requirement varies slightly depending on the operating system used.)
  • Memory: No additional memory is required.
  • ACUCOBOL-GT ® development system
  • ODBC level 2 API connection to your database. For DB2, IBM's DB2
    Connect™ is recommended.
  • Any required networking software support

假如您的應用程式準備存取 DB2 資料庫,您必須安裝、組構,並且在開發您的 ESQL 程式之前測試您的 BD2 連結軟體。在原廠,對 DB2 資料庫的存取是使用 IBM 的 “DB2 Connect” 軟體來測試,所以假如您打算讓您的應用程式存取 DB2 資料來源的話,我們會建議您使用該軟體。然而,任何廠商已經適當組構過的 ODBC Level 2 API 連結軟體應該也有作用。  

假如您的應用程式準備存取 SQL92 相容的資料來源,您的資料來源必須置於任何您從 Windows 到您的資料來源之間已經有可作用的 ODBC API 連結的主機上。  

程式的準備

您的 ESQL COBOL原始碼必須符合在IBM的出版品S10J-8158-00: “Embedded SQL Programming Guide, Version 5” 內描述的SQL,或ISO/ANSI SQL 92標準。假如您現有的應用程式已經含有內嵌式SQL來存取DB2資料庫,並且您並沒有在程式中使用任何large object資料型態(LOBs),您應該不必對您的ESQL做任何改變。

資料段落 (Data Division)

在資料段落中支援下面的 SQL敘述:

SQL INCLUDE
SQL declarations

例如:

EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE SQLDA END-EXEC.
EXEC SQL INCLUDE filename END-EXEC.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
… SQL declarations
EXEC SQL END DECLARE SECTION END-EXEC.

標準的 SQLCA和SQLDA INCLUDE檔案是建立在預先編譯器,並且當它們在原始碼中被指定時都會被包含進來。這些檔案已經特別修改調整讓AcuSQL®使用,不要嚐試以別種版本來取代。

資料型態

為了確保資料來源和您的 COBOL 程式有適當並且正確的資料匹配,您必須讓 SQL 的資料型態匹配合適的 COBOL 資料型態。在這堶n提醒目前只有支援固定長度和變動長度的文字字串。下面的表格描述對 DB2 的資料型態相容性。

SQL Type

COBOL Type

Description

CHAR(n)

01 name PIC X(N).

Fixed-length character string

DATE

01 name PIC X(10).

10-byte character string

DECIMAL(p,n)

01 name PIC S9(m)V9(n) COMP-3.

Packed decimal (where m=p-n)

DOUBLE

01 name USAGE IS DOUBLE

Double-precision floating point

INTEGER

01 name PIC S9(9) COMP-5.

32-bit signed integer

LONG VARCHAR(n)

01 name.
03 name-length PIC S9(4) COMP-5.
03 name-name PIC X(n).

Variable length character string

REAL

01 name PIC S9(4) USAGE IS COMP-1.

Single-precision floating porint

SMALLINT

01 anme PIC S9(4) COMP-5.

16-bit signed integer

TIME

01 name PIC X(8).

8-byte character string

TIMESTAMP

01 name PIC X(26).

26-byte character string

VARCHAR(n)

01 name.
03 name-length PIC S9(4) COMP-5.
03 name-name PIC X(n).

Variable-length character string (n ,<=4000)

而下面的表格則描述對 MSSQL的資料型態相容性。

SQL Type

COBOL Type

Description

CHAR(n)

01 name PIC X(n).

Fixed-length character string

DATETIME

01 name PIC X(25).

25-byte character string

DECIMAL(p,n)

01 name PIC S9(m) V9(n) COMP-3.

Packed decimal (where m = p-n)

DOUBLE PRECISION

01 name USAGE IS DOUBLE.

Double-precision floating point

INTEGER

01 name PIC S9(9) COMP-5.

32-bit signed integer

REAL

01 name PIC S9(4) USAGE IS COMP-1.

Single-precision floating point

SMALLINT

01 name PIC S9(4) COMP-5.

16-bit signed integer

VARCHAR(n)

01 name.
03 name-length PIC S9(4) COMP-5.
03 name-name PIC X(n).

Variable-length character string (n <= 4000)

CONNECT和DISCONNECT敘述

CONNECT和DISCONNECT兩個敘述的語法分別描述如下:

CONNECT TO server-name [AS connection-name] 
USER userid USING passwd]

CONNECTION敘述會嚐試與server-name建立一個使用者為userid的連結,而 “AS connection-name” 子句則指定一個特定的名稱給連結。譬如:

CONNECT TO big-data AS con1 USER :uid USING :pwd

在上面的例子中, uid與pwd都是屬於主機變數,所謂的主機變數是指任何定義在SQL DECLARE段落內的資料項目,通常主機變數們被使用在SQL敘述內並且必須以冒號(“:”)前引。

而 DISCONNECT敘述的語法則描述如下:

DISCONNECT { CURRENT | ALL | connection-name }
CONNECT RESET

DISCONNECT會關閉目前的連結,或者是所指定名稱甚或是所有的連結。DISCONNECT CURRENT和CONNECT RESET會讓目前的連結關閉,當目前的連結被關閉起來後,目前連結的值會保持空的。如果您要設定一個新的目前連結,您必須使用SET CONNECT來設定。

ESQL的轉譯過程

AcuSQL®預先編譯器會辨識並轉譯ESQL敘述到COBOL敘述。它藉由在原始碼內找尋關鍵字 “EXEC SQL”和 “END-EXEC” 來辨識ESQL,當它發現到這些記號,它會使用註記和行號將其包起來,接著剖析並且產生COBOL程式碼,其中包含對AcuSQL®程式庫的CALLs。例如:

… <COBOL code>
EXEC SQL
… <SQL code>
END-EXEC.
… <COBOL code>

將會被轉譯成:

… <COBOL code>
… <translated SQL code>
… <commented original ESQL code>
**LINE** BEGIN 134
* EXEC SQL
* … <SQL code>
* END-EXEC**LINE** END 139
… <COBOL code>

出現在註解行中的行號是指示在輸入檔中原來的行號。

成功的預先編譯會產生一個暫時的 COBOL原始檔,這檔案接著讓ACUCOBOL-GT®編譯以產生一個可執行的目的檔。該暫時檔在 “-Po” 這個選項有指定時會被儲存起來。

啟動預先編譯器功能

您可以從 ACUCOBOL-GT®命令列伴隨著下列的編譯器開關來啟動預先編譯器的功能:

-Pn

讓 ACUCOBOL-GT ®僅預先編譯被指名的檔案。預先編譯成功時會產生一個過渡 COBOL 檔,其預設檔名為 “ input-file-name.asq ” 。

-Ps

讓 ACUCOBOL-GT ®預先編譯和編譯所指定的來源檔案。

而下列的編譯器開關會影響預先編譯器的效能:  

-Pr

指示預先編譯器執行較寬鬆的語法檢查。 “ -Pr ” 是設計給在內嵌式 SQL 語法並沒有遵循 IBM SQL 或 SQL 92 ,但對您所要存取的資料庫而言是正確無誤的時候。

“-Pr ” 並不對下列的敘述執行語法的檢查:
SELECT INTO FROM
VALUES
DELETE
INSERT
DECLARE CURSOR FOR SELECT
UPDATE

要注意的是 ALTER 、 CREATE 和 GRANT 敘述的語法在任何模式都不檢查。

-Pk rlist

指示預先編譯器使用事先設計過的保留字組合。 rlist 可能是 “ DB2 ” ( 使用 DB2 字組 ) ,或者是 “ EXT ” 來使用擴充的保留字組。 EXT 是預設值。

-Pi dir

指定預先編譯器將找尋在 ESQL INCLUDE 敘述中所指名的檔案所在的路徑。譬如 “ -Pi c:\SQL\include\ ” 將使預先編譯器在目錄 “ c:\SQL\include\ ” 內尋找在 SQL INCLUDE 敘述有指名的檔案。您也可以透過 ACUSQL®_INCLUDE 這個環境變數來指定搜尋路徑。如果這兩種方式都有使用的話,將以 “ -Pi ” 的指定為優先。

-Po file-name

給予過渡檔您所指定的檔案名稱。

-Pw

讓預先編譯器傾印目前的保留字串到標準輸出設備 ( 使用 “ -Pk ” 則是設定保留字串 ) ,此時沒有任何預先編譯或編譯的動作被執行。要注意 “ -Pw ” 不應該與其它的預先編譯開關一起使用。

執行程式

在您第一次使用AcuSQL®之前,您應該對您從Windows到資料主機的連結軟體進行測試。在嚐試執行您的程式之前,非常需要由您證實您的資料庫連結軟體的功能正確性。

在成功地預先編譯和編譯過後所產生出來的程式目的碼已準備好可以馬上執行,要執行一支ESQL的程式並不需要特別的選項或組構設定。要從DOS命令列啟動程式,只要輸入您ACUCOBOL-GT
®的執行器名稱(預設為 “wrun32.exe” ),其後跟著可執行程式的檔案名稱。

至於執行過程之間所遇到的SQL錯誤訊息會被導向到標準錯誤輸出,參考您的

SQL參考手冊以獲得該SQL錯誤訊息所代表的意義。程式設計師可以在他們的程式中藉由檢查SQLSTATE和SQLCODE的值來檢查錯誤碼。