SQL TYPE

日付、時間、またはバイナリ データを含む SQL データの操作は、従来の COBOL ホスト変数を使用すると複雑になる場合があり、可変長の文字データを扱う従来の技術では問題が生じる可能性があります。このデータの操作を簡単にするために SQL TYPE 宣言が用意されています。この宣言では、リレーショナル データ ストアの固有のデータ型をより厳密に反映するホスト変数の指定が容易になります。これにより、より多くのアプリケーションを動的でなく静的 SQL 構文を使用してビルドできるようになり、また容易にコード実行を最適化できるようになります。

SQL TYPE をアプリケーションに直接コーディングするか、OpenESQL アプリケーションの場合は OpenESQL アシスタントの [Type COBOL Variable] オプションを [SQL TYPE] に設定して OpenESQL アシスタントを使用して SQL TYPE を自動的に使用します。

注: 利用可能な SQL TYPE の完全な一覧については、「SQL TYPE」リファレンス トピックを参照してください。

例:日付、時刻、タイムスタンプ フィールドの SQL TYPE としての定義

このプログラム例では、使用する日付、時刻、およびタイムスタンプのエスケープ シーケンスと、それらを 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