- ベストアンサー
pro*cobol ⇔ oracle のデータ型の扱い
お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
オラクルは、ホスト変数が、CHAR型であれば、 CHAR型が認めるデータ値を登録します。 問題は、COBOL処理系が、ゾーン十進数の変数に 格納されたアルファベットを如何に送り出すかで 結果が変わります。 01 TBL-WORK1. 03 ID-NUM PIC 9(06). 01 TBL-WORK2. 03 ID-CHR PIC X(06). MOVE "A00001" TO TBL-WORK1. MOVE ID-NUM TO ID-CHR. /* ここ */ 記憶で申し訳ないんですが、受け取りがXタイプや 集団項目の場合、送り出し側の9タイプの内容に かかわらず、英数字転記するのが標準的取り扱いと 記憶しています。 詳しくはマニュアルの転記規則の説明をご覧頂くと 理解できるかと思います。
その他の回答 (1)
- raphel_7
- ベストアンサー率34% (86/252)
どのようにCOBOLでデータを設定したかわかりませんが多分大項目に MOVE したのではないでしょうか? COBOLの場合大項目に対して MOVE 命令を実施した場合、下位の属性は無視されてしまいます。 01 TBL-WORK. 03 ID-NUM PIC 9(06). 03 ID-CHR PIC X(06). MOVE "A00001A00001" TO TBL-WORK. 上記のような使用をすると ID-NUM の値は質問のようになります。 プログラムで UPDATE するときデータはアドレスが渡されるだけですから中身が数字なのか文字なのかはわかりません。 今回の場合、文字のまま ORACLE にデータが渡されていると想定できます。 oracleの項目定義が優先されるということはないと思います。 こういった定義の誤りは本来バグです。運用で障害が発生する場合もあるので早めにに修正された方がいいと思います。
補足
ご回答頂き、ありがとうございます。 本件は確かに集団項目なのですが、 上記の例で申しますと、レベル01の項目ではなく、 レベル03にてPIC9で定義した項目に対して 値のやり取りをしています。 言葉足らずで申し訳ございません。