データベース変換システム
【課題】汎用機上のアプリケーションのロジックを残しつつ、階層型データベースにアクセスするアプリケーションをリレーショナルデータベースにアクセスするアプリケーションに変換する。
【解決手段】本発明に係るクエリ変換プログラムは、階層型データベースの構造定義データと、COBOLプログラムが階層型データベースにアクセスするときのアクセスパラメータに基づき、階層型データベースを変換したリレーショナルデータベースにアクセスするためのクエリを特定する。また、あらかじめ用意されている、前記リレーショナルデータベースにアクセスするSQL部品のうち、前記クエリに相当するものを選択し、前記アクセスパラメータを引き渡してクエリを実行する。
【解決手段】本発明に係るクエリ変換プログラムは、階層型データベースの構造定義データと、COBOLプログラムが階層型データベースにアクセスするときのアクセスパラメータに基づき、階層型データベースを変換したリレーショナルデータベースにアクセスするためのクエリを特定する。また、あらかじめ用意されている、前記リレーショナルデータベースにアクセスするSQL部品のうち、前記クエリに相当するものを選択し、前記アクセスパラメータを引き渡してクエリを実行する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、汎用機が備える階層型データベースに対してCOBOLプログラムからアクセスする処理を、同じCOBOLプログラムからリレーショナルデータベースに対してアクセスする処理に変換する技術に関するものである。
【背景技術】
【0002】
従来、企業の基幹業務システムなどの大規模情報システムでは、汎用機(メインフレーム、ホストなどとも呼ぶ)が用いられてきた。しかし、ダウンサイジングなどの要求が高まるにつれ、汎用機で稼動しているアプリケーションを、UNIXサーバなどのオープンシステムに移行することが求められている。
【0003】
汎用機が用いるデータベースの中には、階層型構造を有しているものがあり、オープンシステムで用いられるリレーショナルデータベース(RDB)とは、データ形式、データ構造、データ同士の関係などが異なる。そのため、汎用機が用いる階層型データベースにアクセスするアプリケーションをオープンシステムに移行するには、アプリケーションを再構築するのが一般的である。
【0004】
汎用機アプリケーションをオープンシステムに移行する技術として、汎用機上で稼動するCOBOLアプリケーションをJavaなどのオープンシステムで用いられるプログラムに変換する技術がある。
【0005】
その他、下記特許文献1には、メインフレームのアプリケーションをオープン環境に移行する技術として、画面構成に着目したものが記載されている。同文献では、汎用画面フォームと汎用画面データを用いて、複数のメインフレームに対応可能な画面フォームを構成することが記載されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2004−355413号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
階層型データベースにアクセスするアプリケーションをオープンシステムに移行するためには、上述の通りアプリケーションを再構築したり、プログラムを変換したりする必要がある。
【0008】
しかし、アプリケーションを再構築するのは多大なコストと時間がかかる。またプログラムを変換するにしても、データベース構造の違いに起因して、データベースにアクセスする部分のプログラム上のロジックを書き換える必要が生じ、必ずしも全て自動変換できるとは限らない。プログラマがプログラムを書き換える場合、アプリケーションを再構築するのと同様のコストと時間を要する。
【0009】
本発明は、上記のような課題を解決するためになされたものであり、汎用機上のアプリケーションのロジックを残しつつ、階層型データベースにアクセスするアプリケーションをリレーショナルデータベースにアクセスするアプリケーションに変換する技術を提供することを目的とする。
【課題を解決するための手段】
【0010】
本発明に係るクエリ変換プログラムは、階層型データベースの構造定義データと、COBOLプログラムが階層型データベースにアクセスするときのアクセスパラメータに基づき、階層型データベースを変換したリレーショナルデータベースにアクセスするためのクエリを特定する。また、あらかじめ用意されている、前記リレーショナルデータベースにアクセスするSQL部品のうち、前記クエリに相当するものを選択し、前記アクセスパラメータを引き渡してクエリを実行する。
【発明の効果】
【0011】
本発明に係るクエリ変換プログラムによれば、COBOLプログラムから階層型データベースにアクセスする処理を、リレーショナルデータベースにアクセスする処理に変換することができる。すなわち、COBOLプログラムが階層型データベースにアクセスする際に実行するロジックはそのまま残しておき、アクセスが行われる時点でそのアクセスをリレーショナルデータベースに対するアクセスに変換する。これにより、COBOLプログラムをほぼ変更することなく、データベースにアクセスする処理のみを、リレーショナルデータベース環境に移行することができる。
【図面の簡単な説明】
【0012】
【図1】実施の形態1に係るクエリ変換プログラム100および周辺環境を示す図である。
【図2】階層型データベース210のデータ構造を示す図である。
【図3】リレーショナルデータベース400のデータ構造を示す図である。
【図4】SQL部品410が保持するSQL文の例を示す図である。
【図5】COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。
【図6】実施の形態2に係るクエリ変換プログラム100および周辺環境を示す図である。
【図7】COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。
【図8】実施の形態3に係るクエリ変換プログラム100および周辺環境を示す図である。
【発明を実施するための形態】
【0013】
<実施の形態1>
図1は、本発明の実施の形態1に係るクエリ変換プログラム100および周辺環境を示す図である。クエリ変換プログラム100は、汎用機200が備えるCOBOLプログラム220から階層型データベース210にアクセスする処理を、同じCOBOLプログラム220からリレーショナルデータベース400にアクセスする処理に変換するプログラムである。以下、図1の各構成について説明する。
【0014】
なお、以下の説明では記載の便宜上、各プログラムを動作主体として説明することがあるが、実際に各プログラムを実行するのは当該プログラムを備えるコンピュータであることを付言しておく。
【0015】
図1(a)は、汎用機200環境からオープン環境へ移行する前のコンピュータ環境を示す図である。図1(a)において汎用機200は、COBOLプログラム220を実行するコンピュータである。COBOLプログラム220は、階層型DBインタフェース230にアクセスパラメータを引き渡して呼び出し、階層型DBインタフェース230を介して階層型データベース210にアクセスする。
【0016】
階層型データベース210は、後述の図2で説明する階層型構造を有するデータベースである。階層型データベース210のデータ構造は、構造定義データ211に記述されている。この階層型のデータ構造は、オープン環境でよく用いられるリレーショナルデータベース(RDB)のデータ構造とは異なる。したがって、階層型データベース210にアクセスするプログラムをオープン環境に移行するためには、何らかの変換処理、中継処理など、各データベースの構造の差異を吸収する処理が必要になる。
【0017】
汎用機200上に構成されたプログラムをオープン環境に移行する場合、移行対象として、汎用機200本体、COBOLプログラム220、階層型データベース210が挙げられる。なかでもCOBOLプログラム220をオープン環境向けに再構築する作業は、開発量が膨大になりがちである。そこで本発明では、COBOLプログラム220を再構築せず極力そのまま用いて、オープン環境に移行することを図る。
【0018】
図1(b)は、図1(a)のコンピュータ環境をオープン環境に移行した後の構成を示す図である。汎用機200上で稼動していたCOBOLプログラム220は、コンピュータ300上で稼動する。階層型データベース210は、リレーショナルデータベース400に変換されている。
【0019】
COBOLプログラム220は、階層型DBインタフェース230ではなくクエリ変換プログラム100を呼び出すように書き換えられている点を除いて、図1(a)におけるCOBOLプログラム220と同一のプログラムである。すなわちクエリ変換プログラム100は、COBOLプログラム220から階層型データベース210にアクセスする処理を、同じCOBOLプログラム220からリレーショナルデータベース400にアクセスする処理に変換する処理を実行する。
【0020】
データベース変換プログラム110は、階層型データベース210をリレーショナルデータベース400に変換するプログラムである。データベース変換プログラム110は、階層型データベース210の階層構造を反映したDDL(Database Difinition Language)文を生成し、これを実行してリレーショナルデータベース400を作成する。詳細は後述の図2で説明する。
【0021】
SQL文生成プログラム120は、リレーショナルデータベース400にアクセスするクエリを生成するためのSQL部品410を生成する。リレーショナルデータベース400へアクセスするためには、コンピュータ300からSQL文を発行する必要があるので、これに備えたものである。
【0022】
SQL部品410が記述しているSQL文は、リレーショナルデータベース400に対して発行する典型的なSQL文のパターンを網羅したものである。SQL文に引き渡すパラメータを調整することによって、COBOLプログラム220から階層型データベース210に対して発行する任意のクエリを、COBOLプログラム220からリレーショナルデータベース400に対して発行するクエリとして表現できるようになっている。COBOLプログラム220から階層型データベース210に対して発行するクエリの種類については後述する。
【0023】
COBOLプログラム220から階層型データベース210に対してアクセスする処理は、階層型データベース210のデータ構造にある程度依拠している。しかし、本発明においてこのデータ構造に依拠する部分は、SQL部品410としてクエリ変換プログラム100とは独立に構成されている。したがってクエリ変換プログラム100は、単に受け取ったパラメータをSQL部品410に引き渡して呼び出せばよく、階層型データベース210のデータ構造を意識する必要はない。これにより、クエリ変換プログラム100本体は、階層型データベース210のデータ構造に依拠することなく、汎用的に構成することができる。
【0024】
データベース変換プログラム110とSQL文生成プログラム120は、汎用機200またはコンピュータ300が実行するようにしてもよいし、図示しない他のコンピュータが実行するようにしてもよい。
【0025】
以上、汎用機200上のアプリケーション環境をオープン環境に移行するための基本的な構成について説明した。以下、個々の構成要素について詳述する。
【0026】
図2は、階層型データベース210のデータ構造を示す図である。階層型データベース210は、セグメントと呼ばれるデータ領域が親子関係を有する階層構造を備える。各セグメント内のレコードには、データ値とそのデータ値にアクセスするためのキー値がセットになって格納されている。このデータ値とキー値の各構成要素を、フィールドとも呼ぶ。
【0027】
COBOLプログラム220は、階層型データベース210にアクセスする際には、キー値を指定することにより、いずれのレコードに対してアクセスするかを指定することができる。また、セグメントの親子関係をたどって、他のセグメント内のレコードにアクセスすることもできる。
【0028】
図3は、リレーショナルデータベース400のデータ構造を示す図である。データベース変換プログラム110は、構造定義データ211が記述している階層型データベース210の階層構造を反映したDDL文を生成し、リレーショナルデータベース400を作成する。このDDL文は、各セグメントをテーブルとして作成するとともに、各テーブル内に、階層型データベース210のキーフィールドとデータフィールドに対応する個別の列として格納する。
【0029】
さらに下位セグメントに対応するテーブルについては、キーフィールドとデータフィールドに対応する列に加え、上位セグメントのキー値を格納する親キー列を生成する。親キー列の値を参照することにより、各テーブル間の階層構造を把握することができる。この列構成により、階層型データベース210の階層構造が、リレーショナルデータベース400のデータ構造に反映される。
【0030】
図4は、SQL部品410が保持するSQL文の例を示す図である。SQL部品410は、階層型データベース210のセグメント毎、すなわちリレーショナルデータベース400のテーブル毎に、リレーショナルデータベース400へアクセスするためのSQL文を保持する。
【0031】
COBOLプログラム220から階層型データベース210にアクセスする処理は、大別すると、キー値を指定してデータ値を(a)取得する、(b)更新する、(c)追加する、(d)削除する、の4種類に分けられる。これはリレーショナルデータベース400に対して、(a)SELECT文、(b)UPDATE文、(c)INSERT文、(d)DELETE文、を発行するSQL文として記述することができる。以下では主にテーブル内のカラムを対象とするSQL文を例に取り上げるが、SQL文の対象はデータベースやテーブルでもよい。
【0032】
SQL文生成プログラム120は、構造定義データ211の記述に基づき、リレーショナルデータベース400に対して上記(a)〜(d)のクエリを発行するためのSQL文を生成する。ただし、COBOLプログラム220から動的に引き渡されるパラメータについては、SQL文中には記述せず、SQLクエリを発行するときにクエリ変換プログラム100から引き渡すものとする。
【0033】
テーブル名および列名については、例えば階層型データベース210の各セグメント名などのデータ構造に準じた適当な命名規則などにしたがって付与する。これにより、COBOLプログラム220からリレーショナルデータベース400のいずれのテーブルにアクセスすればよいかを一意に定めることができる。
【0034】
階層型データベース210固有の各セグメントのデータ構造は、SQL部品410が保持する各SQL文に記述されているので、クエリ変換プログラム100内には階層型データベース210各セグメント固有の構造を記述する必要はない。したがって、クエリ変換プログラム100と階層型データベース210の間の依存関係をなくすことができる。
【0035】
以上、汎用機200上のアプリケーション環境をオープン環境に移行するための構成について説明した。次に、クエリ変換プログラム100の動作について説明する。
【0036】
図5は、COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。以下、図5の各ステップについて説明する。
【0037】
(1)クエリ変換プログラムを呼び出す
COBOLプログラム220は、階層型DBインタフェース230に代えて、クエリ変換プログラム100を呼び出し、リレーショナルデータベース400に対するクエリを実行するよう依頼する。クエリ変換プログラム100に引き渡すパラメータは、階層型DBインタフェース230に引き渡すパラメータと同じである。
【0038】
(2)データベースの構造定義を把握する
クエリ変換プログラム100は、構造定義データ211を読み込み、階層型データベース210の構造定義を把握する。ここでいう構造定義とは、各セグメントの親子関係、各セグメントのサイズ、セグメントが有するキーの開始位置、長さ、などのことをいう。
【0039】
(3)クエリを解析する
クエリ変換プログラム100は、COBOLプログラム220から受け取ったクエリの内容を解析する。ここでいうクエリの解析とは、構造定義データ211の記述を必要に応じて用いながら、以下のような処理を行うことをいう。
【0040】
(3.1)検索条件
クエリ変換プログラム100は、COBOLプログラム220から受け取ったパラメータに含まれる、階層型データベース210に対する検索条件を把握する。階層型データベース210に対する検索条件は、例えば1以上のキー値を指定して対応するデータ値を取得するように記述されている。クエリ変換プログラム100は、COBOLプログラム220から受け取ったパラメータからこの検索条件を取り出す。
【0041】
(3.2)経路分析、階層制御
階層型データベース210は、キー値をたどりながら、セグメントの親子関係をまたいでアクセスすることができるように構成されている。例えば、COBOLプログラム220が図2に示した上位セグメント内のフィールドを全て読み終えると、読み取りカーソルが下位セグメントに自動的に移動して下位セグメントのフィールドを読み取り始めるように、クエリを構成することができる。クエリ変換プログラム100は、構造定義データ211の記述にしたがって、このようなセグメントの親子関係をまたがるクエリが発生するか否かを把握する。これにより、セグメントをまたがるクエリが発生する場合、SQL部品410を呼び出す前にその旨を認識し、対象となるテーブルの親子関係などをあらかじめ把握しておくことができる。
【0042】
(4)SQLを実行する
クエリ変換プログラム100は、COBOLプログラム220から受け取ったクエリに対応して、アクセスすべきセグメントを特定し、それに対応するテーブルにアクセスするためのSQL部品410を呼び出す。SQL部品410はクエリ変換プログラム100からの要求に合致するSQL文を実行してリレーショナルデータベース400にアクセスする。COBOLプログラム220から受け取ったクエリがセグメントをまたがる場合は、ステップ(3)の分析結果に基づき、対象となるテーブルに対するクエリを発行することのできるSQL部品410を適宜選択して呼び出す。
【0043】
以上、クエリ変換プログラム100がリレーショナルデータベース400にアクセスする動作について説明した。
【0044】
以上のように、本実施の形態1に係るクエリ変換プログラム100は、COBOLプログラム220から階層型データベース210に対するクエリを、COBOLプログラム220からリレーショナルデータベース400に対するクエリに変換する。これによりCOBOLプログラム220自体は、階層型DBインタフェース230を呼び出す部分を、クエリ変換プログラム100を呼び出すように書き換えるのみで、オープン環境に移行することができるので、プログラムを再構築する必要がなくなり、移行に係るコストや期間を大幅に削減することができる。
【0045】
また、本実施の形態1に係るクエリ変換プログラム100は、構造定義データ211が定義する階層型データベース210のデータ構造にしたがって、SQL文生成プログラム120が生成したSQL部品410のうち適切なものを選択して実行する。これにより、階層型データベース210のデータ構造に依拠する部分をクエリ変換プログラム100から切り離してSQL文内に埋め込むことができるので、クエリ変換プログラム100自体は任意の階層型データベース210に対して汎用的に用いることができる。したがって、個々の階層型データベース210毎にクエリ変換プログラム100を開発する必要がなくなり、開発コストや期間をさらに削減することができる。
【0046】
また、本実施の形態1に係るデータベース変換プログラム110は、構造定義データ211の記述にしたがって、階層型データベース210が備える各セグメントに対応するテーブルを作成するためのDDL文を生成する。各テーブルには、当該セグメントが有するフィールドに対応する列に加え、セグメントの親子関係をたどるための親キー列を追加する。これにより、階層型データベース210のデータ構造を崩すことなく、リレーショナルデータベース400に移行することができる。
【0047】
また、本実施の形態1によれば、クエリ変換プログラム100がCOBOLプログラム220から受け取ったクエリを解析する際に、データベース変換プログラム110が参照した構造定義データ211をそのまま用いて、リレーショナルデータベース400の構造を把握することができる。すなわち、クエリ変換プログラム100とデータベース変換プログラム110は、構造定義データ211を介してデータベース構造についての知識を共有することができる。これにより、COBOLプログラム220が階層型データベース210にアクセスする処理を、リレーショナルデータベース400にアクセスする処理に、矛盾なく変換することができる。
【0048】
<実施の形態2>
実施の形態1では、クエリ変換プログラム100は、構造定義データ211が記述している階層型データベース210の定義にしたがって、COBOLプログラム220から受け取ったクエリを解析することを説明した。本発明の実施の形態2では、構造定義データ211の記述内容をあらかじめメモリ上に展開しておき、クエリを実行する毎に構造定義データ211を読み込まなくてもよいようにすることを図る。
【0049】
図6は、本実施の形態2に係るクエリ変換プログラム100および周辺環境を示す図である。本実施形態2では、実施の形態1の図1で説明した構成に加え、新たに構造定義データ展開プログラム101と、これを生成するための展開プログラム生成プログラム130を設けた。また、COBOLプログラム220は、クエリ変換プログラム100に加えて、プログラムの開始時点で構造定義データ展開プログラム101を呼び出すように書き換えられている。その他の構成は実施の形態1と同様である。なお記載簡易のため、汎用機200など一部の構成は記載を省略した。
【0050】
構造定義データ展開プログラム101は、構造定義データ211が記述している階層型データベース210のデータ構造定義を、コンピュータ300のメモリ上に展開するためのプログラムである。すなわち構造定義データ展開プログラム101は、図5で説明したステップ(2)と同様の処理を、コンピュータ300のメモリ上で実行するプログラムであるともいえる。
【0051】
展開プログラム生成プログラム130は、構造定義データ211の記述にしたがって、構造定義データ展開プログラム101を生成する。構造定義データ展開プログラム101には、構造定義データ211の記述内容がプログラムとして記述される。換言すると、構造定義データ展開プログラム101は、構造定義データ211の記述内容をプログラム内変数としてハードコードしたプログラムであるともいえる。
【0052】
以上、本実施形態2における、汎用機200上のアプリケーション環境をオープン環境に移行するための構成について説明した。次に、各プログラムの動作について、実施形態1と異なる点を中心に説明する。
【0053】
図7は、COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。以下、図7の各ステップについて説明する。
【0054】
(1)展開プログラムを呼び出す
COBOLプログラム220は、プログラム開始時点で一度だけ構造定義データ展開プログラム101を呼び出す。
【0055】
(2)構造定義データをメモリに展開する
構造定義データ展開プログラム101は、コンピュータ300のメモリ上に、構造定義データ展開領域310を確保する。構造定義データ展開プログラム101は、構造定義データ展開領域310に、構造定義データ211の内容を書き込む。構造定義データ展開プログラム101が生成された時点で、構造定義データ展開プログラム101には構造定義データ211の記述内容がハードコードされているので、改めて構造定義データ211を読み込む必要はない。
【0056】
(3)クエリ変換プログラムを呼び出す
本ステップは、図5のステップ(3)と同様である。
【0057】
(4)クエリを解析する
本ステップは、図5のステップ(4)と同様であるが、クエリ変換プログラム100は構造定義データ211ではなく、構造定義データ展開領域310内に書き込まれているメモリ上のデータを読み取る。これにより、ファイルとして作成されている構造定義データ211を読み込むよりも、処理速度を速めることができる。
【0058】
(5)SQLを実行する
本ステップは、図5のステップ(5)と同様である。
【0059】
以上、クエリ変換プログラム100がリレーショナルデータベース400にアクセスする動作について説明した。
【0060】
以上の説明では、展開プログラム生成プログラム130が構造定義データ展開プログラム101を生成し、クエリ変換プログラム100と構造定義データ展開プログラム101を別プログラムとして構成する例を説明したが、両者を一体的に構成することもできる。例えば、以下のような代替構成例が考えられる。
【0061】
(構造定義データ展開プログラム101の代替構成例その1)
任意の構造定義データ211を読み込んでその記述内容を構造定義データ展開領域310に書き込む処理を、クエリ変換プログラム100内に記述しておく。クエリ変換プログラム100は、COBOLプログラム220からクエリを受け取ったとき、構造定義データ展開領域310に構造定義データ211の記述内容が書き込まれているか否かをチェックする。書き込まれていなければ構造定義データ211を読み取って展開し、既に書き込まれていれば同処理を省略する。
【0062】
(構造定義データ展開プログラム101の代替構成例その2)
展開プログラム生成プログラム130は、構造定義データ展開プログラム101を、クエリ変換プログラム100の外部モジュール、例えば動的リンクライブラリなどの形式で生成する。クエリ変換プログラム100は、必要に応じて構造定義データ展開プログラム101を呼び出す。
【0063】
以上のように、本実施の形態2に係るクエリ変換プログラム100は、コンピュータ300のメモリ上に展開されている構造定義データ展開領域310から、階層型データベース210のデータ構造を取得し、これに基づいて、COBOLプログラム220から受け取ったクエリを解析する。メモリ上に構造定義データ211が展開されているので、クエリ変換プログラム100は、クエリの解析を素早く実行することができ、その結果クエリの実行速度が速まる。
【0064】
<実施の形態3>
図8は、本発明の実施の形態3に係るクエリ変換プログラム100および周辺環境を示す図である。本実施形態3では、実施の形態1〜2で説明した構成に加え、COBOLプログラム220を変換するCOBOLソースコード変換プログラム140を新たに設けた。その他の構成は、実施の形態1〜2と同様であるため、記載を省略した。
【0065】
図8の上段に記載しているCOBOLプログラム220は、変換前のソースコードである。COBOLソースコード変換プログラム140は、階層型DBインタフェース230をコールする部分を、クエリ変換プログラム100をコールするように書き換える。またプログラムの実行開始位置に、構造定義データ展開プログラム101をコールする部分を追加する。
【0066】
図8の下線部分は、COBOLソースコード変換プログラム140が書き換えた部分である。必ずしもクエリ変換プログラム100や構造定義データ展開プログラム101を直接コールする必要はなく、別の外部COBOLモジュールを介して間接的にこれらプログラムをコールするようにしてもよい。この外部COBOLモジュールは、いずれかのプログラムが適宜生成すればよい。
【0067】
なお、クエリ変換プログラム100や構造定義データ展開プログラム101が、例えばC言語のように関数引数の数が関数作成時に固定されるプログラム言語によって作成されている場合も考えられる。この場合は、クエリ変換プログラム100や構造定義データ展開プログラム101に引き渡す引数を任意個数に設定できるように、引数そのものは構造体などのデータ集合体に詰め込み、このデータ集合体のみを引き渡すようにするとよい。これにより、引数の固有による制約を受けることはなくなる。ただし、データ構造体に含まれる引数個数を指定する変数を追加するなど、個別の工夫は必要となる。図8下段の引数「PrmCount」は、そのための引数である。
【0068】
クエリ変換プログラム100と構造定義データ展開プログラム101は、変換後のCOBOLプログラム220または外部COBOLモジュールから呼び出すためのインタフェースを内部的に備える。コンピュータ300は、COBOLプログラム220を実行する過程で、その内部インタフェースを呼び出すことにより、クエリ変換プログラム100と構造定義データ展開プログラム101を呼び出す。
【0069】
以上、本実施の形態3では、階層型DBインタフェース230を呼び出す部分を、クエリ変換プログラム100と構造定義データ展開プログラム101を呼び出すように、COBOLプログラム220を自動的に変換する例を説明した。
【0070】
<実施の形態4>
実施の形態1では、SQL部品410は、キー値を指定してデータ値を(a)取得する、(b)更新する、(c)追加する、(d)削除する、の4種類のSQL文を保持していることを説明した。COBOLプログラム220から階層型データベース210に対して発行するクエリの他例として、以下のようなものが考えられる。
【0071】
(階層型データベース210へのクエリ例その1)
COBOLプログラム220は、階層型データベース210内のセグメントが最初に保持しているフィールドのデータ値を取得するクエリを発行することができる。これは、リレーショナルデータベース400が有するテーブルの最初のレコードを取得するよう指示するSQL文として記述することができる。
【0072】
(階層型データベース210へのクエリ例その2)
COBOLプログラム220は、階層型データベース210内のセグメントが次に保持しているフィールドのデータ値を取得するクエリを発行することができる。これは、上記クエリ例その1を実行した後に順次実行するクエリであるが、上記クエリ例その1を1度も実行していないときに本クエリを実行した場合は、最初に当該セグメント内の最初のフィールドを取得し、以後は次のフィールドに順次アクセスすることになる。本クエリは、キー値の昇順または降順にクエリ結果をソートするSQL文として記述することができる。ただし、クエリ結果に順次アクセスする処理は、クエリ変換プログラム100内で制御する必要がある。
【0073】
(階層型データベース210へのクエリ例その3)
COBOLプログラム220は、階層型データベース210内のセグメントが有するフィールドを全て読み終えると、下位セグメントのフィールドに読取カーソルを移動させて読み取りを継続させるようなクエリを発行することができる。同様に、読取対象とする親セグメントを固定して、その親セグメント配下のフィールドのみを読み取るようなクエリを発行することもできる。後者のクエリは、親セグメントに対応するテーブルのみを対象とするSQL文として記述することができる。
【0074】
以上、本実施の形態4では、SQL部品410が保持するSQL文の他例について説明した。
【0075】
本実施の形態4で説明したクエリ例、および実施形態1で説明したクエリ例によって、COBOLプログラム220から階層型データベース210に対して発行するクエリの全てを網羅することができる。すなわち、階層型データベース210に対してアクセスするアプリケーションを、リレーショナルデータベース400に対してアクセスするアプリケーションに、矛盾なくかつ等価に移行することができる。
【0076】
<実施の形態5>
以上の実施形態1〜4で説明した各プログラム、および各プログラムを実行するコンピュータを用いることにより、階層型データベース210および付随するCOBOLアプリケーションを、リレーショナルデータベース400および付随するCOBOLアプリケーションに変換する、データベース変換システムを構築することができる。
【符号の説明】
【0077】
100:クエリ変換プログラム、101:構造定義データ展開プログラム、110:データベース変換プログラム、120:SQL文生成プログラム、130:展開プログラム生成プログラム、140:COBOLソースコード変換プログラム、200:汎用機、210:階層型データベース、211:構造定義データ、220:COBOLプログラム、230:階層型DBインタフェース、400:リレーショナルデータベース、410:SQL部品。
【技術分野】
【0001】
本発明は、汎用機が備える階層型データベースに対してCOBOLプログラムからアクセスする処理を、同じCOBOLプログラムからリレーショナルデータベースに対してアクセスする処理に変換する技術に関するものである。
【背景技術】
【0002】
従来、企業の基幹業務システムなどの大規模情報システムでは、汎用機(メインフレーム、ホストなどとも呼ぶ)が用いられてきた。しかし、ダウンサイジングなどの要求が高まるにつれ、汎用機で稼動しているアプリケーションを、UNIXサーバなどのオープンシステムに移行することが求められている。
【0003】
汎用機が用いるデータベースの中には、階層型構造を有しているものがあり、オープンシステムで用いられるリレーショナルデータベース(RDB)とは、データ形式、データ構造、データ同士の関係などが異なる。そのため、汎用機が用いる階層型データベースにアクセスするアプリケーションをオープンシステムに移行するには、アプリケーションを再構築するのが一般的である。
【0004】
汎用機アプリケーションをオープンシステムに移行する技術として、汎用機上で稼動するCOBOLアプリケーションをJavaなどのオープンシステムで用いられるプログラムに変換する技術がある。
【0005】
その他、下記特許文献1には、メインフレームのアプリケーションをオープン環境に移行する技術として、画面構成に着目したものが記載されている。同文献では、汎用画面フォームと汎用画面データを用いて、複数のメインフレームに対応可能な画面フォームを構成することが記載されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2004−355413号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
階層型データベースにアクセスするアプリケーションをオープンシステムに移行するためには、上述の通りアプリケーションを再構築したり、プログラムを変換したりする必要がある。
【0008】
しかし、アプリケーションを再構築するのは多大なコストと時間がかかる。またプログラムを変換するにしても、データベース構造の違いに起因して、データベースにアクセスする部分のプログラム上のロジックを書き換える必要が生じ、必ずしも全て自動変換できるとは限らない。プログラマがプログラムを書き換える場合、アプリケーションを再構築するのと同様のコストと時間を要する。
【0009】
本発明は、上記のような課題を解決するためになされたものであり、汎用機上のアプリケーションのロジックを残しつつ、階層型データベースにアクセスするアプリケーションをリレーショナルデータベースにアクセスするアプリケーションに変換する技術を提供することを目的とする。
【課題を解決するための手段】
【0010】
本発明に係るクエリ変換プログラムは、階層型データベースの構造定義データと、COBOLプログラムが階層型データベースにアクセスするときのアクセスパラメータに基づき、階層型データベースを変換したリレーショナルデータベースにアクセスするためのクエリを特定する。また、あらかじめ用意されている、前記リレーショナルデータベースにアクセスするSQL部品のうち、前記クエリに相当するものを選択し、前記アクセスパラメータを引き渡してクエリを実行する。
【発明の効果】
【0011】
本発明に係るクエリ変換プログラムによれば、COBOLプログラムから階層型データベースにアクセスする処理を、リレーショナルデータベースにアクセスする処理に変換することができる。すなわち、COBOLプログラムが階層型データベースにアクセスする際に実行するロジックはそのまま残しておき、アクセスが行われる時点でそのアクセスをリレーショナルデータベースに対するアクセスに変換する。これにより、COBOLプログラムをほぼ変更することなく、データベースにアクセスする処理のみを、リレーショナルデータベース環境に移行することができる。
【図面の簡単な説明】
【0012】
【図1】実施の形態1に係るクエリ変換プログラム100および周辺環境を示す図である。
【図2】階層型データベース210のデータ構造を示す図である。
【図3】リレーショナルデータベース400のデータ構造を示す図である。
【図4】SQL部品410が保持するSQL文の例を示す図である。
【図5】COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。
【図6】実施の形態2に係るクエリ変換プログラム100および周辺環境を示す図である。
【図7】COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。
【図8】実施の形態3に係るクエリ変換プログラム100および周辺環境を示す図である。
【発明を実施するための形態】
【0013】
<実施の形態1>
図1は、本発明の実施の形態1に係るクエリ変換プログラム100および周辺環境を示す図である。クエリ変換プログラム100は、汎用機200が備えるCOBOLプログラム220から階層型データベース210にアクセスする処理を、同じCOBOLプログラム220からリレーショナルデータベース400にアクセスする処理に変換するプログラムである。以下、図1の各構成について説明する。
【0014】
なお、以下の説明では記載の便宜上、各プログラムを動作主体として説明することがあるが、実際に各プログラムを実行するのは当該プログラムを備えるコンピュータであることを付言しておく。
【0015】
図1(a)は、汎用機200環境からオープン環境へ移行する前のコンピュータ環境を示す図である。図1(a)において汎用機200は、COBOLプログラム220を実行するコンピュータである。COBOLプログラム220は、階層型DBインタフェース230にアクセスパラメータを引き渡して呼び出し、階層型DBインタフェース230を介して階層型データベース210にアクセスする。
【0016】
階層型データベース210は、後述の図2で説明する階層型構造を有するデータベースである。階層型データベース210のデータ構造は、構造定義データ211に記述されている。この階層型のデータ構造は、オープン環境でよく用いられるリレーショナルデータベース(RDB)のデータ構造とは異なる。したがって、階層型データベース210にアクセスするプログラムをオープン環境に移行するためには、何らかの変換処理、中継処理など、各データベースの構造の差異を吸収する処理が必要になる。
【0017】
汎用機200上に構成されたプログラムをオープン環境に移行する場合、移行対象として、汎用機200本体、COBOLプログラム220、階層型データベース210が挙げられる。なかでもCOBOLプログラム220をオープン環境向けに再構築する作業は、開発量が膨大になりがちである。そこで本発明では、COBOLプログラム220を再構築せず極力そのまま用いて、オープン環境に移行することを図る。
【0018】
図1(b)は、図1(a)のコンピュータ環境をオープン環境に移行した後の構成を示す図である。汎用機200上で稼動していたCOBOLプログラム220は、コンピュータ300上で稼動する。階層型データベース210は、リレーショナルデータベース400に変換されている。
【0019】
COBOLプログラム220は、階層型DBインタフェース230ではなくクエリ変換プログラム100を呼び出すように書き換えられている点を除いて、図1(a)におけるCOBOLプログラム220と同一のプログラムである。すなわちクエリ変換プログラム100は、COBOLプログラム220から階層型データベース210にアクセスする処理を、同じCOBOLプログラム220からリレーショナルデータベース400にアクセスする処理に変換する処理を実行する。
【0020】
データベース変換プログラム110は、階層型データベース210をリレーショナルデータベース400に変換するプログラムである。データベース変換プログラム110は、階層型データベース210の階層構造を反映したDDL(Database Difinition Language)文を生成し、これを実行してリレーショナルデータベース400を作成する。詳細は後述の図2で説明する。
【0021】
SQL文生成プログラム120は、リレーショナルデータベース400にアクセスするクエリを生成するためのSQL部品410を生成する。リレーショナルデータベース400へアクセスするためには、コンピュータ300からSQL文を発行する必要があるので、これに備えたものである。
【0022】
SQL部品410が記述しているSQL文は、リレーショナルデータベース400に対して発行する典型的なSQL文のパターンを網羅したものである。SQL文に引き渡すパラメータを調整することによって、COBOLプログラム220から階層型データベース210に対して発行する任意のクエリを、COBOLプログラム220からリレーショナルデータベース400に対して発行するクエリとして表現できるようになっている。COBOLプログラム220から階層型データベース210に対して発行するクエリの種類については後述する。
【0023】
COBOLプログラム220から階層型データベース210に対してアクセスする処理は、階層型データベース210のデータ構造にある程度依拠している。しかし、本発明においてこのデータ構造に依拠する部分は、SQL部品410としてクエリ変換プログラム100とは独立に構成されている。したがってクエリ変換プログラム100は、単に受け取ったパラメータをSQL部品410に引き渡して呼び出せばよく、階層型データベース210のデータ構造を意識する必要はない。これにより、クエリ変換プログラム100本体は、階層型データベース210のデータ構造に依拠することなく、汎用的に構成することができる。
【0024】
データベース変換プログラム110とSQL文生成プログラム120は、汎用機200またはコンピュータ300が実行するようにしてもよいし、図示しない他のコンピュータが実行するようにしてもよい。
【0025】
以上、汎用機200上のアプリケーション環境をオープン環境に移行するための基本的な構成について説明した。以下、個々の構成要素について詳述する。
【0026】
図2は、階層型データベース210のデータ構造を示す図である。階層型データベース210は、セグメントと呼ばれるデータ領域が親子関係を有する階層構造を備える。各セグメント内のレコードには、データ値とそのデータ値にアクセスするためのキー値がセットになって格納されている。このデータ値とキー値の各構成要素を、フィールドとも呼ぶ。
【0027】
COBOLプログラム220は、階層型データベース210にアクセスする際には、キー値を指定することにより、いずれのレコードに対してアクセスするかを指定することができる。また、セグメントの親子関係をたどって、他のセグメント内のレコードにアクセスすることもできる。
【0028】
図3は、リレーショナルデータベース400のデータ構造を示す図である。データベース変換プログラム110は、構造定義データ211が記述している階層型データベース210の階層構造を反映したDDL文を生成し、リレーショナルデータベース400を作成する。このDDL文は、各セグメントをテーブルとして作成するとともに、各テーブル内に、階層型データベース210のキーフィールドとデータフィールドに対応する個別の列として格納する。
【0029】
さらに下位セグメントに対応するテーブルについては、キーフィールドとデータフィールドに対応する列に加え、上位セグメントのキー値を格納する親キー列を生成する。親キー列の値を参照することにより、各テーブル間の階層構造を把握することができる。この列構成により、階層型データベース210の階層構造が、リレーショナルデータベース400のデータ構造に反映される。
【0030】
図4は、SQL部品410が保持するSQL文の例を示す図である。SQL部品410は、階層型データベース210のセグメント毎、すなわちリレーショナルデータベース400のテーブル毎に、リレーショナルデータベース400へアクセスするためのSQL文を保持する。
【0031】
COBOLプログラム220から階層型データベース210にアクセスする処理は、大別すると、キー値を指定してデータ値を(a)取得する、(b)更新する、(c)追加する、(d)削除する、の4種類に分けられる。これはリレーショナルデータベース400に対して、(a)SELECT文、(b)UPDATE文、(c)INSERT文、(d)DELETE文、を発行するSQL文として記述することができる。以下では主にテーブル内のカラムを対象とするSQL文を例に取り上げるが、SQL文の対象はデータベースやテーブルでもよい。
【0032】
SQL文生成プログラム120は、構造定義データ211の記述に基づき、リレーショナルデータベース400に対して上記(a)〜(d)のクエリを発行するためのSQL文を生成する。ただし、COBOLプログラム220から動的に引き渡されるパラメータについては、SQL文中には記述せず、SQLクエリを発行するときにクエリ変換プログラム100から引き渡すものとする。
【0033】
テーブル名および列名については、例えば階層型データベース210の各セグメント名などのデータ構造に準じた適当な命名規則などにしたがって付与する。これにより、COBOLプログラム220からリレーショナルデータベース400のいずれのテーブルにアクセスすればよいかを一意に定めることができる。
【0034】
階層型データベース210固有の各セグメントのデータ構造は、SQL部品410が保持する各SQL文に記述されているので、クエリ変換プログラム100内には階層型データベース210各セグメント固有の構造を記述する必要はない。したがって、クエリ変換プログラム100と階層型データベース210の間の依存関係をなくすことができる。
【0035】
以上、汎用機200上のアプリケーション環境をオープン環境に移行するための構成について説明した。次に、クエリ変換プログラム100の動作について説明する。
【0036】
図5は、COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。以下、図5の各ステップについて説明する。
【0037】
(1)クエリ変換プログラムを呼び出す
COBOLプログラム220は、階層型DBインタフェース230に代えて、クエリ変換プログラム100を呼び出し、リレーショナルデータベース400に対するクエリを実行するよう依頼する。クエリ変換プログラム100に引き渡すパラメータは、階層型DBインタフェース230に引き渡すパラメータと同じである。
【0038】
(2)データベースの構造定義を把握する
クエリ変換プログラム100は、構造定義データ211を読み込み、階層型データベース210の構造定義を把握する。ここでいう構造定義とは、各セグメントの親子関係、各セグメントのサイズ、セグメントが有するキーの開始位置、長さ、などのことをいう。
【0039】
(3)クエリを解析する
クエリ変換プログラム100は、COBOLプログラム220から受け取ったクエリの内容を解析する。ここでいうクエリの解析とは、構造定義データ211の記述を必要に応じて用いながら、以下のような処理を行うことをいう。
【0040】
(3.1)検索条件
クエリ変換プログラム100は、COBOLプログラム220から受け取ったパラメータに含まれる、階層型データベース210に対する検索条件を把握する。階層型データベース210に対する検索条件は、例えば1以上のキー値を指定して対応するデータ値を取得するように記述されている。クエリ変換プログラム100は、COBOLプログラム220から受け取ったパラメータからこの検索条件を取り出す。
【0041】
(3.2)経路分析、階層制御
階層型データベース210は、キー値をたどりながら、セグメントの親子関係をまたいでアクセスすることができるように構成されている。例えば、COBOLプログラム220が図2に示した上位セグメント内のフィールドを全て読み終えると、読み取りカーソルが下位セグメントに自動的に移動して下位セグメントのフィールドを読み取り始めるように、クエリを構成することができる。クエリ変換プログラム100は、構造定義データ211の記述にしたがって、このようなセグメントの親子関係をまたがるクエリが発生するか否かを把握する。これにより、セグメントをまたがるクエリが発生する場合、SQL部品410を呼び出す前にその旨を認識し、対象となるテーブルの親子関係などをあらかじめ把握しておくことができる。
【0042】
(4)SQLを実行する
クエリ変換プログラム100は、COBOLプログラム220から受け取ったクエリに対応して、アクセスすべきセグメントを特定し、それに対応するテーブルにアクセスするためのSQL部品410を呼び出す。SQL部品410はクエリ変換プログラム100からの要求に合致するSQL文を実行してリレーショナルデータベース400にアクセスする。COBOLプログラム220から受け取ったクエリがセグメントをまたがる場合は、ステップ(3)の分析結果に基づき、対象となるテーブルに対するクエリを発行することのできるSQL部品410を適宜選択して呼び出す。
【0043】
以上、クエリ変換プログラム100がリレーショナルデータベース400にアクセスする動作について説明した。
【0044】
以上のように、本実施の形態1に係るクエリ変換プログラム100は、COBOLプログラム220から階層型データベース210に対するクエリを、COBOLプログラム220からリレーショナルデータベース400に対するクエリに変換する。これによりCOBOLプログラム220自体は、階層型DBインタフェース230を呼び出す部分を、クエリ変換プログラム100を呼び出すように書き換えるのみで、オープン環境に移行することができるので、プログラムを再構築する必要がなくなり、移行に係るコストや期間を大幅に削減することができる。
【0045】
また、本実施の形態1に係るクエリ変換プログラム100は、構造定義データ211が定義する階層型データベース210のデータ構造にしたがって、SQL文生成プログラム120が生成したSQL部品410のうち適切なものを選択して実行する。これにより、階層型データベース210のデータ構造に依拠する部分をクエリ変換プログラム100から切り離してSQL文内に埋め込むことができるので、クエリ変換プログラム100自体は任意の階層型データベース210に対して汎用的に用いることができる。したがって、個々の階層型データベース210毎にクエリ変換プログラム100を開発する必要がなくなり、開発コストや期間をさらに削減することができる。
【0046】
また、本実施の形態1に係るデータベース変換プログラム110は、構造定義データ211の記述にしたがって、階層型データベース210が備える各セグメントに対応するテーブルを作成するためのDDL文を生成する。各テーブルには、当該セグメントが有するフィールドに対応する列に加え、セグメントの親子関係をたどるための親キー列を追加する。これにより、階層型データベース210のデータ構造を崩すことなく、リレーショナルデータベース400に移行することができる。
【0047】
また、本実施の形態1によれば、クエリ変換プログラム100がCOBOLプログラム220から受け取ったクエリを解析する際に、データベース変換プログラム110が参照した構造定義データ211をそのまま用いて、リレーショナルデータベース400の構造を把握することができる。すなわち、クエリ変換プログラム100とデータベース変換プログラム110は、構造定義データ211を介してデータベース構造についての知識を共有することができる。これにより、COBOLプログラム220が階層型データベース210にアクセスする処理を、リレーショナルデータベース400にアクセスする処理に、矛盾なく変換することができる。
【0048】
<実施の形態2>
実施の形態1では、クエリ変換プログラム100は、構造定義データ211が記述している階層型データベース210の定義にしたがって、COBOLプログラム220から受け取ったクエリを解析することを説明した。本発明の実施の形態2では、構造定義データ211の記述内容をあらかじめメモリ上に展開しておき、クエリを実行する毎に構造定義データ211を読み込まなくてもよいようにすることを図る。
【0049】
図6は、本実施の形態2に係るクエリ変換プログラム100および周辺環境を示す図である。本実施形態2では、実施の形態1の図1で説明した構成に加え、新たに構造定義データ展開プログラム101と、これを生成するための展開プログラム生成プログラム130を設けた。また、COBOLプログラム220は、クエリ変換プログラム100に加えて、プログラムの開始時点で構造定義データ展開プログラム101を呼び出すように書き換えられている。その他の構成は実施の形態1と同様である。なお記載簡易のため、汎用機200など一部の構成は記載を省略した。
【0050】
構造定義データ展開プログラム101は、構造定義データ211が記述している階層型データベース210のデータ構造定義を、コンピュータ300のメモリ上に展開するためのプログラムである。すなわち構造定義データ展開プログラム101は、図5で説明したステップ(2)と同様の処理を、コンピュータ300のメモリ上で実行するプログラムであるともいえる。
【0051】
展開プログラム生成プログラム130は、構造定義データ211の記述にしたがって、構造定義データ展開プログラム101を生成する。構造定義データ展開プログラム101には、構造定義データ211の記述内容がプログラムとして記述される。換言すると、構造定義データ展開プログラム101は、構造定義データ211の記述内容をプログラム内変数としてハードコードしたプログラムであるともいえる。
【0052】
以上、本実施形態2における、汎用機200上のアプリケーション環境をオープン環境に移行するための構成について説明した。次に、各プログラムの動作について、実施形態1と異なる点を中心に説明する。
【0053】
図7は、COBOLプログラム220からリレーショナルデータベース400にアクセスする処理の流れを説明する図である。以下、図7の各ステップについて説明する。
【0054】
(1)展開プログラムを呼び出す
COBOLプログラム220は、プログラム開始時点で一度だけ構造定義データ展開プログラム101を呼び出す。
【0055】
(2)構造定義データをメモリに展開する
構造定義データ展開プログラム101は、コンピュータ300のメモリ上に、構造定義データ展開領域310を確保する。構造定義データ展開プログラム101は、構造定義データ展開領域310に、構造定義データ211の内容を書き込む。構造定義データ展開プログラム101が生成された時点で、構造定義データ展開プログラム101には構造定義データ211の記述内容がハードコードされているので、改めて構造定義データ211を読み込む必要はない。
【0056】
(3)クエリ変換プログラムを呼び出す
本ステップは、図5のステップ(3)と同様である。
【0057】
(4)クエリを解析する
本ステップは、図5のステップ(4)と同様であるが、クエリ変換プログラム100は構造定義データ211ではなく、構造定義データ展開領域310内に書き込まれているメモリ上のデータを読み取る。これにより、ファイルとして作成されている構造定義データ211を読み込むよりも、処理速度を速めることができる。
【0058】
(5)SQLを実行する
本ステップは、図5のステップ(5)と同様である。
【0059】
以上、クエリ変換プログラム100がリレーショナルデータベース400にアクセスする動作について説明した。
【0060】
以上の説明では、展開プログラム生成プログラム130が構造定義データ展開プログラム101を生成し、クエリ変換プログラム100と構造定義データ展開プログラム101を別プログラムとして構成する例を説明したが、両者を一体的に構成することもできる。例えば、以下のような代替構成例が考えられる。
【0061】
(構造定義データ展開プログラム101の代替構成例その1)
任意の構造定義データ211を読み込んでその記述内容を構造定義データ展開領域310に書き込む処理を、クエリ変換プログラム100内に記述しておく。クエリ変換プログラム100は、COBOLプログラム220からクエリを受け取ったとき、構造定義データ展開領域310に構造定義データ211の記述内容が書き込まれているか否かをチェックする。書き込まれていなければ構造定義データ211を読み取って展開し、既に書き込まれていれば同処理を省略する。
【0062】
(構造定義データ展開プログラム101の代替構成例その2)
展開プログラム生成プログラム130は、構造定義データ展開プログラム101を、クエリ変換プログラム100の外部モジュール、例えば動的リンクライブラリなどの形式で生成する。クエリ変換プログラム100は、必要に応じて構造定義データ展開プログラム101を呼び出す。
【0063】
以上のように、本実施の形態2に係るクエリ変換プログラム100は、コンピュータ300のメモリ上に展開されている構造定義データ展開領域310から、階層型データベース210のデータ構造を取得し、これに基づいて、COBOLプログラム220から受け取ったクエリを解析する。メモリ上に構造定義データ211が展開されているので、クエリ変換プログラム100は、クエリの解析を素早く実行することができ、その結果クエリの実行速度が速まる。
【0064】
<実施の形態3>
図8は、本発明の実施の形態3に係るクエリ変換プログラム100および周辺環境を示す図である。本実施形態3では、実施の形態1〜2で説明した構成に加え、COBOLプログラム220を変換するCOBOLソースコード変換プログラム140を新たに設けた。その他の構成は、実施の形態1〜2と同様であるため、記載を省略した。
【0065】
図8の上段に記載しているCOBOLプログラム220は、変換前のソースコードである。COBOLソースコード変換プログラム140は、階層型DBインタフェース230をコールする部分を、クエリ変換プログラム100をコールするように書き換える。またプログラムの実行開始位置に、構造定義データ展開プログラム101をコールする部分を追加する。
【0066】
図8の下線部分は、COBOLソースコード変換プログラム140が書き換えた部分である。必ずしもクエリ変換プログラム100や構造定義データ展開プログラム101を直接コールする必要はなく、別の外部COBOLモジュールを介して間接的にこれらプログラムをコールするようにしてもよい。この外部COBOLモジュールは、いずれかのプログラムが適宜生成すればよい。
【0067】
なお、クエリ変換プログラム100や構造定義データ展開プログラム101が、例えばC言語のように関数引数の数が関数作成時に固定されるプログラム言語によって作成されている場合も考えられる。この場合は、クエリ変換プログラム100や構造定義データ展開プログラム101に引き渡す引数を任意個数に設定できるように、引数そのものは構造体などのデータ集合体に詰め込み、このデータ集合体のみを引き渡すようにするとよい。これにより、引数の固有による制約を受けることはなくなる。ただし、データ構造体に含まれる引数個数を指定する変数を追加するなど、個別の工夫は必要となる。図8下段の引数「PrmCount」は、そのための引数である。
【0068】
クエリ変換プログラム100と構造定義データ展開プログラム101は、変換後のCOBOLプログラム220または外部COBOLモジュールから呼び出すためのインタフェースを内部的に備える。コンピュータ300は、COBOLプログラム220を実行する過程で、その内部インタフェースを呼び出すことにより、クエリ変換プログラム100と構造定義データ展開プログラム101を呼び出す。
【0069】
以上、本実施の形態3では、階層型DBインタフェース230を呼び出す部分を、クエリ変換プログラム100と構造定義データ展開プログラム101を呼び出すように、COBOLプログラム220を自動的に変換する例を説明した。
【0070】
<実施の形態4>
実施の形態1では、SQL部品410は、キー値を指定してデータ値を(a)取得する、(b)更新する、(c)追加する、(d)削除する、の4種類のSQL文を保持していることを説明した。COBOLプログラム220から階層型データベース210に対して発行するクエリの他例として、以下のようなものが考えられる。
【0071】
(階層型データベース210へのクエリ例その1)
COBOLプログラム220は、階層型データベース210内のセグメントが最初に保持しているフィールドのデータ値を取得するクエリを発行することができる。これは、リレーショナルデータベース400が有するテーブルの最初のレコードを取得するよう指示するSQL文として記述することができる。
【0072】
(階層型データベース210へのクエリ例その2)
COBOLプログラム220は、階層型データベース210内のセグメントが次に保持しているフィールドのデータ値を取得するクエリを発行することができる。これは、上記クエリ例その1を実行した後に順次実行するクエリであるが、上記クエリ例その1を1度も実行していないときに本クエリを実行した場合は、最初に当該セグメント内の最初のフィールドを取得し、以後は次のフィールドに順次アクセスすることになる。本クエリは、キー値の昇順または降順にクエリ結果をソートするSQL文として記述することができる。ただし、クエリ結果に順次アクセスする処理は、クエリ変換プログラム100内で制御する必要がある。
【0073】
(階層型データベース210へのクエリ例その3)
COBOLプログラム220は、階層型データベース210内のセグメントが有するフィールドを全て読み終えると、下位セグメントのフィールドに読取カーソルを移動させて読み取りを継続させるようなクエリを発行することができる。同様に、読取対象とする親セグメントを固定して、その親セグメント配下のフィールドのみを読み取るようなクエリを発行することもできる。後者のクエリは、親セグメントに対応するテーブルのみを対象とするSQL文として記述することができる。
【0074】
以上、本実施の形態4では、SQL部品410が保持するSQL文の他例について説明した。
【0075】
本実施の形態4で説明したクエリ例、および実施形態1で説明したクエリ例によって、COBOLプログラム220から階層型データベース210に対して発行するクエリの全てを網羅することができる。すなわち、階層型データベース210に対してアクセスするアプリケーションを、リレーショナルデータベース400に対してアクセスするアプリケーションに、矛盾なくかつ等価に移行することができる。
【0076】
<実施の形態5>
以上の実施形態1〜4で説明した各プログラム、および各プログラムを実行するコンピュータを用いることにより、階層型データベース210および付随するCOBOLアプリケーションを、リレーショナルデータベース400および付随するCOBOLアプリケーションに変換する、データベース変換システムを構築することができる。
【符号の説明】
【0077】
100:クエリ変換プログラム、101:構造定義データ展開プログラム、110:データベース変換プログラム、120:SQL文生成プログラム、130:展開プログラム生成プログラム、140:COBOLソースコード変換プログラム、200:汎用機、210:階層型データベース、211:構造定義データ、220:COBOLプログラム、230:階層型DBインタフェース、400:リレーショナルデータベース、410:SQL部品。
【特許請求の範囲】
【請求項1】
汎用機が備える階層型データベースに対してCOBOLプログラムからアクセスする処理を、前記階層型データベースをRDB形式に変換することによって生成したリレーショナルデータベースに対して前記COBOLプログラムからアクセスする処理に変換するための処理を、コンピュータに実行させるプログラムであって、
前記コンピュータに、
前記階層型データベースの構造を定義する構造定義データを読み込む構造取得ステップと、
COBOLプログラムから前記階層型データベースに対してアクセスする階層型DBアクセス処理のアクセスパラメータを受け取るステップと、
前記構造定義データと前記アクセスパラメータに基づき前記階層型DBアクセス処理に対応する前記リレーショナルデータベース宛のクエリを特定する構造解析ステップと、
前記リレーショナルデータベースに対して発行するクエリのうちクエリに引き渡すパラメータを除いた部分を記述した1以上のSQL部品のなかから前記階層型DBアクセス処理に対応するクエリを記述したSQL部品を選択するSQL選択ステップと、
前記SQL選択ステップで選択したSQL部品に前記アクセスパラメータを引き渡して前記リレーショナルデータベース宛のクエリを実行するステップと、
を実行させることを特徴とするクエリ変換プログラム。
【請求項2】
前記構造取得ステップでは、前記コンピュータに、
前記構造定義データを前記コンピュータのメモリ上に展開させ、
前記構造解析ステップでは、前記コンピュータに、
前記メモリ上に展開されている前記構造定義データを用いて前記階層型DBアクセス処理に対応する前記リレーショナルデータベース宛のクエリを特定させる
ことを特徴とする請求項1記載のクエリ変換プログラム。
【請求項3】
前記COBOLプログラムから当該クエリ変換プログラムを呼び出すインタフェースを備え、
前記コンピュータに、
前記COBOLプログラムから当該クエリ変換プログラムに対する呼び出しを受け取って当該クエリ変換プログラムを起動するステップを実行させる
ことを特徴とする請求項1または2記載のクエリ変換プログラム。
【請求項4】
前記汎用機が備える階層型データベースを、請求項1から3のいずれか1項に記載のクエリ変換プログラムを実行するコンピュータがアクセスする前記リレーショナルデータベースに変換する、データベース定義文を生成する処理を、第2コンピュータに実行させるプログラムであって、
前記第2コンピュータに、
前記構造定義データを読み込むステップと、
前記構造定義データが定義する前記階層型データベースの階層構造を反映したデータベース定義文を生成するDDL生成ステップと、
を実行させ、
前記DDL生成ステップでは、前記第2コンピュータに、
前記階層型データベースの上位セグメントが有するフィールドを列として備える上位テーブルを作成するSQL文と、前記上位セグメントの下位セグメントが有するフィールドを列として備える下位テーブルを作成するSQL文を生成させ、
前記下位テーブルを作成するSQL文内に、前記下位セグメントが有するフィールドに対応する列に加えて、前記上位セグメントが有するキーフィールドに対応する列を指定する新たな列を記述させる
ことを特徴とするデータベース変換プログラム。
【請求項5】
請求項4記載のデータベース変換プログラムが生成したSQL文によって生成されたデータベースに対してアクセスするSQL文を生成する処理を前記第2コンピュータに実行させるプログラムであって、
前記第2コンピュータに、
前記構造定義データを読み込むステップと、
前記構造定義データが記述している定義に基づき前記SQL部品を生成するSQL文生成ステップと、
を実行させ、
前記SQL文生成ステップでは、前記第2コンピュータに、
前記階層型データベースのセグメントに対応する前記リレーショナルデータベース内のテーブルを指定して、セグメントが有するキーに対応する列に対して検索条件を与え、条件を満たす最初のレコードにアクセスするSQL文と、
前記階層型データベースのセグメントに対応する前記リレーショナルデータベース内のテーブルを指定して当該テーブル内で前回与えられた検索条件を満たす次レコードにアクセスするSQL文と、
前記階層型データベース内セグメントへの新たなレコードの追加に相当する、前記リレーショナルデータベース内の対応するテーブルに新たなレコードを追加するSQL文と、
前記階層型データベース内のセグメントレコードの更新に相当する前記リレーショナルデータベース内の対応するテーブルレコードを更新するSQL文と、
前記階層型データベース内のセグメントレコードの削除に相当する前記リレーショナルデータベース内のテーブルレコードを削除するSQL文と、
を生成させることを特徴とするSQL文生成プログラム。
【請求項6】
前記汎用機が備える階層型データベースに対してアクセスするCOBOLプログラムを、前記階層型データベースをRDB形式に変換することによって生成したリレーショナルデータベースに対してアクセスするCOBOLプログラムに変換する処理を、第3コンピュータに実行させるプログラムであって、
前記第3コンピュータに、
前記COBOLプログラムのうち前記階層型データベースに対してアクセスするインタフェースを呼び出す処理を、
請求項1から3のいずれか1項に記載のクエリ変換プログラムを呼び出す処理に書き換えさせる
ことを特徴とするCOBOLソースコード変換プログラム。
【請求項7】
請求項1から3のいずれか1項に記載のクエリ変換プログラムと、
請求項4記載のデータベース変換プログラムと、
請求項5記載のSQL文生成プログラムと、
請求項6記載のCOBOLソースコード変換プログラムと、
各前記プログラムを実行するコンピュータと、
を有することを特徴とするデータベース変換システム。
【請求項1】
汎用機が備える階層型データベースに対してCOBOLプログラムからアクセスする処理を、前記階層型データベースをRDB形式に変換することによって生成したリレーショナルデータベースに対して前記COBOLプログラムからアクセスする処理に変換するための処理を、コンピュータに実行させるプログラムであって、
前記コンピュータに、
前記階層型データベースの構造を定義する構造定義データを読み込む構造取得ステップと、
COBOLプログラムから前記階層型データベースに対してアクセスする階層型DBアクセス処理のアクセスパラメータを受け取るステップと、
前記構造定義データと前記アクセスパラメータに基づき前記階層型DBアクセス処理に対応する前記リレーショナルデータベース宛のクエリを特定する構造解析ステップと、
前記リレーショナルデータベースに対して発行するクエリのうちクエリに引き渡すパラメータを除いた部分を記述した1以上のSQL部品のなかから前記階層型DBアクセス処理に対応するクエリを記述したSQL部品を選択するSQL選択ステップと、
前記SQL選択ステップで選択したSQL部品に前記アクセスパラメータを引き渡して前記リレーショナルデータベース宛のクエリを実行するステップと、
を実行させることを特徴とするクエリ変換プログラム。
【請求項2】
前記構造取得ステップでは、前記コンピュータに、
前記構造定義データを前記コンピュータのメモリ上に展開させ、
前記構造解析ステップでは、前記コンピュータに、
前記メモリ上に展開されている前記構造定義データを用いて前記階層型DBアクセス処理に対応する前記リレーショナルデータベース宛のクエリを特定させる
ことを特徴とする請求項1記載のクエリ変換プログラム。
【請求項3】
前記COBOLプログラムから当該クエリ変換プログラムを呼び出すインタフェースを備え、
前記コンピュータに、
前記COBOLプログラムから当該クエリ変換プログラムに対する呼び出しを受け取って当該クエリ変換プログラムを起動するステップを実行させる
ことを特徴とする請求項1または2記載のクエリ変換プログラム。
【請求項4】
前記汎用機が備える階層型データベースを、請求項1から3のいずれか1項に記載のクエリ変換プログラムを実行するコンピュータがアクセスする前記リレーショナルデータベースに変換する、データベース定義文を生成する処理を、第2コンピュータに実行させるプログラムであって、
前記第2コンピュータに、
前記構造定義データを読み込むステップと、
前記構造定義データが定義する前記階層型データベースの階層構造を反映したデータベース定義文を生成するDDL生成ステップと、
を実行させ、
前記DDL生成ステップでは、前記第2コンピュータに、
前記階層型データベースの上位セグメントが有するフィールドを列として備える上位テーブルを作成するSQL文と、前記上位セグメントの下位セグメントが有するフィールドを列として備える下位テーブルを作成するSQL文を生成させ、
前記下位テーブルを作成するSQL文内に、前記下位セグメントが有するフィールドに対応する列に加えて、前記上位セグメントが有するキーフィールドに対応する列を指定する新たな列を記述させる
ことを特徴とするデータベース変換プログラム。
【請求項5】
請求項4記載のデータベース変換プログラムが生成したSQL文によって生成されたデータベースに対してアクセスするSQL文を生成する処理を前記第2コンピュータに実行させるプログラムであって、
前記第2コンピュータに、
前記構造定義データを読み込むステップと、
前記構造定義データが記述している定義に基づき前記SQL部品を生成するSQL文生成ステップと、
を実行させ、
前記SQL文生成ステップでは、前記第2コンピュータに、
前記階層型データベースのセグメントに対応する前記リレーショナルデータベース内のテーブルを指定して、セグメントが有するキーに対応する列に対して検索条件を与え、条件を満たす最初のレコードにアクセスするSQL文と、
前記階層型データベースのセグメントに対応する前記リレーショナルデータベース内のテーブルを指定して当該テーブル内で前回与えられた検索条件を満たす次レコードにアクセスするSQL文と、
前記階層型データベース内セグメントへの新たなレコードの追加に相当する、前記リレーショナルデータベース内の対応するテーブルに新たなレコードを追加するSQL文と、
前記階層型データベース内のセグメントレコードの更新に相当する前記リレーショナルデータベース内の対応するテーブルレコードを更新するSQL文と、
前記階層型データベース内のセグメントレコードの削除に相当する前記リレーショナルデータベース内のテーブルレコードを削除するSQL文と、
を生成させることを特徴とするSQL文生成プログラム。
【請求項6】
前記汎用機が備える階層型データベースに対してアクセスするCOBOLプログラムを、前記階層型データベースをRDB形式に変換することによって生成したリレーショナルデータベースに対してアクセスするCOBOLプログラムに変換する処理を、第3コンピュータに実行させるプログラムであって、
前記第3コンピュータに、
前記COBOLプログラムのうち前記階層型データベースに対してアクセスするインタフェースを呼び出す処理を、
請求項1から3のいずれか1項に記載のクエリ変換プログラムを呼び出す処理に書き換えさせる
ことを特徴とするCOBOLソースコード変換プログラム。
【請求項7】
請求項1から3のいずれか1項に記載のクエリ変換プログラムと、
請求項4記載のデータベース変換プログラムと、
請求項5記載のSQL文生成プログラムと、
請求項6記載のCOBOLソースコード変換プログラムと、
各前記プログラムを実行するコンピュータと、
を有することを特徴とするデータベース変換システム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【公開番号】特開2011−197988(P2011−197988A)
【公開日】平成23年10月6日(2011.10.6)
【国際特許分類】
【出願番号】特願2010−63592(P2010−63592)
【出願日】平成22年3月19日(2010.3.19)
【特許番号】特許第4754021号(P4754021)
【特許公報発行日】平成23年8月24日(2011.8.24)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.UNIX
2.JAVA
【出願人】(591057256)株式会社エクサ (36)
【Fターム(参考)】
【公開日】平成23年10月6日(2011.10.6)
【国際特許分類】
【出願日】平成22年3月19日(2010.3.19)
【特許番号】特許第4754021号(P4754021)
【特許公報発行日】平成23年8月24日(2011.8.24)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.UNIX
2.JAVA
【出願人】(591057256)株式会社エクサ (36)
【Fターム(参考)】
[ Back to top ]