COBOLのデータ型エラーを徹底解説!初心者でもわかるトラブルの原因と解決方法
生徒
「COBOLのプログラムを動かそうとしたら、データ型エラーって出たんですけど、何が悪いのかわかりません……」
先生
「データ型エラーはCOBOLでよくあるトラブルのひとつです。初心者の方でも原因がわかれば、ちゃんと解決できますよ。」
生徒
「どうしてそんなエラーが起こるんですか?何に気をつければいいんですか?」
先生
「それでは、COBOLのデータ型エラーの原因と対処法について、わかりやすく解説していきましょう!」
1. データ型エラーとは?
まず最初に「データ型」とは、データの種類のことを表します。たとえば、数字を表す「数値型」や、文字を表す「文字型」があります。
COBOLでは、変数(データを保存する入れ物)を定義するときに、必ず「PIC(ピクチャ)句」という形で、その変数の型とサイズを指定します。
たとえば、
01 NUM-A PIC 9(4).
01 STR-A PIC X(4).
このように書くと、NUM-Aは4桁の数字、STR-Aは4文字の文字列(文字の集まり)という意味になります。
データ型エラーは、たとえば「文字列を数字に入れようとした」ような、合わない種類のデータを無理やり入れようとしたときに発生します。
2. データ型エラーが起こる具体例
次のようなコードを見てみましょう。
01 NUM-B PIC 9(3).
01 STR-B PIC X(3) VALUE "ABC".
PROCEDURE DIVISION.
MOVE STR-B TO NUM-B
このプログラムでは、文字列「ABC」を数字専用の変数NUM-Bに入れようとしています。
しかし、「ABC」は数字ではありません。そのため、実行時にデータ型エラー(Numeric Conversion Errorなど)が出ることがあります。
3. なぜエラーになるの?コンピューターの気持ちになって考えよう
人間の感覚では「文字と数字が混ざっていても何となくわかる」かもしれません。でもコンピューターはとても正確で、数字には数字だけ、文字には文字だけでなければ混乱してしまいます。
たとえば、数字用の箱に「ABC」という文字を入れようとすると、「これ、どう処理したらいいの?」とコンピューターが困ってしまうのです。
このようなズレが原因でエラーが発生します。
4. データ型エラーを防ぐコツとチェックポイント
- 数値型(PIC 9)には、数字だけを入れる
- 文字型(PIC X)には、どんな文字でも入れられる(ただし数値計算はできません)
- 変数に入れる前に、データの中身を確認する
簡単なチェック方法として、次のような工夫ができます。
01 INPUT-STR PIC X(3).
01 CHECK-NUM PIC 9(3).
PROCEDURE DIVISION.
DISPLAY "3桁の数字を入力してください:"
ACCEPT INPUT-STR
MOVE INPUT-STR TO CHECK-NUM
DISPLAY "入力された数字は:" CHECK-NUM
このプログラムでは、ユーザーに3桁の数字を入力してもらい、それを数値型に変換して表示します。
でも、もし「ABC」などの文字を入力してしまった場合は、意図しない値になったり、エラーが発生することがあります。
5. 編集付きピクチャ句とデータ型の注意点
COBOLでは、数字を見やすく表示するための編集付きピクチャ句という機能があります。
たとえば、「0123」という数字を「123」と表示したり、「1,234」のようにカンマ区切りにしたりできます。
01 NUM-VALUE PIC 9(4) VALUE 1234.
01 DISP-VALUE PIC Z,ZZ9.
PROCEDURE DIVISION.
MOVE NUM-VALUE TO DISP-VALUE
DISPLAY "整形後の値:" DISP-VALUE
整形後の値: 1,234
ただし、この編集付きの項目に、文字列を無理やり入れたり、逆に編集済みの文字列を計算に使おうとすると、型の不一致が原因でデータ型エラーになることがあります。
6. MOVE CORRESPONDING使用時の型ミスにも注意!
MOVE CORRESPONDING(同じ名前の項目をまとめてコピーする命令)も、便利な反面、型が合っていないとトラブルの元になります。
01 FROM-REC.
05 NAME PIC X(10).
05 AGE PIC 99.
01 TO-REC.
05 NAME PIC X(10).
05 AGE PIC X(2).
PROCEDURE DIVISION.
MOVE CORRESPONDING FROM-REC TO TO-REC
この例では、AGEの型がFROM-RECは数字(PIC 99)、TO-RECは文字(PIC X(2))になっていて、型が違います。
このように、MOVE CORRESPONDINGは便利ですが、項目の型とサイズが一致しているかを必ず確認しましょう。
7. データ型エラーのトラブルシューティング手順
- エラーメッセージをよく読む(どの行で何が原因か書いてあることが多い)
- MOVE文の左右の型とサイズを確認する
- 数値型に文字列を入れていないか確認
- 編集付き項目を計算に使っていないかチェック
- MOVE CORRESPONDINGの項目の型を揃える
データ型エラーは、初心者のうちはとてもよくある間違いです。でも、型を意識して丁寧に確認すれば、すぐに防ぐことができます。
まとめ
COBOLのデータ型エラーは、はじめてプログラムを書く人が必ずといってよいほど経験する身近なトラブルである。数値項目には数字だけ、文字項目には文字だけとルールは単純なのに、実際の処理になると意外なところで食い違いが起きる。とくに、画面入力やファイル入力のように外部から入ってくるデータは、開発者の思ったとおりの値とは限らない。そのため、受け取った文字列を数値項目に移そうとした瞬間に、実行時エラーで止まってしまうことがある。これはCOBOLに限らず、どんな言語でも同じ悩みだが、COBOLはPIC句で型と桁数を明確に指定するため、少しのズレでも正確に検出してくれるという特徴がある。こうした堅さは厳しいように見えて、逆に安心できる仕組みでもある。 たとえば、入力された値が数字で構成されているつもりでも、スペースが混じっていたり、文字の0と数字の0が混ざっていたりするだけで、データ型エラーの原因になりうる。目では見分けづらいが、コンピューターは人間のように察してくれないため、厳密なデータが必要になる。そこで、受け取ったデータをいきなりMOVEするのではなく、正しい形式かどうかをチェックする流れが重要になる。現場のプログラムでは、チェック用のワーク領域や、数値変換前の保持領域を設けてから、本来の変数に移すという書き方がよく使われる。 また、編集付きピクチャ句は見た目を整えるには便利だが、使い方を間違えると型の不一致につながる。編集項目にそのまま文字列を入れたり、編集された項目を数値として計算したりすると、意図しない結果になりやすい。大切なのは、どの段階が「表示用」でどこからが「処理用」なのかを明確に分けておくことだ。そうすることで、値そのものと表示形式がごちゃまぜになることを防げる。とくに帳票や画面出力を伴う業務システムでは、編集項目の利用は非常に多くなるため、型の違いに気づける力がとても役に立つ。 さらに、MOVE CORRESPONDINGは便利な命令として有名だが、同名の項目をまとめて処理する分、型のずれが起きると原因を追いにくい。すべてが自動で移るので、ひと目ではどこが問題か分からないこともある。よく使う機能だからこそ、設定の段階で型と桁数の一致を意識して設計することが必要になる。実際の開発でも、MOVE CORRESPONDINGを使う前に、レコード定義を見比べて、不一致がないか確認してから実装を進めることが多い。 トラブルが起きたときに役立つのは、エラーメッセージの読み方である。どの行で、どの項目が、どの型と合わなかったのか、それが示されている場合は、ヒントを見ながら落ち着いて修正すればよい。もし原因が見えないときは、MOVEしている左右の変数を並べて見比べると、桁数の違いや記号項目が混ざっていることに気づける。とくに、実行するまで気づかない変換エラーは慣れないうちは難しく見えるが、慣れてくると「型を疑う」「桁数を疑う」という習慣が身につき、対処が早くなる。 実用面では、画面入力やファイルの読込処理で数値変換が必要になることが多い。たとえば、次のようなコードはよくあるパターンである。
01 INPUT-VALUE PIC X(5).
01 NUM-VALUE PIC 9(5).
PROCEDURE DIVISION.
DISPLAY "数字を入力してください:".
ACCEPT INPUT-VALUE
MOVE INPUT-VALUE TO NUM-VALUE
DISPLAY "結果:" NUM-VALUE
一見問題なさそうに見えるが、ユーザーが数字以外を入力すればエラーや意図しない挙動が発生する。現場では、この前後にチェック処理を足すのが一般的である。正しく入力されたときはスムーズに動き、間違っていれば表示を戻して再入力を求める。こうした丁寧な設計が、安心して動き続ける業務システムに不可欠である。 データ型エラーは避けて通れない。一度も遭遇せずにCOBOLを書き終える人はほとんどいないだろう。しかし、失敗を経験するほど、何が原因で、どう防げるのかを理解できるようになる。正しい型、正しい桁、正しい用途を意識して書くことで、プログラムの信頼性は大きく変わる。たくさんの変数が並んでいても、扱い方の基本が身につけば恐れる必要はない。丁寧に使えば、COBOLはとても安定したプログラム言語として力を発揮してくれる。
生徒
「データ型エラーって難しく感じていたけど、結局は数字と文字を正しく分けるだけなんですね。」
先生
「そうなんだ。型が合っていればCOBOLはとても正確に動くよ。人間の目では同じように見えても、コンピューターには全く違う情報に見えていることがあるんだ。」
生徒
「MOVE CORRESPONDINGの型が違ってもトラブルになるのは少し意外でした。」
先生
「便利な命令ほど、あとで気づきにくい間違いが起こりやすいんだ。実際の開発でも、型の確認を怠ると不具合につながることがあるよ。」
生徒
「編集付きのピクチャ句も使い方を間違えると危ないんですね。」
先生
「表示用と計算用を分けておくと間違いが減るよ。慣れてくると、自然に型を意識した書き方ができるようになるはずだ。」
生徒
「今日学んだことを意識すれば、データ型のエラーにも落ち着いて対応できそうです!」