日付、時間、またはバイナリ・データが含まれる SQL データの操作は、従来の COBOL ホスト変数を使用すると複雑になる場合があり、変数長文字データを扱う従来の技術では問題になる可能性があります。このデータの操作を簡単にするために SQL TYPE 宣言が用意されています。この宣言では、リレーショナル・データ・ストアの固有のデータ・タイプをより厳密に反映するホスト変数の指定が容易になります。これにより、より多くのアプリケーションを動的でなく静的 SQL 構文を使用してビルドできるようになり、また容易にコード実行を最適化できるようになります。
この例題プログラムでは、使用される日付、時刻、タイムスタンプのエスケープ・シーケンス、およびそれらを SQL TYPE として再定義する方法を示しています。この例は、OpenESQL と DB2 ECM の両方に該当します。
working-storage section.
EXEC SQL INCLUDE SQLCA END-EXEC
01 date-field1 pic x(29).
01 date-field2 pic x(29).
01 date-field3 pic x(29).
procedure division.
EXEC SQL
CONNECT TO 'Net Express 4.0 Sample 1' USER 'admin'
END-EXEC
* If the Table is there drop it.
EXEC SQL
DROP TABLE DT
END-EXEC
* Create a table with columns for DATE, TIME, and DATE/TIME
* NOTE: Access uses DATETIME column for all three.
* Some databases will have dedicated column types.
* If you are creating DATE/TIME columns on another data
* source, refer to your database documentation to see how to
* define the columns.
EXEC SQL
CREATE TABLE DT ( id INT,
myDate DATE NULL,
myTime TIME NULL,
myTimestamp TIMESTAMP NULL)
END-EXEC
* INSERT into the table using the ODBC Escape sequences
EXEC SQL
INSERT into DT values (1 ,
{d '1961-10-08'}, *> Set just the date part
{t '12:21:54' }, *> Set just the time part
{ts '1966-01-24 08:21:56' } *> Set both parts
)
END-EXEC
* Retrieve the values we just inserted
EXEC SQL
SELECT myDate
,myTime
,myTimestamp
INTO :date-field1
,:date-field2
,:date-field3
FROM DT
where id = 1
END-EXEC
* Display the results.
display 'where the date part has been set :'
date-field1
display 'where the time part has been set :'
date-field2
display 'NOTE, most data sources will set a default '
'for the date part '
display 'where both parts has been set :'
date-field3
* Remove the table.
EXEC SQL
DROP TABLE DT
END-EXEC
* Disconnect from the data source
EXEC SQL
DISCONNECT CURRENT
END-EXEC
stop run.
または、SQL TYPE で定義されるホスト変数を日付 / 時刻の変数に使用できます。次のホスト変数を定義します。
01 my-id pic s9(08) COMP-5. 01 my-date sql type is date. 01 my-time sql type is time. 01 my-timestamp sql type is timestamp.
さらに、INSERT 文を次のコードと置き換えます。
*> INSERT into the table using SQL TYPE HOST VARS
move 1 to MY-ID
move "1961-10-08" to MY-DATE
move "12:21:54" to MY-TIME
move "1966-01-24 08:21:56" to MY-TIMESTAMP
EXEC SQL
INSERT into DT value (
:MY-ID
,:MY-DATE
,:MY-TIME
,:MY-TIMESTAMP )
END-EXEC