社内SEの徒然なる日記

NetCOBOLとOracleのデータ型の関係

データ型

COBOLとORACLEのデータ型の関係について、わかっている範囲で記述します。
とはいえ、わかっているのはVARCHAR2、NUMBER、DATEの3つだけなので、あまり役には立たないかと。
もちろん、教科書的な意味では他の型との対比も知ってるんですけど、実際に試したのはこの3つだけだったりします。

文字と数値

OracleのVARCHAR2はXタイプ、NUMBERはS9タイプになります。

■ COBOL ■ ORACLE
03 H-CDITM PIC X(030). CDITM VARCHAR2(30)
03 H-CDMKR PIC X(005). CDMKR VARCHAR2(5)
03 H-NUMITMORD PIC X(030). \ NUMITMORD VARCHAR2(30)
03 H-NUMITMINSMKR PIC X(030). === \ NUMITMINSMKR VARCHAR2(30)
03 H-CDCTGLRG PIC X(002). === / CDCTGLRG VARCHAR2(2)
03 H-CDCTGMDL PIC X(002). / CDCTGMDL VARCHAR2(2)
03 H-CDCTGSML PIC X(002). CDCTGSML VARCHAR2(2)
03 H-NMITM PIC X(080). NMITM VARCHAR2(80)
03 H-STD PIC X(060). STD VARCHAR2(60)
03 H-PRCSTD PIC S9(012)V9(2) COMP-3. PRCSTD NUMBER(14,2)


文字型(VARCHAR2とXタイプ)は、見ての通り同じサイズを指定してやればOKです。

数値型(NUMBERとS9タイプ)はちょっと注意が必要です。
COBOLとOracleの数値型のサイズの定義方法が違います。
上記の例では、S9(012)V9(2) は、読んだ通り『整数部12桁、小数部2桁』になります。
一方で、NUMBER(14,2)は、『桁数の総サイズが14桁で、そのうち2桁が小数部』となります。

初めてOracleを触った時、この定義方法に凄い違和感を感じました(私だけか?)。

もう一つの注意点は、必ず『 S9タイプで定義して、COMP-3を付ける 』です。
COBOL屋なら当然知っていると思いますが、COMP-3はパック10進数です。
理屈は分らないのですが、これを付けないとNUMBER型の値を正しく転記してくれませんでした。
ちなみに、S9タイプを9タイプにしても、奇妙な動作をしました。
という訳で、NUMBER型の場合は、S9タイプでCOMP-3付きになります。

日付・時刻型

日付型はXタイプで受け取る事になります。
というのも、COBOLには日付型など無いので、Xタイプで受けざるえないんでしょうね。

■ COBOL ■ ORACLE
03 H-STRDATE PIC X(0020). -> STRDATE DATE


下記は、実際に日付型のSTRDATEを取得するSELECT文のサンプルです。
見ての通り、日付型だからって特に意識する必要はないようです。

EXEC SQL
SELECT
PARA
,NVL(STTFG , ' ') --*> 状態フラグ
,STRDATE --*> 日時
INTO
:H-PARA
,:H-STTFG --*> 状態フラグ
,:H-STRDATE --*> 日時
FROM ABCD
WHERE IDTJOB = RTRIM(:H-IDTJOB)
END-EXEC.


どうやら、SELECT文の実行時にTO_CHARで自動変換してくれるようです。
逆にUPDATEやINSERTの時には、TO_DATEで自動変換されるらしいですが、こちらはテストしてないんで本当かどうかわかりません。
Xタイプを20BYTEにしたのは、自動変換で最大長になりそうな「 TO_CHAR(STRDATE, 'YYYY-MM-DD HH24:MI:SS') 」が実行された時の桁数が19BYTEなので、それ以上で切りの良い数字にしてみました。

まぁ、これだけ取ってれば十分でしょ。

前回:NetCOBOLでSQLCAを使ってみる
次回:NetCOBOLでSQL文を使ってみた
投稿記事の一覧 : http://harikofu.blog.fc2.com/blog-entry-22.html

--- blog end ---
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する