ページの先頭です。
サイト内の現在位置を表示しています。
  1. ホーム
  2. ソフトウェア
  3. COBOL DBアクセス
  4. 注意事項
ここから本文です。

COBOL DBアクセス - 注意事項

COBOL DBアクセス for SQL Server / Oracle 共通の注意事項

テーブル(表)/インデックス(索引)を変更した場合の注意

テーブル(表)およびインデックス(索引)を変更した場合、以下のいずれかの処理を行う必要があります。

  1. 一度、<オープン高速化>を「行わない」に設定して、オープンを行う(これにより、最新の表情報を取得します)。
    (<オープン高速化>を「行わない」に設定したテーブルは、複数のAPから同時に使用しないでください)
  2. openallユーティリティを実行する(openallユーティリティは強制的に<オープン高速化>を 「行わない」状態でオープンします)。
  3. 表対応テーブルメンテナンスの表情報更新画面での「レコード定義」により、データベース情報/レコード定義情報を更新する。

この処理を行わない場合、COBOL DBアクセスは更新前の表情報により動作するため、以降の動作が不安定になります。

アプリケーション開発中で表を頻繁に変更している間は、<オープン高速化>を「行わない」に設定しておくと、OPEN命令が遅くなりますが常に最新の表情報が取得されるので便利です。

さらに、列名規則に従わない表を利用している場合、列を追加/削除したりデータ型を変更するとOPEN命令が失敗します。この場合は、上記 3. の方法で適当なCOBOLデータ型を割り当てる必要があります。

副キーの二重キー検出に関する注意事項

COBOL DBアクセスでは、重複を許可するインデックス(索引)が付加されている項目に対して、副キーの二重キー検出を行っています。
これは、COBOLアプリケーション上で副キーとして定義されていない場合にも行われます。
つまり、重複を許可するインデックス(索引)が付加されている項目に、重複するデータを格納した場合はすべて"02"ステータスが返却されます。また、更新の際に、その項目に対して重複するようなデータを格納しようとしているかチェックが行われますので、性能も劣化させています。

なお、COBOL DBアクセスの<副キーの二重キー検出>オプションによって、この検出が行われなくなりますので、不要であれば、このオプションを変更して下さい。

アプリケーションが指定するデータについての注意

READ/WRITE/REWRITE/DELETE/SELECTの各命令で、アプリケーションが指定するデータについては、COBOL言語説明上の「データの表現形式」に記述された範囲のものであるか、常にチェックしています。
また、文字データについても、データベースに格納できる範囲のデータであるかどうか常にチェックしています。
(例外的に、HIGH-VALUE,LOW-VALUE,SPACEデータについては、論理的に妥当なデータに変換されます)

このデータ表現形式から外れているデータが指定された場合は、 COBOLアプリケーションが「COBOL DBアクセスエラー」「関連製品エラー」で異常終了します。

<イベントログ内容>
COBOLの内部表現形式の範囲外のデータが指定されました(列名="COLUMN01")。
データのダンプは次の通りです。
[20 00 00 00]
先頭からこの列までの表定義および、この列のデータに問題がないか確認してください

まずは、表定義情報に問題がないか、アプリケーションの問題により誤ったデータを指定していないか、検証して下さい。

なお、意図してデータの表現形式から外れたデータを指定している場合は、以下のレジストリ設定により、このチェックを外すことは可能ですが、範囲外のデータを指定していること自身の動作保証は行いませんのでご注意下さい。

  • キー : HKEY_LOCAL_MACHINE\SOFTWARE\NEC\COBOL DB Access
  • 値 : CodeinfDataTypeChk
    • 1 データチェックを行います(初期値)
    • 0 データチェックを行いません

(変更は、COBOL DBアクセスのサービス再起動により、有効となります)

性能チューニングに関する注意

COBOL DBアクセスは、A-VXⅡからのCOBOL資産を移行することを目的としていますので、 言語仕様の互換を優先させるために、ある程度性能を犠牲にしている部分もあります。
つまり、オープンなRDBに実装されていない機能を複数のSQL文で擬似的に実現していることもあり、これが性能面/リソース面でのオーバヘッドとなる場合があり、パラメータの変更などを行うことで性能を改善できる場合があります。

したがって、移行作業が完了した時点で、何らかのチューニングが必要になります。具体的には、COBOL DBアクセスオプションの変更/インデックス(索引)の調整/データベースのパラメータ調整/ アプリケーションの一部改造が必要になります。
まずは、本番運用に近いデータ量での性能評価を実施してください。
その上で、本製品のオンラインヘルプの項目「性能チューニングについて」をご参照いただき、 チューニング作業を実施して下さい。

ウィルスチェックソフトとの共存についての注意

COBOL DBアクセスは、 通信方式としてTCP/IP方式とLANマネージャ(名前付きパイプ)方式の2種類をサポートしています。 このうち名前付きパイプ方式を選択した場合に、通信回線障害が発生する可能性があります。

原因は、ウィルスチェックソフトが、名前付きパイプをファイルとして判断し、 (全ての拡張子のファイルを検査するなどの)設定によっては、 ウィルスチェックのタイミングでCOBOL DBアクセスが使用している名前付きパイプを切断してしまうためです。ウィルスチェックを行う対象ファイルを、「すべてのファイル」に設定せず、拡張子を指定してください。

COBOL DBアクセス for SQL Serverの注意事項

インストール時に入力するODBCデータソース名について

