一部のアプリケーションでは、Unicode データを ANSI に変換しないで Microsoft SQL Server データソースに取り込んだり保存したりすることがあります。以前のバージョンの OpenESQL では、データを自動変換しないとデータにアクセスできませんでした。現在のバージョンの OpenESQL と COBOL 開発システムでは新しいタイプのホスト変数を使用することで、Unicode データを ANSI に変換しなくても直接操作できるようになりました。Microsoft SQL Server では、次の 3 つの Unicode カラム型がサポートされます。
データを自動的変換しないで、これらのカラムにアクセスするには、次の定義を使用してホスト変数を定義します。
PIC N(xx) USAGE NATIONAL
xx には、カラムのサイズを指定します。この形式は、現在固定長データと可変長データの両方についてサポートされています。可変長データを NULL で終了して、データの挿入や更新時にカラムのデータの末尾を示すことができます。データソースからデータが取り込まれると、ホスト変数の末尾に空白文字が付加されます。
たとえば、次のプログラムでは Microsoft SQL Server 2000 製品に付属している Northwind サンプル データベースから従業員情報を取り込みます。
$SET UNICODE(NATIVE)
$SET SQL
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC
* after an sql error this has the full message text
01 MFSQLMESSAGETEXT PIC X(250).
01 IDX PIC X(04) COMP-5.
EXEC SQL BEGIN DECLARE SECTION END-EXEC
* Put your host variables here if you need to port
* to other COBOL compilers
EXEC SQL INCLUDE Employees END-EXEC
EXEC SQL END DECLARE SECTION END-EXEC
PROCEDURE DIVISION.
EXEC SQL
WHENEVER SQLERROR perform OpenESQL-Error
END-EXEC
EXEC SQL
CONNECT TO 'LocalServer'
END-EXEC
* Put your program logic/SQL statements here
EXEC SQL
DECLARE CSR135 CURSOR FOR SELECT
A.FirstName
,A.LastName
,A.EmployeeID
,A.HireDate
FROM Employees A
END-EXEC
EXEC SQL OPEN CSR135 END-EXEC
PERFORM UNTIL SQLSTATE >= "02000"
EXEC SQL
FETCH CSR135 INTO
:Employees-FirstName
,:Employees-LastName
,:Employees-EmployeeID
,:Employees-HireDate:Employees-HireDate-NULL
END-EXEC
*> Process data from FETCH
IF SQLSTATE < "02000"
* for array fetches, field sqlerrd(3) contains the
* number of rows returned
* PERFORM VARYING IDX FROM 1 BY 1
* UNTIL IDX > SQLERRD(3)
* you will need to add code here to process the array
* END-PERFORM
END-IF
END-PERFORM
EXEC SQL CLOSE CSR135 END-EXEC
EXEC SQL DISCONNECT CURRENT END-EXEC
EXIT PROGRAM.
STOP RUN.
* Default sql error routine - modify to stop program
* if needed
OpenESQL-Error Section.
display "SQL Error = " sqlstate " " sqlcode
display MFSQLMESSAGETEXT
* stop run
exit.
次の例は、ANSI でデータを取り込んだ場合と同じコードですが、次のように INCLUDE Employees コピーブックの定義が異なります。
* -----------------------------------------------------------
* COBOL DECLARATION FOR TABLE Employees
* -----------------------------------------------------------
01 DCLEmployees.
03 Employees-EmployeeID PIC S9(09) COMP-5.
03 Employees-LastName PIC N(20) USAGE NATIONAL.
03 Employees-FirstName PIC N(10) USAGE NATIONAL.
03 Employees-Title PIC N(30) USAGE NATIONAL.
03 Employees-TitleOfCourtesy PIC N(25) USAGE NATIONAL.
03 Employees-BirthDate PIC X(23).
03 Employees-HireDate PIC X(23).
03 Employees-Address PIC N(60) USAGE NATIONAL.
03 Employees-City PIC N(15) USAGE NATIONAL.
03 Employees-Region PIC N(15) USAGE NATIONAL.
03 Employees-PostalCode PIC N(10) USAGE NATIONAL.
03 Employees-Country PIC N(15) USAGE NATIONAL.
03 Employees-HomePhone PIC N(24) USAGE NATIONAL.
03 Employees-Extension PIC N(4) USAGE NATIONAL.
03 Employees-Photo PIC X(64000).
03 Employees-Notes PIC N(32000) USAGE NATIONAL.
03 Employees-ReportsTo PIC S9(09) COMP-5.
03 Employees-PhotoPath PIC N(255) USAGE NATIONAL.
OpenESQL アシスタントも Unicode データをサポートするように拡張されています。詳細は、 「OpenESQL アシスタント」を参照してください。