COBOL DBアクセス for SQL Serverのインストール時、ODBCデータソース名の入力が必須です。ODBCデータソースは、インストーラを実行する前に、以下のように作成してください。

  1. 「コントロールパネル」→「システムとセキュリティ」→「管理ツール」→「ODBCデータソース(64ビット)」を開きます。
  2. システムDSNタブにて追加ボタンをクリックし、「SQL Server Native Client 11.0(SQL Server 2012/2014の場合)」または「ODBC Driver 13 for SQL Server(SQL Server 2016の場合)」を選択して完了ボタンをクリックします。
  3. データソースの名前を入力します。(この名前を、COBOL DBアクセス for SQL Serverのインストール時に入力します)
  4. 接続するSQL Serverは(local)を選択してください。既定のインスタンス以外のインスタンスを利用したい場合は、そのインスタンスを選択します。
  5. 「ユーザが入力するSQL Server用のログインIDとパスワードを使う」を選択して、ログインIDとパスワードを入力します。
  6. 「既定のデータベースを以下に変更する」にチェックを入れ、利用するデータベースを選択します。
  7. 完了をクリック後、必ずテストを実施して正常に接続できることを確認してください。

SELECT命令に関する注意

SELECT命令は、条件に指定する項目により注意が必要です。
詳細については、以下を参照してください。

  1. SELECT命令で、レコード記述項に定義された集団項目を条件に指定する場合、部分一致(CHARACTERS条件 TRAILING/LEADING指定なし)は指定できません。
  2. SELECT命令で、レコード記述項に定義された集団項目どうしの比較条件を指定する場合、それぞれの集団項目に含まれている基本項目の属性は一致する必要があります。
  3. SELECT命令で WHERE句に指定する単純条件は、30個以内でなければなりません。
  4. SELECT命令 WHERE句の単純条件で指定する定数および一意名のうちレコード記述項以外のものの桁数の合計は、1000バイト以内でなければなりません。
  5. ORDER BY句に指定する項目の終了位置は、DBの列の途中であってはいけません。DBの列の開始位置から始まり、終了位置で終わる項目を指定しなければなりません。
    例えば、DBの表定義およびCOBOLのレコード記述項が下記のような場合、
    SELECT命令のORDER BY句として
        ORDER BY ASCENDING COL1 COL2
    を指定することはできますが、
        ORDER BY ASCENDING COL1-A COL2
    を指定することはできません。指定した場合は、エラーになるか正しい順序で読み込むことができなくなります。
    <DBの表定義>
      col1_key    CHAR(10)    not null
      col2        CHAR(10)    not null
      col3        CHAR(10)    not null
    <COBOLのレコード記述項>
      01  REC-1.
          02  COL1.
              03  COL1-A  PIC X(5).
              03  COL1-B  PIC X(5).
          02  COL2      PIC X(10).
          02  COL3      PIC X(10).
    この場合、DBの表定義を
    <DBの表定義>
      col1_key_1    CHAR(5)     not null
      col1_key_2    CHAR(5)     not null
      col2          CHAR(10)    not null
      col3          CHAR(10)    not null
    と変更すると、
        ORDER BY ASCENDING COL1-A COL2
    を指定することが可能となります。

文字型に関する注意

ここでは、COBOL DBアクセス for SQL Serverを利用したアプリケーションからchar/varchar/text/binary型に指定された文字項目を扱うときの注意について説明します。

  1. 登録できる文字(char/varchar/text型のみの制限)
    アプリケーションからchar/varchar/text型の項目へ
    • シフトJIS の領域に含まれない 2バイト文字
    • ASCII 制御コード
    を入力すると実行エラーとなります。
    また、文字列中に NULL文字を含む場合は、NULL文字以降の文字は切り捨てられます。
  2. データベースに格納されている文字数が少ない場合(char/varchar/text型のみの制限)
    データをREADした場合に、不足の文字数に対し1バイトのスペース文字が補われます。
  3. SELECT命令の部分一致条件(binary型のみの制限)
    binary型の項目に、部分一致条件(TRAILING または LEADING句のないCHARACTERS条件)を指定すると実行エラーとなります。
  4. SELECT/READ/REWRITE/DELETE/START命令での比較順 (char/varchar/text型のみの制限)
    • 文字項目をキーに指定してREAD NEXT/PRIORや START >, >=を行う
    • SELECT命令の WHERE条件や ORDER BY条件に文字項目を指定する
    上記の場合には、比較順/スクロールは、SJIS順に行われます。
    COLLATING SEQUENCE(プログラムの文字の大小比較)にEBCDICを指定しているようなCOBOLアプリケーションを移行する場合にはアプリケーションの変更が必要です。

マルチフォーマットの移行に関する注意

COBOL DBアクセスにおけるマルチフォーマットの利用は、以下の機能範囲でのみ利用可能となります。

  1. データベース上の表を、マルチフォーマットフィールド全体に対して、文字型(char/varchar/text)で作成した場合。
    → COBOLアプリケーション上のマルチフォーマットレイアウトは、
        文字型(X/A/N)
        符号なし外部10進数
        符号付き外部10進数(ただし SEPARATE型)
    でのみ構成されている必要があります。
    (備考)
    • 符号付き外部10進数(SEPARATEなし)を含むこともできますが、 データベース上で参照すると、符号部分が文字化けします。
    • COMP-1/COMP-2/COMP-3/COMP-5/BINARY型のデータが含まれる場合は、 文字でないコードが含まれるため、格納に失敗したり、NULL文字(0x00)以降が切り捨てられます。
  2. データベース上の表を、マルチフォーマットフィールド全体に対して、バイナリ型(binary)で作成した場合
    → COBOLアプリケーション上のマルチフォーマットレイアウトには、 すべてのデータ型を含むことができますが、データベース上で参照すると、16進数文字として表示されます。

datetime型を使用する場合の注意

datetime型を COBOLアプリケーションのX項目に対応づけている場合、以下の注意事項があります。

  1. READ/START命令での部分キーについて
    RDBファイルのキーアクセスで、READ/START命令に限り部分キーによるアクセスを行うことができます。ただし、キーの終了位置をこのdatetime型に対応付けられた文字項目の途中にすることは可能ですが、キーの開始位置をこの文字項目の途中にすることは不可能です。(他のデータ型に対応付けられた文字項目に対する部分キーの仕様と同じです。)
    なお、キーの終了位置をdatetime型に対応付けらた文字項目の途中にする場合、各単位(年/月/日/時/分/秒)の途中にしないでください。(例えば、"年"はこの文字項目の先頭4桁ですので、部分キーの終了位置をこの文字項目の2桁目にすることは不可能です。)
    また部分キーを指定したSTART命令において、キー値の比較演算子に"GREATER THAN"、">"、"NOT LESS THAN"、"NOT <"、"GREATER THAN OR EQUAL TO"、または">="を指定する場合、部分キーとして指定可能なのは、datetime型に対応付けられた文字項目の先頭4桁("年"を示す)、6桁("年月"を示す)または 8桁("年月日"を示す)の 3通りのみとなります。(部分キーではなく、datetime型全体に対応する14桁の文字項目全体をキーとした場合は、問題ありません。)
  2. SELECT命令の比較条件について
    SELECT命令の比較条件に datetime型に対応付けられた文字項目の一部を指定することも可能です。ただしこの場合、比較条件の左辺(および右辺)に指定するデータ項目は、必ず"年"から始まり、各単位(年/月/日/時/分/秒)の途中で終了しないようにしてください。
    また、比較演算子に"GREATER THAN"、">"、"NOT LESS THAN"、"NOT <"、"GREATER THAN OR EQUAL TO"、または">="を使用する場合、比較条件として指定可能なデータ項目は、先頭4桁("年"を示す)、6桁("年月"を示す)、8桁("年月日"を示す)または14桁(datetime型に対応付けられた14桁の文字項目全体)の 4通りのみとなります。
  3. SELECT命令の部分値条件について
    SELECT命令の部分値条件では、"LEADING"または"TRAILING"を必ず指定してください。
    また、"LEADING"を指定する場合、部分値条件に指定可能なデータ項目は、先頭4桁("年"を示す)、6桁("年月"を示す)、8桁("年月日"を示す)または14桁(datetime型に対応付けられた14桁の文字項目全体)の 4通りのみとなります。
    また、"TRAILING"を指定する場合、部分値条件に指定可能なデータ項目は、後方2桁("秒"を示す)、後方4桁("分秒"を示す)、後方6桁("時分秒"を示す)または14桁(datetime型に対応付けられた14桁の文字項目全体)の 4通りのみとなります。
  4. SPACE/ZERO/LOW-VALUE/HIGH-VALUEが指定された場合について
    datetime型に対応付けられた14桁の文字項目全体に、表意定数(SPACE/ZERO/LOW-VALUE/HIGH-VALUE)を指定した場合、各表意定数は次のように解釈(変換)されます。
    SPACE         :  "19000101000000" (1900年01月01日 00時00分00秒)
    ZERO           : "19000101000000" (1900年01月01日 00時00分00秒)
    LOW-VALUE  : "17530101000000" (1753年01月01日 00時00分00秒)
    HIGH-VALUE : "99991231235959" (9999年12月31日 23時59分59秒)

なお、部分キー指定のREAD/START命令や SELECT命令の比較条件に、datetime型に対応付けられた文字項目の一部を指定する場合、この部分キーまたは比較条件全体に表意定数を指定することは可能です。

この場合、上記の各表意定数に対応する値の内、必要な部分のみを使用します。(例えば、部分キーがこの文字項目の先頭 4桁で、この部分キーに "SPACE" を指定してSTART命令を行った場合、部分キーの値として "1900"が指定されたものとして動作します。)

テーブルアクセス時の注意

本製品を利用して SQL Server のテーブルにアクセスする場合、以下の点に注意してください。

  1. アプリケーションで定義した表編成が順編成/相対編成/索引順編成にかかわらず、一意なインデックスを少なくとも一つ設定する必要があります。
  2. このインデックスに含まれる列には、NULLを許可しないでください(データタイプがtimestampの場合を除きます)。

オブジェクト名に関する注意

COBOL DBアクセス内部で、 dblnk_ という名前で開始するストアードプロシージャを作成しています。 したがって、ユーザは、dblnk_ という名前で開始するオブジェクトを使用できません。

権限に関する注意

ログインするユーザには、CREATE PROCEDURE権限が必要です。

        GRANT CRATE PROCEDURE TO username

により、CREATE PROCEDURE権限を付加してください。
CREATE PROCEDURE権限がない場合、OPEN命令が異常終了し、アプリケーションイベントログに、「CREATE PROCEDURE権限がありません。」と表示されます。

インデックスに関する注意

一意なインデックスで、COBOLアプリケーションが主キーとして使用するインデックスは「クラスタ化インデックス」としてください。

性能に関する注意

COBOL DBアクセスでは、CURRENT指定のREWRITE命令を実行する場合、直前に READしたレコードとの比較を行い、変更が必要な項目のみを指定して SQL Server に更新を要求しています。 しかし、この制御は text型の列には行えないため、text型の列は変更が必要ない場合にも SQL Server に更新を要求します。したがって、テーブルに text型の列が含まれる場合、CURRENT指定のREWRITE命令の性能が多少劣化します。
文字項目で、あまり更新を行わない項目は、text型でなく char型でテーブルを作成するようにしてください。

レコード排他機能に関する注意

以下のようなテーブルでは、レコードをロックすることはできません(I-O PROTECTED、I-O SHAREDオープンで、WITH UNLOCKなしの READ命令は成功しますが、レコードはロックされません)。

  • text型とtimestamp型の列のみからなるテーブル
  • クラスタ化インデックスが付加されており、そのクラスタ化インデックスに timestamp列が含まれているテーブル
  • クラスタ化インデックスおよびtimestamp型以外のデータ型の一意な単一インデックスが付加されていない場合で、付加されている一意なインデックスのうち一番インデックスID が低いものにtimestamp列が含まれているテーブル

オープン高速化を「行わない」に設定した場合の注意

オープン高速化を「行わない」に設定されたテーブルを使用するCOBOLアプリケーションは、必ずシングルタスクで実行するようにしてください。

表にトリガーを設定する場合のの注意

本製品では、COBOLアプリケーションの各命令に対応して、以下のようなSQL文を発行しています。よって各表に対してトリガを作成する場合、そのトリガをアクティブにするキーワードの設定には注意が必要となります。(特にDELETE/UPDATEをキーワードとする場合は、注意が必要となります。)

COBOLアプリケーション COBOL DBアクセス for SQL Serverが発行するSQL文
OPEN OUTPUT命令 ログインIDがOPENする表の所有者の場合 TRUNCATE TABLE文
ログインIDがシステム管理者("sa")の場合 TRUNCATE TABLE文
その他 DELETE文
READ命令 OPEN命令のモードがI-O
OPENでWITH UNLOCK句なしの場合
UPDATE文 (注)+SELECT文
その他 SELECT文
DELETE命令 DELETE文
WRITE命令 INSERT文
REWRITE命令 UPDATE文
SELECT命令 SELECT文
(注) レコード(実際にはレコードが存在するページ)をロックするためで、レコードの値は変更しないようなUPDATE文

IDENTITYプロパティを設定した表を利用する場合の注意

  1. IDENTITYプロパティが指定された列の値は、テーブル作成時に指定されたseed値とincrement値で決定されます。
    1. WRITE命令
      COBOL-APで指定された値を無視し、WRITEした順番に値が決定されます。
      例)
      テーブル定義:
      COL1 COMP_2 IDENTITY(1,10)
      (COMP2に対応)
      COL2 X_0005_CH NOT NULL (PIC X(05)に対応)
      主キー:
      COL1 UNIQUE KEY
      データ件数:
      0件
      WRITE命令実行
        COBOL-APで指定したデータ   SQL Serverに格納されるデータ
      1件目 (1,'AAAAA') ( 1,'AAAAA')
      2件目 (2,'BBBBB') (11,'BBBBB')
      3件目 (3,'CCCCC') (21,'CCCCC')
      4件目 (4,'DDDDD') (31,'DDDDD')
      5件目 (5,'EEEEE') (41,'EEEEE')
         
      COBOL-APで指定した値ではなく、
      テーブル定義で指定したseed値と
      increment値による値が書き込まれる
    2. REWRITE命令
      IDENTITYプロパティが指定された列の値は変更できません。COBOL-APで指定した値を無視します。(IDENTITYプロパティが指定された列以外は、正常に更新され、REWRITE命令は正常終了します。)
      例)
      REWRITE命令実行(CURRENT指定有)実行(カレントレコードは2件目)
      COBOL-APで指定したデータ   SQL Serverに格納されるデータ
      (100,'bbbbb') (11,'bbbbb')
         
      IDENTITYプロパティが指定された
      列の値の変更不可
    3. DELETE命令
      削除したレコードのIDENTITYプロパティが指定された列の値は、それ以降、使用できなくなる場合があります。
      例)
      DELETE命令
      COBOL-APで指定したデータ
      3件目 (21,'CCCCC')
      WRITE命令
      COBOL-APで指定したデータ   SQL Serverに格納されるデータ
      (21,'CCCCC') (51,'CCCCC')
         
      21ではなく、51になる(削除した値でも使用不可)
    4. 全件削除(OUTPUT-OPEN等)を実行すると、次のWRITE命令では、再び、テーブル定義時に指定したseed値から順番に書き込まれます。
  2. IDENTITYプロパティが指定された列のみで構成されるテーブルは使用できません。
  3. IDENTITYプロパティが指定された列とtimestamp列のみで構成されるテーブルは使用できません。

物理順アクセスがtimestamp列を含むインデックスの昇順となる場合の注意

物理順アクセスがtimestamp列を含むインデックスの昇順となるテーブルで、READ NEXT命令を繰り返すCOBOLアプリケーションにおいて、READ NEXT命令の途中で、あるレコードを更新すると(REWRITE命令を実行すると)、更新後のレコードが全レコードの最後で再び読まれる場合があります。
例)

定義およびデータの内容
SQL Server上の列名(データ型) COL1 (int)
COL2 (int)
timestamp (timestamp)
一意なインデックス timestamp列
COBOL-AP上のデータタイプ COMP1 COMP1
データ (1件目) 1 1
データ (2件目) 1 2
データ (3件目) 3 2
COBOL-APのキー COL1(WITH DUPLICATES指定有り)
実行結果
  1. READ NEXT
    結果:(1,1)
  2. REWRITE(COL2を5に)
    結果:(1,2)
  3. READ NEXT
    結果:(3,2)
  4. READ NEXT
    結果:(1,5)(AT ENDではなく、2.で更新したレコード)

このような現象を回避するためには、まずSELECT命令を実行し、部分集合を作成した後で、READ NEXT/REWRITE命令を実行するようにしてください。
例)
実行結果
  1. SELECT命令(WHERE句なし、ORDER BY句=COL1の昇順)
    結果:データ(1件目~3件目の部分集合を作成)
  2. READ NEXT
    結果:(1,1)
  3. REWRITE(COL2を5に)
  4. READ NEXT
    結果:(1,2)
  5. READ NEXT
    結果:(3,2)
  6. READ NEXT
    結果:AT END

SQL Serverデータ型とCOBOLデータ型を一致させるには

各列のSQL Serverデータ型と適切なCOBOLデータ型の対応を下記方法により確認してください。

  1. 「表対応テーブルメンテナンス」→(対象の表をダブルクリック)→「レコード定義」→「編集」 の画面(下記図参照)を表示します。
  2. その情報とCOBOLアプリケーションのデータ型を確認します。
  3. データ型が一致していない場合は、画面下方の「COBOLデータ型の選択ボックス」 からCOBOLアプリケーションのデータ型と一致するものに変更してください。

3.で表示されている以外のCOBOLデータ型を使用できる場合もあります。 詳細についてはオンラインヘルプをご覧ください。

表情報の更新およびレコード定義情報の編集

照合順序について

SQL Serverのインストール時、および新しいインスタンスの追加時に、照合順序は以下のように設定してください。既定値とは異なりますので、設定が必要です。

照合順序指定子 並べ替え順
Japanese バイナリ

 

仮想表のご利用に関する注意

仮想表を利用する場合、一意キーを設定する必要があります。
また、仮想表に主キー(インデックス)の設定を行うことが可能ですが、この場合もCOBOL DBアクセス側で必ず一意キーの設定が必要です。

なお、一意キーは、以下の2通りの方法で設定可能です。

  • 表対応テーブルメンテナンスで設定する。
    表対応テーブルメンテナンスヘルプの「一意キー指定(SQL Server版)」を参照してください。
  • 仮想表作成時に、一意キーであることを示す接頭辞を列名に付加する。
    一意キーを構成する仮想表の列名の先頭に、一意キーであることを示す"DBKnn"または"dbknn"(01 ≤ nn ≤ 08)を付加する。

COBOL DBアクセス for Oracleの注意事項

SELECT命令に関する注意

SELECT命令は、条件に指定する項目により注意が必要です。
詳細については、以下を参照してください。

  1. SELECT命令で、レコード記述項に定義された集団項目を条件に指定する場合、部分一致(CHARACTERS条件 TRAILING/LEADING指定なし)は指定できません。
  2. SELECT命令で、レコード記述項に定義された集団項目どうしの比較条件を指定する場合、それぞれの集団項目に含まれている基本項目の属性は一致する必要があります。
  3. Oracle のデータ型が RAW型の場合、部分一致条件(TRAILING または LEADING句のないCHARACTERS条件) を指定すると、実行エラーとなります(したがって、シフトJIS 以外の文字を格納するような項目には、部分一致の検索ができないということになります)。
  4. SELECT命令で WHERE句に指定する単純条件は、30個以内でなければなりません。
  5. SELECT命令 WHERE句の単純条件で指定する定数および一意名のうちレコード記述項以外のものの桁数の合計は、1000バイト以内でなければなりません。
  6. ORDER BY句に指定する項目の終了位置は、DBの列の途中であってはいけません。DBの列の開始位置から始まり、終了位置で終わる項目を指定しなければなりません。
    例えば、DBの表定義およびCOBOLのレコード記述項が下記のような場合、
    SELECT命令のORDER BY句として
       ORDER BY ASCENDING COL1 COL2
    を指定することはできますが、
       ORDER BY ASCENDING COL1-A COL2
    を指定することはできません。指定した場合は、エラーになるか正しい順序で読み込むことができなくなります。
    <DBの表定義>
      col1_key    CHAR(10)    not null
      col2      CHAR(10)    not null
      col3      CHAR(10)    not null
    <COBOLのレコード記述項>
      01  REC-1.
          02  COL1.
              03  COL1-A  PIC X(5).
              03  COL1-B  PIC X(5).
          02  COL2      PIC X(10).
          02  COL3      PIC X(10).
    この場合、DBの表定義を
    <DBの表定義>
      col1_key_1    CHAR(5)     not null
      col1_key_2    CHAR(5)     not null
      col2      CHAR(10)    not null
      col3      CHAR(10)    not null
    と変更すると、
       ORDER BY ASCENDING COL1-A COL2
    を指定することが可能となります。

文字型に関する注意

ここでは、COBOL DBアクセス for Oracleを利用したアプリケーションから CHAR/VARCHAR2/RAW型に指定された文字項目を扱うときの注意について説明します。

  1. 登録できる文字(CHAR/VARCHAR2型のみの制限)
    アプリケーションから CHAR/VARCHAR2型の項目へ
    • シフトJIS の領域に含まれない 2バイト文字
    • ASCII 制御コード
    を入力すると実行エラーとなります。
    また、文字列中に NULL文字を含む場合は、NULL文字以降の文字は切り捨てられます。
  2. データベースに格納されている文字数が少ない場合
    (CHAR/VARCHAR2型のみの制限)

    アプリケーションから CHAR/VARCHAR2型の項目へ データをREADした場合に、不足の文字数に対し1バイトのスペース文字が補われます。
  3. SELECT命令の部分一致条件(RAW型のみの制限)
    (RAW型の項目に、部分一致条件(TRAILING または LEADING句のないCHARACTERS条件)を指定すると実行エラーとなります。
  4. SELECT/READ/REWRITE/DELETE/START命令で、 キーの値に後ろがスペースで埋められた文字列を指定した場合の制限(CHAR型のみの制限)
    後ろがスペースで埋められた文字列を指定してアクセスする場合には、 後続のスペースは削除されて評価されます。
    (例) ある項目(仮に 6文字)に、部分キーとして 4文字指定した場合、
    指定したデータ = 'ABC**'( * は 1バイトのスペースを表す)
    検索され得る文字列 = 'ABC'、'ABC**'、'ABC***'
  5. SELECT/READ/REWRITE/DELETE/START命令での比較順 (CHAR/VARCHAR2型のみの制限)
    • 文字項目をキーに指定してREAD NEXT/PRIORや START >, >=を行う
    • SELECT命令の WHERE条件や ORDER BY条件に文字項目を指定する
    場合には、比較順/スクロールは、SJIS順に行われます。
    COLLATING SEQUENCE(プログラムの文字の大小比較)にEBCDICを指定しているようなCOBOLアプリケーションを移行する場合にはアプリケーションの変更が必要です。

マルチフォーマットの移行に関する注意

  1. データベース上の表を、マルチフォーマットフィールド全体に対して、文字型(CHAR/VARCHAR2)で作成した場合
    → COBOLアプリケーション上のマルチフォーマットレイアウトは、
    • 文字型(X/A/N)
    • 符号なし外部10進数
    • 符号付き外部10進数(ただし SEPARATE型)
    でのみ構成されている必要があります。
    (備考)
    • 符号付き外部10進数(SEPARATEなし)を含むこともできますが、 データベース上で参照すると、符号部分が文字化けします。
    • COMP-1/COMP-2/COMP-3/COMP-5/BINARY型のデータが含まれる場合は、 文字でないコードが含まれるため、格納に失敗したり、NULL文字(0x00)以降が切り捨てられます。
  2. データベース上の表を、マルチフォーマットフィールド全体に対して、バイナリ型(RAW)で作成する。
    → COBOLアプリケーション上のマルチフォーマットレイアウトには、 すべてのデータ型を含むことができますが、データベース上で参照すると、16進数文字として表示されます。

DATE型を使用する場合の注意

DATE型を COBOLアプリケーションのX項目に対応づけている場合、以下の注意事項があります。

  1. READ/START命令での部分キーについて
    RDBファイルのキーアクセスで、READ/START命令に限り部分キーによるアクセスを行うことができます。 ただし、キーの終了位置をこの DATE型に対応づけられた文字項目の途中にすることは可能ですが、 キーの開始位置をこの文字項目の途中にすることはできません (他のデータ型に対応づけられた文字項目に対する部分キーの仕様と同じです)。
  2. SELECT命令の比較条件について
    SELECT命令の比較条件に DATE型に対応づけられた文字項目の一部を指定することも可能です。 ただしこの場合、比較条件の左辺(および右辺)に指定するデータ項目は、 "年"から始まっていなければなりません。
  3. SELECT命令の部分値条件について
    DATE型に対応づけられた文字項目に対して、SELECT命令の部分値条件を指定する場合、 "LEADING"指定のもののみ指定可能です。 "LEADING"または"TRAILING"を省略した部分値条件、 および"TRAILING"を指定した部分値条件を指定することはできません。
  4. SPACE/ZERO/LOW-VALUE/HIGH-VALUEが指定された場合について
    DATE型に対応づけられた14桁の文字項目全体に、表意定数(SPACE/ZERO/LOW-VALUE/HIGH-VALUE) を指定した場合、表意定数は次のように解釈(変換)されます
    SPACE         :  "19000101000000" (1900年01月01日 00時00分00秒)
    ZERO           : "19000101000000" (1900年01月01日 00時00分00秒)
    LOW-VALUE  : "00010101000000" (0001年01月01日 00時00分00秒)
    HIGH-VALUE : "47121231235959" (4712年12月31日 23時59分59秒)

なお、部分キー指定のREAD/START命令や SELECT命令の比較条件に、DATE型に対応づけられた文字項目の一部を指定する場合、この部分キーまたは比較条件全体に表意定数を指定することも可能です。この場合、上記の各表意定数に対応する値のうち、該当部分のみを使用します(例えば、部分キーがこの文字項目の先頭4桁で、この部分キーに"SPACE"を指定してSTART命令を行った場合、部分キーの値として"1900"が指定されたものとして動作します)。

結合型仮想表に関する注意

  1. 結合型仮想表を作成する場合、 「プライマリ表」のROWIDを仮想表の最後の列として追加するようにしてください。 (この列がない場合、OPEN命令でCOBOL DBアクセスのエラーとなります)
  2. 外部結合により作成されたビューをさらに他のオブジェクトと外部結合してビューを作成している場合、INPUT SHAREDモードでそのビュー(結合型仮想表)をオープンすると、READ命令において以下のようなエラーが発生します。

    ORA-02014: DISTINCT,GROUP BYなどを含むビューに対して FOR
    UPDATE句を使用できません。
    上記のようなビュー(結合型仮想表)をINPUT SHAREDモードでオープンする場合、 <ロックされたレコードに対するリード>[オプション]を「待ち合わせない」に設定してください。

初期化パラメータファイルの設定について

Oracleの初期化パラメータのうち、COBOL DBアクセス使用において注意すべきパラメータは以下の通りです。

  1. LICENSE_MAX_SESSIONS (同時ログインの最大数)
    COBOL DBアクセスの最大同時オープン数必要です。

    ※COBOL DBアクセスの最大同時オープン数より小さい値に設定している場合、それを超えて表にアクセスすることはできません。詳細は、DB表にアクセスする場合の必要セション数についてを参照してください。
  2. OPEN_CURSORS (同時オープンするカーソルの数)
    最大:(COBOL DBアクセスの最大同時オープン数) × 12(注)必要です。

    (注)以下のように、モードおよび、使用する命令によっては、これより少なくて済みます。

    (INPUT/I-Oモード)
    • 必須カーソル INPUT:5個 I-O:6個
    • PROTECTEDまたはEXCLUSIVEモードでオープンする場合はさらに 1個必要
    • 相対/索引順編成としてオープンする場合はさらに 1個必要
    • SELECT命令を使用する場合はさらに 1個必要
    • WRITE命令を使用する場合はさらに 1個必要
    • REWRITE命令を使用する場合はさらに 1個必要
    • DELETE命令を使用する場合はさらに 1個必要
    (OUTPUT/EXTENDモード)
    • 4個必要
  3. PROCESSES (接続可能なプロセスの最大数)
    COBOL DBアクセスの最大同時オープン数必要です。

    但し、共有モードの場合は LICENSE_MAX_SESSIONS に設定した数がすべて接続可能になるような値を設定してください。

DB表にアクセスする場合の必要セション数について

最大セション数(データベースの初期化パラメータ LICENSE_MAX_SESSIONSの設定値)を、 COBOL DBアクセスの最大同時オープン数より小さい値に設定している場合、 それを超えて表にアクセスすることはできません。
COMMITモードや表のオープンモードによって、必要なセション数が異なります。

  1. COMMITモードが「手動」の場合
    1つのAPに対し、1つのセションが必要です。
    一度に複数のAPを実行する場合、その数だけセションが必要となります。
  2. COMMITモードが「自動」の場合
    オープンするモードにより、必要となるセション数は異なります。基本的には、オープンする表の数だけのセションが必要ですが、以下のモードのいずれかでオープンする場合、 複数の表をオープンしても1つのセションしか使用しません。以下のモード以外でオープンする場合は、オープン表毎にセションが必要となります。

    INPUT-EXCLUSIVE
    INPUT-PROTECTED
    INPUT-SHARED
    OUTPUT-EXCLUSIVE
    OUTPUT-PROTECTED
    OUTPUT-SHARED
    I/O-EXCLUSIVE
    EXTEND-EXCLUSIVE
    EXTEND-PROTECTED
    EXTEND-SHARED
     

    ただし、上記のモードでオープンする場合でも、表対応テーブルに登録されているデータベース名または DBユーザ名が同一の文字列でない場合は、オープン表毎にセションが必要となります。

LICENSE_MAX_SESSIONS の値は、 ALTER SYSTEM文の実行により0からセションライセンス数までの範囲で変更することが可能です。
なお、データベースの初期化パラメータ LICENSE_MAX_SESSIONSの設定値は、 Oracleの SQL*DBAコマンド SHOW PARAMETERSを実行することにより確認できます。
詳細については、Oracleのマニュアルを参照してください。

COBOL DBアクセス for Oracle で扱う表を他の方法でアクセスする場合の注意

ここでは、COBOL DBアクセス for Oracle で扱う表を他の方法(SQL*Plus 等) でアクセスする場合の注意を説明します。


<データ型について>

COBOL DBアクセス for Oracle では、COBOL言語の「X項目には何でも格納できる」という仕様を実現するために、RAW型をサポートしています。
これは、CHAR/VARCHAR2型では、2バイトコードはシフトJIS しか扱えないということに起因しています。
他の方法(SQL*Plus 等)でアクセスする場合、 RAW型のデータの入出力はすべて16進文字で行わなければならないため、シフトJIS以外のデータを扱わないのであれば、RAW型ではなくCHAR/VARCHAR2型を使用してください (シフトJIS 以外のデータも使用する場合、RAW型)。


<排他について>

以下に、COBOLアプリケーションがアクセスした表・レコードに対し、他の方法でアクセスした場合の排他制御について説明します。


[表の排他]

本製品では、 COBOLアプリケーションのオープンモードにより、以下のような表ロックをかけます。

  • EXCLUSIVEモード → Oracle排他表ロック (X)
  • PROTECTEDモード → Oracle共有表ロック (S)

以下の表に他の方法でアクセスする場合の排他制御について示します。

プログラム排他制御一覧
後行 先行 COBOLアプリケーション(注) その他のアプリケーション
EXCLUSIVE
(排他表
ロック)
PROTECTED
(共有表
ロック)
SHARED
(表ロック
なし)
排他表
ロック
共有表
ロック
表ロック
なし
COBOL
アプリケーション(注)
EXCLUSIVE
(排他表ロック)
× × × × ×
PROTECTED
(共有表ロック)
× ×
SHARED
(表ロックなし)
×
その他の
アプリケーション
排他表ロック × × × ×
共有表ロック × ×
表ロックなし

◎:オープン・アクセス可
○:参照のみ可、更新不可
△:オープンモードの組み合わせによりアクセス可
×:オープン・アクセス不可

(注)COBOLアプリケーションがCOMMIT命令を発行した場合や、自動COMMITモードでCOMMIT間隔に達したことでCOBOL DBアクセスが自動的にCOMMITを発行した場合、一瞬、表のロックが外れることに注意してください。


[リードしたレコードの排他]

COBOLアプリケーションが READ命令によりロックしたレコード(注)に、 COBOL以外のアプリケーションが SELECT文(SQL)によってアクセス(fetch)すると、 以下の通りとなります。

  • FOR UPDATE付きの SELECT文によるもの
    ロックが解除されるまで待たされます
  • FOR UPDATEなしの SELECT文によるもの
    ロックが解除されなくてもすぐに fetchできます

[更新したレコード]

環境設定機能の<COMMITモード>が「手動」の場合、COBOLアプリケーションの更新はCOBOLアプリケーションがCOMMIT命令を発行するまで有効となりません。したがって、COBOLアプリケーションがWRITE/REWRITE/DELETE命令を行ったレコードは、 COBOLアプリケーションがCOMMIT命令を発行するまで、 COBOL以外のアプリケーションからの SELECT文(SQL)によってアクセス(fetch)すると、以下の通りとなります。


  • WRITEしたレコード :
      レコードは検索できません。
  • REWRITE/DELETEしたレコード :
      FOR UPDATE付きの SELECT文によるfetchは、WAITされます。
  • FOR UPDATEなしの SELECT文によるREWRITE/DELETEしたレコード :
      FOR UPDATE付きの SELECT文によるfetchは、WAITされます。
      FOR UPDATEなしの SELECT文によるfetchは、更新前のものが検索されます。

OracleのCOMMENT機能に関する注意

Oracleの COMMENT機能により、仮想表(ビュー)の列にコメントを作成する場合、 「コメント」に DBLNK_で始まるものは指定しないでください。
性能高速化のキー識別子として予約しています。
不正に付加された場合には、OPEN命令が COBOL DBアクセスエラーとなったり、動作が不定となったりします。

Oracleデータ型とCOBOLデータ型を一致させるには

各列のORACLEデータ型と適切なCOBOLデータ型の対応を下記方法により確認してください。

  1. 「表対応テーブルメンテナンス」→(対象の表をダブルクリック)→「レコード定義」→「編集」 の画面(下記図参照)を表示します。
  2. その情報とCOBOLアプリケーションのデータ型を確認します。
  3. データ型が一致していない場合は、画面下方の「COBOLデータ型の選択ボックス」 からCOBOLアプリケーションのデータ型と一致するものに変更してください。

3.で表示されている以外のCOBOLデータ型を使用できる場合もあります。 詳細についてはオンラインヘルプをご覧ください。

表情報の更新およびレコード定義情報の編集

表対応テーブルメンテナンスに指定するデータベース名について

  1. 表対応テーブルメンテナンスで指定するデータベース名に、サービス名(データベース別名)を指定する必要があります。
  2. COBOL表名と対応づけるOracle の表を作成したデータベースのサービス名(データベース別名)を指定する際、 指定するサービス名は、Oracle の機能により、

    プロトコル : IPC
    データベースSID : COBOL DBアクセスからアクセスするローカルデータベースのSID

    で、定義しておく必要があります。サービス名は「Oracle Net8 Easy Config」の 「新規サービスの追加」等を利用して定義することができます。
    サービス名の詳細については、Oracle のマニュアルを参照してください。

Oracleデータベースへの接続について

Oracleのログインに多少の時間が掛かります(1回につき、1秒程度)。自動COMMITモードで表を多くオープンする場合は、OPEN処理に時間が掛かることになります(数秒~十数秒)。
同じく、自動COMMITモードで、表のOPEN/CLOSEを繰り返す場合も、全体の処理が遅くなりますので、 手動COMMITモードでの利用を推奨します。

Oracle Database 11g Release 2(11.2.0.4)を利用する際の注意

<p>Oracle Database 11g Release 2(11.2.0.4.0~11.2.0.4.5)を利用する際、OCIで接続エラーが発生し、 COBOL DBアクセスがご利用できない場合があります。</p>
<p>この場合、接続に使用しているOracle Client側に Oracleのパッチを適用してください。対象のパッチは、Oracle製品のサポート契約に従って入手いただき、パッチの適用をお願いいたします。</p>

COBOL DBアクセス Client/Server Runtimeの注意事項

JIS2004に関する注意

Windows Vistaなどで利用された場合でも、JIS2004で新たに追加された文字を利用することはできません。

JIS2004で新たに追加された文字を利用された場合、正しく表示できない、または、処理できない可能性があります。


ページの先頭へ戻る