JP2008242677A - データベース構築支援システムとデータベース構築情報生成方法およびプログラム - Google Patents
データベース構築支援システムとデータベース構築情報生成方法およびプログラム Download PDFInfo
- Publication number
- JP2008242677A JP2008242677A JP2007080492A JP2007080492A JP2008242677A JP 2008242677 A JP2008242677 A JP 2008242677A JP 2007080492 A JP2007080492 A JP 2007080492A JP 2007080492 A JP2007080492 A JP 2007080492A JP 2008242677 A JP2008242677 A JP 2008242677A
- Authority
- JP
- Japan
- Prior art keywords
- database
- information
- design document
- database design
- sql
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
【課題】データベースの開発工数を軽減することを可能とすると共に、開発者に依存しない検索SQL分の作成を可能として保守運用の複雑化を回避する。
【解決手段】テーブル一覧表作成処理部201、テーブル定義書作成処理部202、データベース設計書CSV作成処理部203により、データベース設計書101を基に、テーブル一覧表301、テーブル定義書302、データベース設計書CSV303を生成し、テーブル作成SQL文作成処理部401と、SQL*Loader用制御文作成処理部407、コピーテーブルSQL文作成処理部404により、データベース設計書CSV303の情報を基に、データベースを構築する上で必要となる情報としての、データベースにおけるテーブルを作成するテーブル作成SQL文501、テーブルにデータをローディングすると共にテーブルのバックアップを取得するSQL*Loader用制御文507、テーブルを本番環境に移行するコピーテーブルSQL文504を生成する。
【選択図】図1
【解決手段】テーブル一覧表作成処理部201、テーブル定義書作成処理部202、データベース設計書CSV作成処理部203により、データベース設計書101を基に、テーブル一覧表301、テーブル定義書302、データベース設計書CSV303を生成し、テーブル作成SQL文作成処理部401と、SQL*Loader用制御文作成処理部407、コピーテーブルSQL文作成処理部404により、データベース設計書CSV303の情報を基に、データベースを構築する上で必要となる情報としての、データベースにおけるテーブルを作成するテーブル作成SQL文501、テーブルにデータをローディングすると共にテーブルのバックアップを取得するSQL*Loader用制御文507、テーブルを本番環境に移行するコピーテーブルSQL文504を生成する。
【選択図】図1
Description
本発明は、プログラムされたコンピュータによってデータベースを構築する技術に係り、特に、データベース設計書の情報を基に、ドキュメント生成およびテーブル作成SQL文、データローディング制御文、テーブルバックアップ取得SQL文、テーブル本番環境移行SQL文、DBアクセスモジュール、コピー文を自動生成し、データベース構築を効率的に支援するのに好適なデータベース構築支援技術に関するものである。
プログラムされたコンピュータによってデータベースを構築する技術に関連する従来技術として、例えば、特許文献1に記載のように、データベースの設計段階で記述したデータベース設計書の情報を基にデータベース定義SQL文を自動生成するものがある。
この技術では、データベースの設計段階で記述したデータベース設計書を1行ずつ読み込み、当該行が(1)テーブル情報と(2)インデックス情報および(3)レコード件数情報のいずれであるかを判定し、(1)テーブル情報であれば、当該テーブル情報に基づきテーブル定義文を編集して出力すると共にレコードサイズ計算を行い、(2)インデックス情報であれば、当該インデックス情報に基づきインデックス定義文を編集して出力すると共にインデックスレコードサイズ計算を行い、(3)レコード件数情報であれば、レコード件数ワークに格納する処理を全ての行に渡って行い、その後、テーブル領域サイズの算出、テーブル領域サイズ定義文の出力、インデックス領域サイズの算出、インデックス領域サイズ定義文の出力を行うものである。
このように、データベース設計書の情報を各行毎に編集して、自動的に、各情報の内容に対応したSQL文を生成し、かつ、各情報のレコードサイズに対応したSQL文を生成することにより、従来のデータベースの構築において、データベース設計書のドキュメントに基づいてデータベースの構造を定義するSQL文(データベース定義SQL文)をキーボード入力によって作成する際の問題点(このデータベース定義SQL文には、データベース設計書と同じ情報を入力することになるが、キーボードからの入力において入力ミスが発生し易い)を解決することができる。
しかし、この技術では、自動で作成することができる対象は、データベース定義SQL文(テーブル作成SQL文とインデックス作成SQL文)のみである。
このように、上記従来技術では、データベース設計書の内容に対応するデータベース定義SQL文(テーブル作成・インデックス作成)のみを作成できるだけであり、データベースを構築する上で必要となるその他のSQL文やテーブル定義に関するドキュメントは、人手により作成する必要がある。また、CGIプログラムからテーブルを検索するSQL文も人手により作成する必要がある。
そのため、開発工数がかかり、さらに、開発者に依存した検索SQL分が作成されるので、保守運用が複雑化する懸念がある。
解決しようとする問題点は、従来の技術では、データベース設計書の内容に対応するデータベース定義SQL文(テーブル作成・インデックス作成)のみを作成できるだけであり、データベースを構築する上で必要となるその他のSQL文やテーブル定義に関するドキュメントは、人手により作成しなければならない点と、CGIプログラムからテーブルを検索するSQL文も人手により作成しなければならない点である。
本発明の目的は、これら従来技術の課題を解決し、データベースの開発工数を軽減することを可能とすると共に、開発者に依存しない検索SQL分の作成を可能として保守運用の複雑化を回避することである。
上記目的を達成するため、本発明は、プログラムされたコンピュータによって、データベースを構築する上で必要となる情報を生成してデータベースの構築を支援するために、予め記憶装置に格納されたデータベース設計書の情報を読み出し、このデータベース設計書の情報を基に、テーブル一覧表を生成して記憶装置に出力すると共に、予め記憶装置に格納されたデータベース設計書の情報を読み出し、このデータベース設計書の情報を基に、テーブル定義書を生成して記憶装置に出力し、さらに、予め記憶装置に格納されたデータベース設計書の情報を読み出し、このデータベース設計書の情報を基に、データベース設計書CSVを生成して記憶装置に出力し、そして、データベース設計書CSVを読み出し、このデータベース設計書CSVを基に、データベースを構築する上で必要となる情報としての、データベースにおけるテーブルを作成するSQL文、テーブルにデータをローディングする制御文、テーブルのバックアップを取得するSQL文、テーブルを本番環境に移行するSQL文を生成することを特徴とする。さらに、データベース設計書CSVを読み出し、このデータベース設計書CSVを基に、DBアクセスモジュールとコピー文を生成することを特徴とする。
本発明によれば、(1)データベースを管理する上で必要となるテーブル定義のドキュメント、(2)データをテーブルに取込むために必要となるローディング制御文、(3)システムを保守運用する上で必須となるデータのバックアップを取得するSQL文、(4)新規作成したテーブルや更新したテーブルを本番環境に移行するSQL、(5)DBアクセスモジュールとコピー文を含む、それぞれデータベースを構築する上で必要となるドキュメントやSQL文を、データベース設計書の情報を基に、自動で生成することができるので、開発や保守運用の工数を削減することが可能となると共に、それぞれ、必ず整合性が取れたものとなる。
以下、図を用いて本発明を実施するための最良の形態例を説明する。
図1は、本発明に係るデータベース構築支援システムの構成例を示すブロック図であり、図2は、図1におけるテーブル一覧表作成処理部の処理動作例を示すフローチャート、図3Aは、図1におけるテーブル定義書作成処理部の第1の処理動作例を示すフローチャート、図3Bは、図1におけるテーブル定義書作成処理部の第2の処理動作例を示すフローチャート、図3Cは、図1におけるテーブル定義書作成処理部の第3の処理動作例を示すフローチャートである。
また、図4は、図1におけるデータベース設計書CSV作成処理部の処理動作例を示すフローチャート、図5Aは、図1におけるテーブル作成SQL文作成処理部の第1の処理動作例を示すフローチャート、図5Bは、図1におけるテーブル作成SQL文作成処理部の第2の処理動作例を示すフローチャート、図6Aは、図1におけるインデックス作成SQL文作成処理部の第1の処理動作例を示すフローチャート、図6Bは、図1におけるインデックス作成SQL文作成処理部の第2の処理動作例を示すフローチャート、図6Cは、図1におけるインデックス作成SQL文作成処理部の第3の処理動作例を示すフローチャートである。
また、図7Aは、図1におけるインデックス削除SQL文作成処理部の第1の処理動作例を示すフローチャート、図7Bは、図1におけるインデックス削除SQL文作成処理部の第2の処理動作例を示すフローチャート、図8Aは、図1におけるコピーテーブル作成SQL文作成処理部の第1の処理動作例を示すフローチャート、図8Bは、図1におけるコピーテーブル作成SQL文作成処理部の第2の処理動作例を示すフローチャートである。
また、図9Aは、図1におけるテーブルリネームSQL文作成処理部の第1の処理動作例を示すフローチャート、図9Bは、図1におけるテーブルリネームSQL文作成処理部の第2の処理動作例を示すフローチャート、図10は、図1における旧テーブル削除SQL文作成処理部の処理動作例を示すフローチャート、図11Aは、図1におけるSQL*Loader用制御文作成処理部の第1の処理動作例を示すフローチャート、図11Bは、図1におけるSQL*Loader用制御文作成処理部の第2の処理動作例を示すフローチャートである。
また、図12Aは、図1におけるテーブル引上げSQL文作成処理部の第1の処理動作例を示すフローチャート、図12Bは、図1におけるテーブル引上げSQL文作成処理部の第2の処理動作例を示すフローチャート、図13Aは、図1におけるデータベース設計書のサンプル例を示す説明図、図13Bは、図1におけるデータベース設計書の項目説明例を示す説明図、図13Cは、図1におけるデータベース設計書のデータ例を示す説明図である。
また、図14は、図1におけるテーブル一覧表の構成例を示す説明図、図15Aは、図1におけるテーブル定義書のサンプル例を示す説明図、図15Bは、図1におけるテーブル定義書の項目説明例を示す説明図、図15Cは、図1におけるテーブル定義書のデータ例を示す説明図、図16Aは、図1におけるデータベース設計書CSVのサンプル例を示す説明図、図16Bは、図1におけるデータベース設計書CSVの項目説明例を示す説明図、図16Cは、図1におけるデータベース設計書CSVのデータ例を示す説明図である。
また、図17Aは、図1におけるテーブル作成SQL文のサンプル例を示す説明図、図17Bは、図1におけるテーブル作成SQL文の内容説明例を示す説明図、図18は、図1におけるインデックス作成SQL文の具体例を示す説明図、図19は、図1におけるインデックス削除SQL文の具体例を示す説明図、図20Aは、図1におけるコピーテーブル作成SQL文のサンプル例を示す説明図、図20Bは、図1におけるコピーテーブル作成SQL文の内容説明例を示す説明図である。
また、図21は、図1におけるテーブルリネーム作成SQL文の具体例を示す説明図、図22は、図1における旧テーブル削除SQL文の具体例を示す説明図、図23は、図1におけるSQL*Loader用制御文の具体例を示す説明図、図24Aは、図1におけるテーブル引上げSQL文のサンプル例を示す説明図、図24Bは、図1におけるテーブル引上げSQL文の内容説明例を示す説明図である。
また、図25は、図1におけるデータベース構築支援システムで作成した各SQL文による処理機能を示す説明図、図26Aは、図1におけるDBアクセスモジュール作成処理部の第1の処理動作例を示すフローチャート、図26Bは、図1におけるDBアクセスモジュール作成処理部の第2の処理動作例を示すフローチャート、図27は、図1におけるコピー文作成処理部の処理動作例を示すフローチャートである。
また、図28は、図1におけるデータベース構築支援システムで生成したDBアクセスモジュールの内容説明を示す説明図であり、図29は、図1におけるデータベース構築支援システムで生成したコピー文のサンプルとその内容説明を示す説明図、図30は、図26A,Bおよび図27における処理で作成されたDBアクセスモジュールとコピー文の処理機能を示す説明図である。
本例のデータベース構築支援システムは、CPU(Central Processing Unit)や主メモリ、表示装置、入力装置、外部記憶装置からなるコンピュータ構成の、図1におけるサーバコンピュータ1からなり、光ディスク駆動装置等を介してCD−ROM等の記憶媒体に記録されたプログラムやデータを外部記憶装置内にインストールした後、この外部記憶装置から主メモリに読み込みCPUで処理することにより、データベース構築の支援機能を実行する。
すなわち、図1におけるサービスコンピュータ1は、プログラムされたコンピュータ処理機能として、テーブルスキーマ管理機能およびSQLジェネレータ機能を有し、予め記憶装置に記憶されたデータベース設計書101の情報に基づいて、テーブル一覧表301、テーブル定義書302、データベース設計書CSV303を自動で作成し、さらに、このデータベース設計書CSV303に基づいて、テーブル作成するテーブル作成SQL文501、インデックス作成SQL文502、インデックス削除SQL文503、コピーテーブル作成SQL文504、テーブルリネームSQL文505、旧テーブル削除SQL文506、SQL*Loader用制御文507、テーブル引上げSQL文508、DBアクセスモジュール509、コピー文510を自動で作成する。
尚、データベース設計書101とテーブル一覧表301は「Excel(登録商標)」等の表計算ソフトで構成された磁気データであり記憶装置に格納される。
また、サーバコンピュータ1は、プログラムされたコンピュータ処理機能として、テーブル一覧作成処理部201、テーブル定義書作成処理部202、データベース設計書CSV作成処理部203、テーブル作成SQL文作成処理部401、インデックス作成SQL文作成処理部402、インデックス削除SQL文作成処理部403、コピーテーブル作成SQL文作成処理部404、テーブルリネームSQL文作成処理部405、旧テーブル削除SQL文作成処理部406、SQL*Loader用制御文作成処理部407、テーブル引上げSQL文作成処理部408、DBアクセスモジュール作成処理部409、コピー文作成処理部410の各処理機能を有し、本発明に係るデータベース構築支援システムに係る処理を実行する。
すなわち、本例のデータベース構築支援システムは、プログラムされたコンピュータによって、データベースを構築する上で必要となる情報を生成してデータベースの構築を支援するために、まず、第1の処理手段としてのテーブル一覧表作成処理部201、第2の処理手段としてのテーブル定義書作成処理部202、第3の処理手段としてのデータベース設計書CSV作成処理部203により、予め記憶装置に格納されたデータベース設計書101の情報を読み出し、このデータベース設計書101の情報を基に、テーブル一覧表301、テーブル定義書302、データベース設計書CSV303を生成して記憶装置に出力し、そして、第4の処理手段としてのテーブル作成SQL文作成処理部401と、第5,第6の処理手段としてのSQL*Loader用制御文作成処理部407、および、第7の処理手段としてのコピーテーブルSQL文作成処理部404により、データベース設計書CSV303の情報を読み出し、このデータベース設計書CSV303の情報を基に、データベースを構築する上で必要となる情報としての、データベースにおけるテーブルを作成するテーブル作成SQL文501、テーブルにデータをローディングすると共にテーブルのバックアップを取得するSQL*Loader用制御文507、テーブルを本番環境に移行するコピーテーブルSQL文504を生成する。
また、第8の処理手段としてのDBアクセスモジュール作成処理部409と第9の処理手段としてのコピー文作成処理部410により、データベース設計書CSV303の情報を読み出し、このデータベース設計書CSV303の情報を基に、DBアクセスモジュール509とコピー文510を生成する。
以下、このようなデータベース構築支援システムに係る処理の詳細を説明する。
データベース設計書101は、図13A〜Cで示す構成内容である。図13Aにおいては、データベース設計書のサンプル1301を示しており、図13Bにおいては、その項目説明1302、図13Cにおいてはその具体的なデータ例1303を示している。
但し、図13A〜Cで示すデータベース設計書101の例は、あくまで最小のレイアウトであるため、テーブルの項目が増えた場合でも、各ドキュメントやデータベースを作成する各SQL文を自動で作成できる。
まず、図2を用いて、テーブル一覧表作成処理部201の処理動作について説明する。この処理は、データベース設計書101の情報に基づいて、テーブル一覧表301を自動で作成する処理である。このテーブル一覧表301は、図14に示す構成内容となる。
まず、テーブル一覧表のタイトル(テーブル名をセルA1、ファイル名をセルB1、サイズをセルC1、キーをセルD1)をテーブル一覧表301に出力する(ステップS201)。
テーブル一覧表のタイトル出力後、データベース設計書101を読み込みテーブル名をテーブル一覧表301のA列(ステップS202)、ファイル名をテーブル一覧表301のB列(ステップS203)、1レコードのサイズをテーブル一覧表301のC列(ステップS204)、テーブルのキー項目をテーブル一覧表301のD列(ステップS205)に出力する。この処理をシートがあるだけループし実行する(ステップS206)。
このテーブル一覧表作成処理部201の処理結果として、図14に示すテーブル一覧表が生成される。尚、図14において、1401はテーブル一覧表のサンプルであり、1402はその項目説明、1403はそのデータ例である。
次に、図3A〜Cを用いてテーブル定義書作成処理部202の処理動作について説明する。これは、データベース設計書101の情報に基づいて、テーブル定義書302を自動で作成する処理である。図15A〜Cにテーブル定義書302の詳細内容を示す。
まず、データベース設計書101を読み込み、1レコードのバイト数を算出する(ステップS302)。データベース設計書の型が"K"の場合、当該項目の桁を2倍して加算し(ステップS302)、それ以外の場合は当該項目の桁をそのまま加算する(ステップS303)。この処理を項目があるだけループし実行する(ステップS304)。
1レコードのバイト数を算出後、図3Bに詳細を示すようにしてテーブル定義書のタイトルを作成する(ステップS305)。まず、タイトル入力エリアの罫線を作成し(ステップS306)、タイトル(システ名称、ファイル名称、ファイルID、1レコードのバイト数)をテーブル定義書(102)に出力する(ステップS307)。
タイトル作成後(ステップS305)、図3Cに詳細を示すようにしてテーブル定義入力エリアの罫線を作成する(ステップS308)。まず、テーブル定義入力エリアの外枠の罫線を作成し(ステップS310)、その後、項目入力エリアの罫線(ステップS311)、DATA NAME入力エリアの罫線(ステップS312)、PICTURE入力エリアの罫線(ステップS313)、ETC入力エリアの罫線(ステップS314)を作成する。
テーブル定義入力エリアの罫線作成後、目盛り(1〜100)を作成する(ステップS325)。iが5で割切れる場合は目盛りを上段に作成し(ステップS316)、iが5で割切れない場合は目盛りを下段に作成する(ステップS317)。iを1からスタートさせ1ずつ加算し、100ループし目盛り作成処理を実行する(ステップS325)。 尚、iは、目盛りカウンタである。
テーブル定義入力エリアの罫線作成後(ステップS308)、データベース設計書101の各項目をテーブル定義書(102)に追加する(ステップS326)。
データベース設計書101の項目名をテーブル定義書の項目欄に出力する(ステップS320)。但し、項目が2行に跨った場合(100目盛り跨る)、データベース設計書101の項目名に"(続き)"を付加し、テーブル定義書(102)の項目欄に出力する(ステップS318)(ステップS319)。
データベース設計書101の項目名をテーブル定義書のDATA NAME欄に出力する(ステップS321)。
データベース設計書101の型と桁をテーブル定義書のPICTURE欄に出力する(ステップS322)。
データベース設計書101の備考をテーブル定義書の備考欄に出力する(ステップS323)。
データベース設計書101から各項目の追加後、罫線作成済みテーブル定義入力エリアをチェックする。罫線作成済みテーブル定義入力エリアが全て使用済みの場合(ステップS324)、再度タイトル作成とテーブル定義入力エリアの罫線作成を実行する(ステップS305),(ステップS308)。データベース設計書101の各項目をテーブル定義書(102)に追加する処理をデータベース設計書101の項目があるだけループし実行する(ステップS326)。
このテーブル定義書作成処理部202の処理結果として、図15A〜Cに示すテーブル定義書が生成される。尚、図15Aにおいては、テーブル定義書のサンプル1501を示し、図15Bにおいては、テーブル定義書の項目説明1502、図15Cにおいては、テーブル定義書のデータ例1503を示している。
次に、図4を参照してデータベース設計書CSV作成処理部203の処理動作について説明する。これは、データベース設計書101の情報に基づいてデータベース設計書CSV303を自動で作成する処理である。図16A〜Cがデータベース設計書CSV303の構成である。
データベース設計書101を開き、CSV形式ファイル303として保存する(ステップS402)。この処理をデータベース設計書101のシートがあるだけ実行する(ステップS401)。
このデータベース設計書CSV作成処理部203の処理結果として、図16A〜Cに詳細を示すデータベース設計書CSV303が生成される。尚、図16Aにおいては、データベース設計書CSVのサンプル1601を示し、図16Bにおいては、データベース設計書CSVの項目説明1602、図16Cにおいては、データベース設計書CSVのデータ例1603を示している。
次に、図5A,Bを参照して、テーブル作成SQL文作成処理部401の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてテーブル作成SQL文501を作成する処理である。図17A,Bがテーブル作成SQL文501の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS501)。
次に、SQLエラーが発生しても後続処理を実行させる命令文とテーブルを削除するSQL文とテーブルを作成するSQL文をテーブル作成SQL文501に出力する(ステップS503)。
次に、テーブルの項目名を出力する処理(項目分ループ)を実行する(ステップS505)。
(1)まず、データベース設計書CSV303の項目名をテーブル作成SQL文501に出力する(ステップS506)。
(2)次に、当該項目の型をチェックする。当該項目の型が"0"または"9"の場合、"NUMBER"と桁をテーブル作成SQL文501に出力する(ステップS507,S508)。
当該項目の型が"X"の場合、"VERCHAR2"と桁をテーブル作成SQL文501に出力する(ステップS509,S510)。当該項目の型が"K"の場合、"NVERCHAR2"と桁をテーブル作成SQL文501に出力する(ステップS511,ステップS512)。当該項目の型がそれ以外の場合、"LONG" をテーブル作成SQL文501に出力する(ステップS511,S513)。
(3)次に、まだ項目があるかチェックする。次の項目がある場合、","をテーブル作成SQL文501に出力する(ステップS514,S515)。次の項目がない場合、")"をテーブル作成SQL文501に出力する(ステップS514,S516)。
上記(1)〜(3)の処理を項目があるだけループし実行する(ステップS505)。
その後、テーブルを格納する表領域のパラメータをテーブル作成SQL文501に出力する(ステップS518)。
そして最後に、SQLPLUSを終了する命令文をテーブル作成SQL文501に出力する(ステップS521)。
このテーブル作成SQL文作成処理部401の処理結果として、図17A,Bに詳細を示すテーブル作成SQL文501が生成される。尚、図17Aにおいては、テーブル作成SQL文のサンプル1701を示し、図17Bにおいては、テーブル作成SQL文の内容説明1702を示している。
次に、図6A〜Cを参照してインデックス作成SQL文作成処理部402の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてインデックス作成SQL文502を作成する処理である。図18A,Bがインデックス作成SQL文の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS602)。
次に、SQL処理時間を出力させる命令文とSQLエラーが発生した時点でロールバックを行い、リターンコード「1」を戻してSQLPLUSを終了する命令文をインデックス作成SQL文502に出力する(ステップS608)。
次に、NOT NULL制約SQL文作成処理を実行する(ステップS652)。すなわち、当該項目にNOT NULL制約を有効にする定義されているかチェックし、定義されている場合、NOT NULL制約SQL文をインデックス作成SQL文502に出力する(ステップS609,S610)。この処理を項目があるだけループし実行する。(ステップS652)
次に、putflagとuniqflagに"0"を設定する(ステップS611)。尚、putflagは、プライマリーまたはユニークインデックス作成SQL文を出力したか判定するフラグであり、uniqflagは、プライマリーまたはユニークインデックスを作成する項目があるか判定するフラグである。
当該項目にKEYが定義されているかチェックし、定義されていた場合、uniqflagを"1"にする(ステップS612,S613)。この処理を、項目があるだけループし実行する(ステップS653)。
次に、uniqflagをチェックする(ステップS614)。uniqflagが"1"の場合、プライマリーまたはユニークインデックス作成SQL文作成処理を実行する(ステップS654)。
プライマリーまたはユニークインデックス作成SQL文作成処理では、まず当該項目にKEYが定義されているかチェックする(ステップS615)。KEYが設定されている場合、putflagをチェックする処理(ステップS616)を実行する(ステップS615)。
putflagが"0"の場合、プライマリーインデックス作成の場合かチェックし(ステップS617)、putflagが"1"の場合、","をインデックス作成SQL文502に出力し(ステップS625)た後にステップS625の処理に移行する。
ステップS617のチェック結果がプライマリーインデックス作成の場合、プライマリーインデックス作成SQL文をインデックス作成SQL文502に出力する(ステップS619)。
ステップS617のチェック結果がプライマリーインデックス作成でない場合、ユニークインデックス作成SQL文をインデックス作成SQL文502に出力する(ステップS622)。
その後、プライマリーまたはユニークインデックス作成SQL文出力後、putflagに"1"を設定し(ステップS627)l、当該項目名をインデックス作成SQL文502に出力する(ステップS629)。
ステップS615からステップS629までの処理を項目があるだけループし実行する(ステップS654)。
このようなプライマリーまたはユニークインデックス作成SQL文の作成処理後、インデックスを格納する表領域のパラメータをインデックス作成SQL文502に出力する(ステップS633)。
そして、プライマリー・ユニークインデックス作成処理後、以下のインデックス作成SQL文作成処理(ループ)を実行する(ステップS655)。
まず、当該項目のINDEXの定義をチェックする(ステップS638,S639,S640,S643)。
INDEXの定義がない場合、何も実行しない(ステップS638)。INDEXの定義が"B"の場合、ビットマップインデックス作成SQL文とインデックスを格納する表領域のパラメータをインデックス作成SQL文502に出力する(ステップS639,S640)。
INDEXの定義が"I"の場合、BTREEインデックス作成SQL文とインデックスを格納する表領域のパラメータをインデックス作成SQL文502に出力する(ステップS641,S642)。
そして、INDEXの定義が"D"の場合、まず、Oracle Text作成SQL文をインデックス作成SQL文502に出力し(ステップS643,S644)、さらに、#IMTレクサー、#IMTセクショングループ、#IMTストレージのそれぞれが定義されているか否かを判別する(ステップS645,S647,S649)。
#IMTレクサーが定義されている場合(ステップS645)、定義されたレクサーをインデックス作成SQL文502に出力する(ステップS646)。
#IMTセクショングループが定義されている場合(ステップS647)、定義されたセクショングループをインデックス作成SQL文502に出力する(ステップS648)。
#IMTストレージが定義されている場合(ステップS649)、定義されたストレージをインデックス作成SQL文502に出力する(ステップS650)。
上記ステップS638〜S650の処理を項目があるだけループし実行する(ステップS655)。
最後に、テーブルを分析するSQL文とSQLPLUSを終了する命令文をインデックス作成SQL文502に出力する(ステップS651)。
このインデックス作成SQL文作成処理部402の処理結果として、図18A,Bに詳細を示すインデックス作成SQL文502が生成される。尚、図18Aにおいては、インデックス作成SQL文のサンプル1801を示し、図18Bにおいては、インデックス作成SQL文の内容説明1802を示している。
次に、図7A,Bを参照してインデックス削除SQL文作成処理部403の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてインデックス削除SQL文503を作成する処理である。図19A,Bがインデックス削除SQL文の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS701)。
次に、SQLエラーが発生しても後続処理を実行させる命令文をインデックス削除SQL文503に出力する(ステップS702)。
次にputflagに"0"、uniqflagに"1"を設定する(ステップS720)。尚、putflagは、プライマリーまたはユニークインデックス作成SQL文を出力したか判定するフラグであり、uniqflagは、プライマリーまたはユニークインデックスを作成する項目があるか判定するフラグである。
当該項目にKEYが定義されているかチェックする(ステップS719)。定義されている場合、uniqflagを"0"にする(ステップS703)。この処理を項目があるだけループし実行する(ステップS719)。
次に、インデックス削除および制約無効SQL文作成処理(ループ)を実行する(ステップS721)。
putflagが"0"且つuniqflagが"0"且つ当該項目にKEYが設定されているか否かを判別する(ステップS705)。
putflagが"0"且つuniqflagが"0"且つ当該項目にKEYが設定されていなけば、ステップS710の処理に移るが、設定されている場合には、プライマリーインデックス削除SQL文作成またはユニークインデックス削除SQL文作成のいずれであるかを判別する(ステップS706)。
プライマリーインデックス作成の場合、プライマリーインデックス削除SQL文をインデクス削除SQL文503に出力する(ステップS707)。プライマリーインデックス作成でない場合、ユニークインデックス削除SQL文をインデクス削除SQL文503に出力する(ステップS708)。
そして、プライマリーまたはユニークインデックス削除SQL文を出力後、putflagに"1"を設定する(ステップS709)。
その後、当該項目にINDEXが定義されているかチェックする(ステップS710)。定義されていなければステップS714の処理に移り、定義されていれば、INDEXの定義が"B"または"I"であるか、あるいはそれ以外であるか判別する(ステップS711)。
INDEXの定義が"B"または"I"の場合、インデックスを削除するSQL文をインデクス削除SQL文503に出力する(ステップS712)。INDEXの定義が"B"または"I"以外の場合、Oracle Textを削除するSQL文をインデクス削除SQL文503に出力する(ステップS713)。
次に、当該項目にNOT NULL制約が定義されているか否かをチェックする(ステップS714)。NOT NULL制約が定義されている場合、NOT NULL制約を無効にするSQL文をインデクス削除SQL文503に出力する(ステップS715)。
以上のステップS705〜S715の処理を項目があるだけループし実行する(ステップS721)。
そして最後に、SQLPLUSを終了する命令文をインデクス削除SQL文503に出力する(ステップS716)。
このインデックス削除SQL文作成処理部403の処理結果として、図19A,Bに詳細を示すインデックス削除SQL文503が生成される。尚、図19Aにおいては、インデックス削除SQL文のサンプル1901を示し、図19Bにおいては、インデックス削除SQL文の内容説明1902を示している。
次に、図8A,Bを参照してコピーテーブル作成SQL文作成処理部404の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてコピーテーブル作成SQL文504を作成する処理である。図20A,Bがコピーテーブル作成SQL文の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS802)。
次に、SQLエラーが発生しても後続処理を実行させる命令文、SQL処理時間を出力させる命令文、コピーテーブルを作成するSQL文を、コピーテーブル作成SQL文504に出力する(ステップS804)。
また、コピーテーブルを格納する表領域のパラメータをコピーテーブル作成SQL文504に出力する(ステップS819)。
次にputflagとuniqflagに"0"を設定する(ステップS811)。尚、putflagは、プライマリーまたはユニークインデックス作成SQL文を出力したか判定するフラグであり、uniqflagは、プライマリーまたはユニークインデックスを作成する項目があるか判定するフラグである。
そして、当該項目にKEYが定義されているか否かをチェックし(ステップS812)、定義されていた場合、uniqflagを"1"にする(ステップS813)処理を、項目があるだけループし実行する(ステップS853)。
次にuniqflagをチェックする(ステップS814)。uniqflagが"1"の場合、プライマリーまたはユニークインデックス作成SQL文作成処理(ループ)を実行する(ステップS854)。
このプライマリーまたはユニークインデックス作成SQL文作成処理では、まず当該項目にKEYが定義されているか否かをチェックする(ステップS815)。
KEYが設定されていなければ何もせず、KEYが設定されている場合、putflagをチェックする処理を実行する(ステップS816)。
putflagが"1"の場合、","をコピーテーブル作成SQL文504に出力し(ステップS825)た後、ステップS827の処理に移行する。
putflagが"0"の場合、プライマリーインデックス作成の場合かチェックする(ステップS817)。
プライマリーインデックス作成の場合、プライマリーインデックス作成SQL文をコピーテーブル作成SQL文504に出力する(ステップS819)。
プライマリーインデックス作成でない場合、ユニークインデックス作成SQL文をコピーテーブル作成SQL文504に出力する(ステップS822)。
プライマリーまたはユニークインデックス作成SQL文出力後、putflagに"1"を設定する(ステップS827)。
その後、当該項目名をコピーテーブル作成SQL文504に出力し(ステップS829)、ステップS815の処理に戻り、以降、項目があるだけループし実行する(ステップS854)。
このプライマリーまたはユニークインデックス作成SQL文作成処理ループの後、インデックスを格納する表領域のパラメータをコピーテーブル作成SQL文504に出力する(ステップS833)。
そして、このプライマリー・ユニークインデックス作成処理後、さらに、インデックス作成SQL文作成処理(ループ)を実行する(ステップS855)。
まず、当該項目のINDEXの定義をチェックする(ステップS838,S839,S840,S843)。INDEXの定義がない場合、何も実行せずループ処理を終了する。
INDEXの定義が"B"の場合(ステップS839)、ビットマップインデックス作成SQL文とインデックスを格納する表領域のパラメータをコピーテーブル作成SQL文504に出力する(ステップS840)。
INDEXの定義が"I"の場合(ステップS841)、BTREEインデックス作成SQL文とインデックスを格納する表領域のパラメータをコピーテーブル作成SQL文504に出力する(ステップS842)。
INDEXの定義が"D"の場合(ステップS843)、Oracle Text作成SQL文をコピーテーブル作成SQL文504に出力し(ステップS844)、さらに、#IMTレクサー、#IMTセクショングループ、#IMTストレージのそれぞれが定義されているか否かを判別チェックする(ステップS845,S847,S849)。
#IMTレクサーが定義されている場合(ステップS845)、定義されたレクサーをコピーテーブル作成SQL文504に出力する(ステップS846)。
#IMTセクショングループが定義されている場合(ステップS847)、定義されたセクショングループをコピーテーブル作成SQL文504に出力する(ステップS848)。
#IMTストレージが定義されている場合(ステップS849)、定義されたストレージをコピーテーブル作成SQL文504に出力する(ステップS850)。
以上のステップS838〜S850の処理を項目があるだけループし実行(ステップS855)した後、最後に、テーブルを分析するSQL文とSQLPLUSを終了する命令文をコピーテーブル作成SQL文504に出力する(ステップS851)。
このコピーテーブル作成SQL文作成処理部404の処理結果として、図20A,Bに詳細を示すコピーテーブル作成SQL文504が生成される。尚、図20Aにおいては、コピーテーブル作成SQL文のサンプル2001を示し、図20Bにおいては、コピーテーブル作成SQL文の内容説明2002を示している。
次に、図9A,Bを参照してテーブルリネームSQL文作成処理部405の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてテーブルリネームSQL文505を作成する処理である。図21がテーブルリネームSQL文の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS901)。
SQLエラーが発生した時点でロールバックを行い、リターンコード「1」を戻してSQLPLUSを終了する命令文を、テーブルリネームSQL文505に出力する(ステップS902)。
次にuniqflagを"1"に設定する(ステップS903)。尚、uniqflagは、プライマリーまたはユニークインデックスを作成する項目があるか判定するフラグである。
次に、以下のステップS904,S905の処理を項目があるだけループし実行する(ステップS920)。すなわち、当該項目にKEYが定義されているかチェックし(ステップS904)、定義されていた場合、uniqflagを"1"にする(ステップS905)。
その後、uniqflagをチェックする(ステップS906)。uniqflagが"1"の場合、プライマリーまたはユニークインデックスリネームSQL文作成処理を項目が無くなるまでループ実行する(ステップS921)。
このプライマリーまたはユニークインデックスリネームSQL文作成のループ処理では、まず当該項目にKEYが定義されているか否かをチェックする(ステップS907)。
KEYが設定されていなければ次の項目の処理に移り、KEYが設定されている場合、プライマリーインデックス作成の場合か否かをチェックする(ステップS908)。
プライマリーインデックス作成の場合、正のプライマリーインデックスを別名にリネームするSQL文とコピーテーブルのプライマリーインデックスを正のプライマリーインデックス名にリネームするSQL文を、テーブルリネームSQL文505に出力する(ステップS909)。
プライマリーインデックス作成でない場合、正のユニークインデックスを別名にリネームするSQL文とコピーテーブルのユニークインデックスを正のユニークインデックス名にリネームするSQL文を、テーブルリネームSQL文505に出力する(ステップS910)。
この処理を項目があるだけループし実行する(ステップS921)。但し、プライマリーまたはユニークインデックスをリネームするSQL文出力後、このループを終了する(ステップS911)。
以上のプライマリーまたはユニークインデックスリネームSQL文作成処理の後、次のインデックスリネームSQL文作成処理を、項目があるだけループして実行する(ステップS922)。
まず、当該項目のINDEXの定義をチェックする(ステップS912,S913,S915)。
INDEXの定義が"B"または"I"の場合(ステップS913)、正のインデックスを別名にリネームするSQL文とコピーテーブルのインデックスを正のインデックスにリネームするSQL文を、テーブルリネームSQL文505に出力する(ステップS914)。
INDEXの定義が"D"の場合(ステップS915)、正のOracle Textを別名にリネームするSQL文とコピーテーブルのOracle Textを正のOracle Text名にリネームするSQLを、テーブルリネームSQL文505に出力する(ステップS916)。
この処理を項目があるだけループし実行する(ステップS922)。
このループ処理によるインデックスリネームSQL文作成後、正のテーブルを別名にリネームするSQL文とコピーテーブルを正のテーブル名にリネームするSQL文を、テーブルリネームSQL文505に出力する(ステップS917)。
そして最後に、SQLPLUSを終了する命令文をテーブルリネームSQL文505に出力する(ステップS918)
このテーブルリネームSQL文作成処理部405の処理結果として、図21に詳細を示すテーブルリネーム作成SQL文505が生成される。尚、図21においては、テーブルリネームSQL文のサンプル2101と、その内容説明2102を示している。
次に、図10を参照して、旧テーブル削除SQL文作成処理部406の処理動作について説明する。これは、データベース設計書CSV303の情報を基にして旧テーブル削除SQL文506を作成する処理である。図22が旧テーブル削除SQL文506の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS1001)。
次に、SQLエラーが発生した時点でロールバックを行い、リターンコード「1」を戻してSQLPLUSを終了する命令文を、旧テーブル削除SQL文506に出力する(ステップS1002)。
次に、旧テーブルを削除するSQL文を、旧テーブル削除SQL文506に出力する(ステップS1003)。
最後に、SQLPLUSを終了する命令文"EXIT"を、テーブルリネームSQL文505に出力する(ステップS918)
この旧テーブル削除SQL文作成処理部406の処理結果として、図22に詳細を示す旧テーブル削除SQL文506が生成される。尚、図22においては、旧テーブル削除SQL文のサンプル2201と、その内容説明2202を示している。
次に図11を参照してSQL*Loader用制御文作成処理部407の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてSQL*Loader用制御文507を作成する処理である。図23がSQL*Loader用制御文507の詳細構成である。
まず、データベース設計書CSV303の情報を読み込む(ステップS1101)。
次に、SQL*LOADER用制御パラメータをSQL*LOADER用制御文507に出力する(ステップS1102)。
次に、cntに"1"を設定する。これは、レコード内の当該項目の開始位置を示す。
次に、SQL*LOADER用制御文作成処理を、項目がなくなるまでループ処理として実行する(ステップS1115)。
まず、当該項目の型をチェックする(ステップS1104,S1106,S1108)。
型が"0"または"9"の場合(ステップS1104)、typeに"DECIMAL EXTERNAL"、lenに桁を設定し、SQL*LOADER用制御文507に出力する(ステップS1105)。
型が"X"の場合(ステップS1106)、typeに"CHAR"、lenに桁を設定し、SQL*LOADER用制御文507に出力する(ステップS1107)。
型が"K"の場合(ステップS1108)、typeに"CHAR"、lenに桁を2倍した値を設定し、SQL*LOADER用制御文507に出力する(ステップS1109)。
尚、typeは、SQL*Loaderで使用する項目の型が設定される。また、lenは、項目のバイト数が設定される。
typeとlenに値を設定後、当該項目をローディングするSQL*Loader制御文を、SQL*LOADER用制御文507に出力する(ステップS1110)。
次に、まだ項目があるかチェックする(ステップS1111)。
まだ次の項目がある場合、","をSQL*LOADER用制御文507に出力し(ステップS1111)、なければそのまま、cntにlenを加算する(ステップS1113)。
以上のステップS1104〜S1113の処理を、項目があるだけループし実行した後(ステップS1115)、最後に、")"をSQL*LOADER用制御文507に出力する(ステップS1114)。
このSQL*LOADER用制御文作成処理部407の処理結果として、図23に詳細を示すSQL*LOADER用制御文507が生成される。尚、図23においては、SQL*LOADER用制御文のサンプル2301と、その内容説明2302を示している。
次に、図12A,Bを参照して、テーブル引上げSQL文作成処理部408の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてテーブル引上げSQL文508を作成する処理である。図24A,Bに、テーブル引上げSQL文508の詳細構成を示す。
まず、データベース設計書CSV303の桁をサマリして、1レコードのバイト数を取得する(ステップS1201)。
次に、SQLエラーが発生した時点でロールバックを行いSQL*Plusはリターンコード「1」を戻して終了させる命令文、1行に表示する文字数を指定するSQLPLUSコマンド、レポートへの列ヘッダーを非出力に指定するSQLPLUSコマンド、出力レコード数を非出力に指定するSQLPLUSコマンド、各ページの行数を指定するSQLPLUSコマンド、スクリプトから実行したコマンドを非表示に指定するSQPLUSコマンド、列の間の文字を非出力する指定するSQLPLUSコマンド、ファイルへ出力を開始する命令文を、テーブル引上げSQL文508に出力する(ステップS1202)。
次に、データベース設計書CSV303の情報を読み込み(ステップS1206)、以下のデータ出力書式設定処理を、項目があるだけループ実行する(ステップS1215)。
まず、当該項目の型をチェックする(ステップS1203,S1205)。
型が"X"または"0"または"9"の場合(ステップS1203)、列の出力書式文("COL A"桁 "FOR A"桁)をテーブル引上げSQL文508に出力する(ステップS1204)。
型が"K"の場合(ステップS1205)、列の出力書式文("COL A"桁*2 "FOR A"桁*2)をテーブル引上げSQL文508に出力する(ステップS1206)。
以上の処理を項目があるだけループし実行した後(ステップS1215)、次に、データ出力命令文"SELECT"をテーブル引上げSQL文508に出力する(ステップS1207)。
さらに、データベース設計書CSV303の情報を読み込み(ステップS1218)、以下のテーブル引上げSQL文作成処理を、項目がなくなるまでループ実行する(ステップS1217)。
まず、当該項目の型をチェックする(ステップS1208,S1210,S1212)。
型が"0"または"9"の場合(ステップS1208)、数値型の項目出力文をテーブル引上げSQL文508に出力する(ステップS1209)。
型が"X"の場合(ステップS1210)、VERCHAR型の項目出力文をテーブル引上げSQL文508に出力する(ステップS1211)。
型が"K"の場合(ステップS1212)、NVERCHAR型の項目出力文をテーブル引上げSQL文508に出力する(ステップS1213)。
以上の処理を項目があるだけループし実行した後(ステップS1217)、最後に、抽出対象テーブル、ファイルへの出力を終了する命令文、実行したコマンドを表示する命令文、SQLPLUSを終了する命令文を、テーブル引上げSQL文508に出力する(ステップS1214)。
このテーブル引上げSQL文作成処理部408の処理結果として、図24に詳細を示すテーブル引上げSQL文508が生成される。尚、図24Aにおいては、テーブル引上げSQL文のサンプル2401を示し、図24Bにおいては、その内容説明2402を示している。
次に、図25を用いて、以上の図2〜図12Bで示した各処理で作成した各SQL文を用いたデータベース作成の流れを説明する。図25においては、バッチ処理サーバ2501およびWEBサーバ2508のそれぞれのコンピュータ上での各SQL文の処理概要を示している。
まず、バッチ処理サーバ2501において、テーブル作成SQL文501で、データを格納する表であるサンプルテーブル2503を作成する(ステップS2501)。
次に、SQL*Loader用制御文(図中「SQL*Loader用制御ファイル」と記載)507で、データベース設計書101に定義されている固定長のデータである入力ファイル2502を、サンプルテーブル2503にローディングする(ステップS2502)。
さらに、インデックス作成SQL文502で、サンプルテーブル2503に、インデックス作成、NOT NULL制約作成、テーブルの分析を行い(ステップS2503)、インデックス削除SQL文503で、サンプルテーブル2503からインデックス削除、NOT NULL制約削除を行う(ステップS2504)。
そして、コピーテーブル作成SQL文504で、バッチ処理サーバ2501のサンプルテーブル2503を、WEBサーバ2508にコピーして、コピーサンプルテーブル2505を生成する(ステップS2507)。
WEBサーバ2508においては、まず、コピーサンプルテーブル2505を、テーブルリネームSQL文505で、正のテーブルとしてのサンプルテーブル2506にリネームする(ステップS2508)。
さらに、WEBサーバ2508では、テーブルリネームSQL文505で、正のテーブルとしてのサンプルテーブル2506を別名、すなわち、旧サンプルテーブル2507にリネームする(ステップS2509)。
また、旧テーブル削除SQL文506で、別名にリネームした旧サンプルテーブル2507を削除する(ステップS2510)。
一方、バッチ処理サーバ2501においては、テーブル引上げSQL文508で、サンプルテーブル2503のバックアップファイル2504を作成する(ステップS2505)。尚、このバックアップファイル2504は、データベース設計書101に定義されている固定長のデータである。
また、SQL*Loader用制御ファイル507で、バックアップファイル2504をサンプルテーブル2503にローディングすることができる(ステップS2506)。
以上のようにして、本例のデータベース構築支援システムでは、プログラムされたコンピュータによって、データベース設計書101の情報を基に、データベースを構築する上で必要となる、テーブル定義のドキュメントと共に、データベースにおけるテーブル作成SQL文、テーブルにデータをローディングするSQL*Loader制御文、テーブルバックアップ取得SQL文、テーブル本番環境移行SQL文、さらにテーブル定義のドキュメントを自動で生成することができる。
次に、図26A,Bを参照してDBアクセスモジュール作成処理部409の処理動作について説明する。これは、データベース設計書CSV303の情報を基にして、DBアクセスモジュール509を作成する処理である。
まず、データベース設計書CSV303の情報を読み込む(ステップS2601)。
次に、変数および宣言文をDBアクセスモジュール509に出力する(ステップS2602,S2603)。
次に、データベース設計書CSV303の情報に基づいて、ホスト変数(EXEC SQL BEGIN DECLARE, SECTION;, VARCHAR句)をDBアクセスモジュール509に出力する(ステップS2604)。
次に、データベース設計書CSV303の情報に基づいて、テーブルを検索するSQL文(複数レコード抽出用)を、DBアクセスモジュール509に出力する(ステップS2605)。ここでは、SELECT句は項目名、FROM句はテーブル名、WHERE句とORDER BY句は、CGIプログラムから引数として取得する変数名を出力する。
次に、SQL解析文(EXEC SQL PREPARE xxx FROM xxx:)をDBアクセスモジュール509に出力する(ステップS2606)。
次に、解析後のSQL文をカーソルにバインドする文(EXEC SQL DECLARE xxx CURSOR)をDBアクセスモジュール509に出力する(ステップS2607)。
次に、カーソルオープン処理文(EXEC SQL OPEN xxx;)をDBアクセスモジュール509に出力する(ステップS2608)。
次に、フェッチ処理文(EXEC SQL FETCH xxx INTOxxx;)をDBアクセスモジュール509に出力する(ステップS2609)。
次に、カーソルクローズ処理文(EXEC SQL CLOSE xxx;)をDBアクセスモジュール509に出力する(ステップS2610)。
次に、データベース設計書CSV303に基づいて,テーブルを検索するSQL文(単一レコード抽出用、EXEC SQL SELECT xxx INTO xxx FROM xxx WHERE xxx)をDBアクセスモジュール509に出力する(ステップS2611)。尚、SELECT句は項目名、FROM句はテーブル名、WHERE句はテーブルのプライマリーキー項目を出力する。
次に、引数チェック処理文をDBアクセスモジュール509に出力する(ステップS2612)。
このDBアクセスモジュール作成処理部409の処理結果として、以下にサンプルとして示すDBアクセスモジュールが生成される。尚、図28においては、このように生成されたDBアクセスモジュールのサンプルの内容説明2801を示している。
DBアクセスモジュールのサンプル
行番号 サンプルデータ
1 #ifndef WIN32
2 #define NOT_DLL
3 #endif
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <ctype.h>
7 #include <string.h>
8 #ifndef WIN32
9 #include <unistd.h>
10 #endif
11
12 #include <sqlca.h>
13
14 #include <oraca.h>
15
16 EXEC ORACLE OPTION (ORACA=YES);
17
18 EXEC ORACLE OPTION (RELEASE_CURSOR=YES);
19
20 #ifndef NOT_DLL
21 #define DllImport _declspec(dllimport)
22 #define DllExport _declspec(dllexport)
23 #endif
24
25 #define FETCH_BU 50/* フェッチバッファ配列数 */
26 #define REC_NOT_(1403L)
27
28 extern lget_count(char *table,char *joken,int jokenlen,char *hint);
29 extern ichk_space(char *buf);
30 extern vpadding_copy(char *dbuf,char *sbuf,short max,char type);
31 extern vset_hint(char *hint);
32 extern vSAMPLE1_select(char *errbuf,char *keybuf1,char *databuf);
33 static lSAMPLE1_datafetch(void);
34 static vrectobuf(char *databuf,int reccnt);
35 static icheck_key(char *wherebuf,char *keybuf1);
36 static lfetch_rows; /* フェッチ行 */
37 static sfetch_cn/* フェッチ数 */
38 static lmax_cnt;
39 static cend_flag;
40 static iselectflag;
41 static iselfetflag;
42 static ckeybuf1[1024];
43 extern c*hintptr; /* ヒント格納ポインタ */
44
45 EXEC SQL BEGIN DECLARE SECTION;
46 /* フェッチ用構造体 */
47 static struct fetch_rec {
48 VARCcolumn1[11]; /* KEY部 */
49 VARCcolumn2[21]; /* DATA部 */
50 } rec[FETCH_BUFFER_COUNT];
51
52 /* フェッチ用指標変数構造体 */
53 static struct fetch_ind {
54 shorcolumn1; /* KEY部 */
55 shorcolumn2; /* DATA部 */
56 } rec_ind[FETCH_BUFFER_COUNT];
57 static VARCHAR key1[11];
58 EXEC SQL END DECLARE SECTION;
59 static cselbuf[30];
60
61 /*
62 * SAMPLE1_open : サンプルテーブル1オープン
63 */
64 #ifndef NOT_DLL
65 DllExport
66 #endif
67 void SAMPLE1_open(char *errbuf,char *wherebuf,char *orderbuf,char
*count)
68 {
69 EXEC SQL BEGIN DECLARE SECTION;
70 VARCbuf[16384]; /* SQLバッファ */
71 EXEC SQL END DECLARE SECTION;
72 chartmpbuf[16384];
73 longerrcode;
74 longcnt;
75 char*wherep;
76 int wherelen;
77 char*p;
78 int i;
79
80 if(check_key(wherebuf,keybuf1)) {
81 SAMPLE1_select(errbuf,keybuf1,selbuf);
82 strncpy(tmpbuf,errbuf,5);
83 tmpbuf[5] = '\0';
84 errcode = atoi(tmpbuf);
85 if(errcode == 0) {
86 strncpy(count,"0000001",7);
87 }
88 selectflag = 1;
89 if(errcode == 1403) {
90 strncpy(count,"0000000",7);
91 strncpy(errbuf,"00000",5);
92 selfetflag = 1;
93 }
94 else {
95 selfetflag = 0;
96 }
97 return;
98 }
99
100 /* SQL文作成 */
101 strcpy((char *)buf.arr,"SELECT ");
102 if(hintptr != (char *)NULL) {
103 strcat((char *)buf.arr,hintptr);
104 strcat((char *)buf.arr," ");
105 }
106 strcat((char *)buf.arr,"KEY部,");
107 strcat((char *)buf.arr,"DATA部 ");
108 strcat((char *)buf.arr,"FROM サンプルテーブル1");
109 buf.len = strlen((char *)buf.arr);
110
111 /* 検索条件付加 */
112 if(chk_space(wherebuf)) {
113 strcat((char *)buf.arr," WHERE ");
114 buf.len = strlen((char *)buf.arr);
115 p = &(wherebuf[7999]);
116 while(*p == ' ' || *p == 0) {
117 p--;
118 }
119 wherelen = p-wherebuf+1;
120 memcpy(&(buf.arr[buf.len]),wherebuf,wherelen);
121 buf.len += wherelen;
122 buf.arr[buf.len] = '\0';
123 wherep = wherebuf;
124 }
125 else {
126 wherelen = 0;
127 wherep = (char *)NULL;
128 }
129
130 /* ソート条件付加 */
131 if(chk_space(orderbuf)) {
132 strcpy(tmpbuf," ORDER BY ");
133 strcat(tmpbuf,orderbuf);
134 memcpy((char *)&(buf.arr[buf.len]),tmpbuf,strlen(tmpbuf));
135 buf.len += strlen(tmpbuf);
136 buf.arr[buf.len] = '\0';
137 }
138
139 /* エラーが発生しても継続 */
140 EXEC SQL WHENEVER SQLERROR CONTINUE;
141
142 /* SQL文解析 */
143 EXEC SQL PREPARE S_SAMPLE1 FROM :buf;
144
145 /* SQL文をカーソルにバインド */
146 if (sqlca.sqlcode == 0) {
147 EXEC SQL DECLARE c_SAMPLE1 CURSOR FOR S_SAMPLE1;
148 }
149
150 /* カーソルオープン */
151 if (sqlca.sqlcode == 0) {
152 EXEC SQL OPEN c_SAMPLE1;
153 }
154
155 if (sqlca.sqlcode == 0) {
156 cnt = get_count("サンプルテーブル1",wherep,wherelen,hintptr);
157 hintptr = (char *)NULL;
158
159 /* エラー発生 */
160 if (cnt < 0) {
161 sqlca.sqlcode = cnt;
162 }
163 else {
164 /* 返却用件数作成 */
165 sprintf(tmpbuf,"%07d",cnt);
166 strncpy(count,tmpbuf,7);
167 }
168 }
169
170 fetch_rows = 0; /* フェッチ行数のクリア */
171 fetch_cnt = FETCH_BUFFER_COUNT;
172 end_flag = 0;
173
174 errcode = abs(sqlca.sqlcode);
175 /* エラーコードが5桁以上 */
176 if (errcode >= 100000L) {
177 errcode = 99999L;
178 }
179
180 /* 返却用エラーコード作成 */
181 sprintf(tmpbuf,"%05d",errcode);
182 strncpy(errbuf,tmpbuf,5);
183
184 return;
185 }
186
187 static long SAMPLE1_datafetch(void)
188 {
189 longerrcode;
190
191 if(fetch_cnt >= FETCH_BUFFER_COUNT) {
192 /* エラーが発生したらジャンプ */
193 EXEC SQL WHENEVER SQLERROR GOTO errexit;
194
195 /* NOT FOUNDは継続 */
196 EXEC SQL WHENEVER NOT FOUND CONTINUE;
197
198 EXEC SQL FETCH c_SAMPLE1
199 INTO :rec INDICATOR :rec_ind;
200
201 /* フェッチ数クリア */
202 fetch_cnt = 0;
203 /* フェッチでデータを取得した場合 */
204 if (fetch_rows < sqlca.sqlerrd[2]) {
205 max_cnt = sqlca.sqlerrd[2] - fetch_rows;
206 /* フェッチ行更新 */
207 fetch_rows = sqlca.sqlerrd[2];
208 if (sqlca.sqlcode == REC_NOT_FOUND) {
209 end_flag = 1;
210 }
211 }
212 }
213
214 errexit:
215 errcode = abs(sqlca.sqlcode);
216
217 return errcode;
218 }
219
220 /*
221 * SAMPLE1_fetch : サンプルテーブル1フェッチ
222 */
223 #ifndef NOT_DLL
224 DllExport
225 #endif
226 void SAMPLE1_fetch(char *errbuf,char *databuf)
227 {
228 longerrcode;
229 chartmpbuf[6];
230
231 /* 入力バッファチェック */
232 if(databuf == (char *)NULL) {
233 return;
234 }
235
236 if(selectflag) {
237 if(selfetflag) {
238 strncpy(errbuf,"01403",5);
239 }
240 else {
241 strncpy(databuf,selbuf,30);
242 strncpy(errbuf,"01403",5);
243 selfetflag = 1;
244 }
245 return;
246 }
247
248 sqlca.sqlcode = (0L);
249
250 /* フェッチ */
251 if((errcode = SAMPLE1_datafetch()) < 0) {
252 if (errc/* エラーコードが5桁以上 */
253 errcode = 99999L;
254 }
255
256 sprintf(tmpbuf,"%05d",errcode);
257 memcpy(errbuf,tmpbuf,5);
258
259 return;
260 }
261
262 if (!end_flag || ((long)fetch_cnt < max_cnt)) {
263 rectobuf(databuf,fetch_cnt);
264 }
265
266 fetch_cnt++;
267
268 if(!end_flag) {
269 errcode = SAMPLE1_datafetch();
270 }
271
272 if (end_flag) {
273 if ((long)fetch_cnt < max_cnt) {
274 errcode = (0L);
275 }
276 else {
277 errcode = REC_NOT_FOUND;
278 }
279 }
280
281 if (/* エラーコードが5桁以上 */
282 errcode = 99999L;
283 }
284
285 sprintf(tmpbuf,"%05d",errcode);
286 strncpy(errbuf,tmpbuf,5);
287
288 return;
289 }
290
291 /*
292 * SAMPLE1_close : サンプルテーブル1クローズ
293 */
294 #ifndef NOT_DLL
295 DllExport
296 #endif
297 void SAMPLE1_close(void)
298 {
299 if(selectflag) {
300 selectflag = 0;
301 selfetflag = 0;
302 return;
303 }
304
305 EXEC SQL WHENEVER SQLERROR CONTINUE;
306 EXEC SQL CLOSE c_SAMPLE1;
307
308
309 static void rectobuf(char *databuf,int reccnt)
310 {
311 char*datap;
312
313 datap = databuf;
314
315 /* KEY部 */
316 if(rec_ind[reccnt].column1 == (short)-1) {
317 rec[reccnt].column1.len = 0;
318 }
319 rec[reccnt].column1.arr[rec[reccnt].column1.len] = '\0';
320 padding_copy(datap,(char *)rec[reccnt].column1.arr,10,'X');
321 datap += 10;
322
323 /* DATA部 */
324 if(rec_ind[reccnt].column2 == (short)-1) {
325 rec[reccnt].column2.len = 0;
326 }
327 rec[reccnt].column2.arr[rec[reccnt].column2.len] = '\0';
328 padding_copy(datap,(char *)rec[reccnt].column2.arr,20,'X');
329 datap += 20;
330
331 return;
332 }
333
334 /*
335 * SAMPLE1_select : サンプルテーブル1セレクト
336 */
337 #ifndef NOT_DLL
338 DllExport
339 #endif
340 void SAMPLE1_select(char *errbuf,char *keybuf1,char *databuf)
341 {
342 char*datap;
343 chartmpbuf[6];
344 longerrcode;
345
346 /* 入力バッファチェック */
347 if(databuf == (char *)NULL) {
348 return;
349 }
350
351 datap = databuf;
352
353 memset(key1.arr,0,sizeof(key1.arr));
354 strncpy((char *)key1.arr,keybuf1,10);
355 key1.len = strlen((char *)key1.arr);
356
357 /* エラーが発生したらジャンプ */
358 EXEC SQL WHENEVER SQLERROR GOTO errexit;
359 EXEC SQL WHENEVER NOT FOUND GOTO errexit;
360
361 /* SQL文実行 */
362 EXEC SQL
363 SELECT
364 KEY部,
365 DATA部
366 INTO
367 :rec[0]
368 INDICATOR
369 :rec_ind[0]
370 FROM
371 サンプルテーブル1
372 WHERE
373 KEY部 = :key1;
374
375 rectobuf(databuf,0);
376
377 errexit:
378 errcode = abs(sqlca.sqlcode);
379
380 if (/* エラーコードが5桁以上 */
381 errcode = 99999L;
382 }
383
384
385 static int check_key(char *wherebuf,char *keybuf1)
386 {
387 char*inptr;
388 char*datap;
389 char*ptr;
390 int cnt;
391 int substrflag;
392 int keyflag1;
393
394 inptr = wherebuf;
395 substrflag = 0;
396 keyflag1 = 0;
397
398 /* 先頭のスペース読み飛ばし */
399 while(isspace(*inptr)) {
400 inptr++;
401 }
402
403 /* 全角文字チェック */
404 if(!(*inptr & 0x80)) {
405 return 0;
406 }
407
408 for (cnt=0;cnt<1;cnt++) {
409 /* トークン間のスペース読み飛ばし */
410 while(isspace(*inptr)) {
411 inptr++;
412 }
413
414 /* SUBSTR読み飛ばし処理 */
415 if(!strncmp(inptr,"SUBSTR",6) || !strncmp(inptr,"substr",6)) {
416 inptr += 6;
417 substrflag = 1;
418 /* '(' or スペース読み飛ばし */
419 while(isspace(*inptr) || *inptr == '(') {
420 inptr++;
421 }
422 }
423
424 if(!strncmp(inptr,"KEY部",8)) {
425 datap = keybuf1;
426 keyflag1 = 1;
427 inptr += 8;
428 }
429 else {
430 return 0;
431 }
432
433 /* SUBSTR読み飛ばし処理 */
434 if(substrflag) {
435 substrflag = 0;
436 /* ')'の位置検索 */
437 ptr = strchr(inptr,')');
438 if(ptr == (char *)NULL) {
439 return 0;
440 }
441 inptr = ptr + 1;
442 }
443
444 /* トークン間のスペース読み飛ばし */
445 while(isspace(*inptr)) {
446 inptr++;
447 }
448
449 /* =チェック */
450 if(*inptr != '=') {
451 return 0;
452 }
453 inptr++;
454
455 /* トークン間のスペース読み飛ばし */
456 while(isspace(*inptr)) {
457 inptr++;
458 }
459
460 if(*inptr =='\'') { /* シングルクォートの場合 */
461 /* シングルクォート読み飛ばし */
462 inptr++;
463
464 /* 対応するシングルクォートの位置検索 */
465 ptr = strchr(inptr,'\'');
466 if(ptr == (char *)NULL) {
467 return 0;
468 }
469
470 /* キー項目コピー */
471 strncpy(datap,inptr,ptr-inptr);
472 datap[ptr-inptr] = '\0';
473
474 inptr = ptr + 1;
475 }
476 else { /* 値の場合 */
477 /* スペースの位置検索 */
478 ptr = strchr(inptr,' ');
479 if(ptr == (char *)NULL) { /* NULLの場合 */
480 /* 文字列の最終位置をセット */
481 ptr = inptr + strlen(inptr);
482 }
483
484 /* キー項目コピー */
485 strncpy(datap,inptr,ptr-inptr);
486 datap[ptr-inptr] = '\0';
487
488 inptr = ptr;
489 }
490
491 /* トークン間のスペース読み飛ばし */
492 while(isspace(*inptr)) {
493 inptr++;
494 }
495
496 /* 検索条件終了チェック */
497 if(*inptr == '\0') {
498 break;
499 }
500
501 /* AND条件チェック */
502 if(strncmp(inptr,"AND",3) && strncmp(inptr,"and",3)) {
503 return 0;
504 }
505 inptr += 3;
506 }
507
508 if(keyflag1 && cnt < 1) {
509 return 1;
510 }
511
512 return 0;
513 }
行番号 サンプルデータ
1 #ifndef WIN32
2 #define NOT_DLL
3 #endif
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <ctype.h>
7 #include <string.h>
8 #ifndef WIN32
9 #include <unistd.h>
10 #endif
11
12 #include <sqlca.h>
13
14 #include <oraca.h>
15
16 EXEC ORACLE OPTION (ORACA=YES);
17
18 EXEC ORACLE OPTION (RELEASE_CURSOR=YES);
19
20 #ifndef NOT_DLL
21 #define DllImport _declspec(dllimport)
22 #define DllExport _declspec(dllexport)
23 #endif
24
25 #define FETCH_BU 50/* フェッチバッファ配列数 */
26 #define REC_NOT_(1403L)
27
28 extern lget_count(char *table,char *joken,int jokenlen,char *hint);
29 extern ichk_space(char *buf);
30 extern vpadding_copy(char *dbuf,char *sbuf,short max,char type);
31 extern vset_hint(char *hint);
32 extern vSAMPLE1_select(char *errbuf,char *keybuf1,char *databuf);
33 static lSAMPLE1_datafetch(void);
34 static vrectobuf(char *databuf,int reccnt);
35 static icheck_key(char *wherebuf,char *keybuf1);
36 static lfetch_rows; /* フェッチ行 */
37 static sfetch_cn/* フェッチ数 */
38 static lmax_cnt;
39 static cend_flag;
40 static iselectflag;
41 static iselfetflag;
42 static ckeybuf1[1024];
43 extern c*hintptr; /* ヒント格納ポインタ */
44
45 EXEC SQL BEGIN DECLARE SECTION;
46 /* フェッチ用構造体 */
47 static struct fetch_rec {
48 VARCcolumn1[11]; /* KEY部 */
49 VARCcolumn2[21]; /* DATA部 */
50 } rec[FETCH_BUFFER_COUNT];
51
52 /* フェッチ用指標変数構造体 */
53 static struct fetch_ind {
54 shorcolumn1; /* KEY部 */
55 shorcolumn2; /* DATA部 */
56 } rec_ind[FETCH_BUFFER_COUNT];
57 static VARCHAR key1[11];
58 EXEC SQL END DECLARE SECTION;
59 static cselbuf[30];
60
61 /*
62 * SAMPLE1_open : サンプルテーブル1オープン
63 */
64 #ifndef NOT_DLL
65 DllExport
66 #endif
67 void SAMPLE1_open(char *errbuf,char *wherebuf,char *orderbuf,char
*count)
68 {
69 EXEC SQL BEGIN DECLARE SECTION;
70 VARCbuf[16384]; /* SQLバッファ */
71 EXEC SQL END DECLARE SECTION;
72 chartmpbuf[16384];
73 longerrcode;
74 longcnt;
75 char*wherep;
76 int wherelen;
77 char*p;
78 int i;
79
80 if(check_key(wherebuf,keybuf1)) {
81 SAMPLE1_select(errbuf,keybuf1,selbuf);
82 strncpy(tmpbuf,errbuf,5);
83 tmpbuf[5] = '\0';
84 errcode = atoi(tmpbuf);
85 if(errcode == 0) {
86 strncpy(count,"0000001",7);
87 }
88 selectflag = 1;
89 if(errcode == 1403) {
90 strncpy(count,"0000000",7);
91 strncpy(errbuf,"00000",5);
92 selfetflag = 1;
93 }
94 else {
95 selfetflag = 0;
96 }
97 return;
98 }
99
100 /* SQL文作成 */
101 strcpy((char *)buf.arr,"SELECT ");
102 if(hintptr != (char *)NULL) {
103 strcat((char *)buf.arr,hintptr);
104 strcat((char *)buf.arr," ");
105 }
106 strcat((char *)buf.arr,"KEY部,");
107 strcat((char *)buf.arr,"DATA部 ");
108 strcat((char *)buf.arr,"FROM サンプルテーブル1");
109 buf.len = strlen((char *)buf.arr);
110
111 /* 検索条件付加 */
112 if(chk_space(wherebuf)) {
113 strcat((char *)buf.arr," WHERE ");
114 buf.len = strlen((char *)buf.arr);
115 p = &(wherebuf[7999]);
116 while(*p == ' ' || *p == 0) {
117 p--;
118 }
119 wherelen = p-wherebuf+1;
120 memcpy(&(buf.arr[buf.len]),wherebuf,wherelen);
121 buf.len += wherelen;
122 buf.arr[buf.len] = '\0';
123 wherep = wherebuf;
124 }
125 else {
126 wherelen = 0;
127 wherep = (char *)NULL;
128 }
129
130 /* ソート条件付加 */
131 if(chk_space(orderbuf)) {
132 strcpy(tmpbuf," ORDER BY ");
133 strcat(tmpbuf,orderbuf);
134 memcpy((char *)&(buf.arr[buf.len]),tmpbuf,strlen(tmpbuf));
135 buf.len += strlen(tmpbuf);
136 buf.arr[buf.len] = '\0';
137 }
138
139 /* エラーが発生しても継続 */
140 EXEC SQL WHENEVER SQLERROR CONTINUE;
141
142 /* SQL文解析 */
143 EXEC SQL PREPARE S_SAMPLE1 FROM :buf;
144
145 /* SQL文をカーソルにバインド */
146 if (sqlca.sqlcode == 0) {
147 EXEC SQL DECLARE c_SAMPLE1 CURSOR FOR S_SAMPLE1;
148 }
149
150 /* カーソルオープン */
151 if (sqlca.sqlcode == 0) {
152 EXEC SQL OPEN c_SAMPLE1;
153 }
154
155 if (sqlca.sqlcode == 0) {
156 cnt = get_count("サンプルテーブル1",wherep,wherelen,hintptr);
157 hintptr = (char *)NULL;
158
159 /* エラー発生 */
160 if (cnt < 0) {
161 sqlca.sqlcode = cnt;
162 }
163 else {
164 /* 返却用件数作成 */
165 sprintf(tmpbuf,"%07d",cnt);
166 strncpy(count,tmpbuf,7);
167 }
168 }
169
170 fetch_rows = 0; /* フェッチ行数のクリア */
171 fetch_cnt = FETCH_BUFFER_COUNT;
172 end_flag = 0;
173
174 errcode = abs(sqlca.sqlcode);
175 /* エラーコードが5桁以上 */
176 if (errcode >= 100000L) {
177 errcode = 99999L;
178 }
179
180 /* 返却用エラーコード作成 */
181 sprintf(tmpbuf,"%05d",errcode);
182 strncpy(errbuf,tmpbuf,5);
183
184 return;
185 }
186
187 static long SAMPLE1_datafetch(void)
188 {
189 longerrcode;
190
191 if(fetch_cnt >= FETCH_BUFFER_COUNT) {
192 /* エラーが発生したらジャンプ */
193 EXEC SQL WHENEVER SQLERROR GOTO errexit;
194
195 /* NOT FOUNDは継続 */
196 EXEC SQL WHENEVER NOT FOUND CONTINUE;
197
198 EXEC SQL FETCH c_SAMPLE1
199 INTO :rec INDICATOR :rec_ind;
200
201 /* フェッチ数クリア */
202 fetch_cnt = 0;
203 /* フェッチでデータを取得した場合 */
204 if (fetch_rows < sqlca.sqlerrd[2]) {
205 max_cnt = sqlca.sqlerrd[2] - fetch_rows;
206 /* フェッチ行更新 */
207 fetch_rows = sqlca.sqlerrd[2];
208 if (sqlca.sqlcode == REC_NOT_FOUND) {
209 end_flag = 1;
210 }
211 }
212 }
213
214 errexit:
215 errcode = abs(sqlca.sqlcode);
216
217 return errcode;
218 }
219
220 /*
221 * SAMPLE1_fetch : サンプルテーブル1フェッチ
222 */
223 #ifndef NOT_DLL
224 DllExport
225 #endif
226 void SAMPLE1_fetch(char *errbuf,char *databuf)
227 {
228 longerrcode;
229 chartmpbuf[6];
230
231 /* 入力バッファチェック */
232 if(databuf == (char *)NULL) {
233 return;
234 }
235
236 if(selectflag) {
237 if(selfetflag) {
238 strncpy(errbuf,"01403",5);
239 }
240 else {
241 strncpy(databuf,selbuf,30);
242 strncpy(errbuf,"01403",5);
243 selfetflag = 1;
244 }
245 return;
246 }
247
248 sqlca.sqlcode = (0L);
249
250 /* フェッチ */
251 if((errcode = SAMPLE1_datafetch()) < 0) {
252 if (errc/* エラーコードが5桁以上 */
253 errcode = 99999L;
254 }
255
256 sprintf(tmpbuf,"%05d",errcode);
257 memcpy(errbuf,tmpbuf,5);
258
259 return;
260 }
261
262 if (!end_flag || ((long)fetch_cnt < max_cnt)) {
263 rectobuf(databuf,fetch_cnt);
264 }
265
266 fetch_cnt++;
267
268 if(!end_flag) {
269 errcode = SAMPLE1_datafetch();
270 }
271
272 if (end_flag) {
273 if ((long)fetch_cnt < max_cnt) {
274 errcode = (0L);
275 }
276 else {
277 errcode = REC_NOT_FOUND;
278 }
279 }
280
281 if (/* エラーコードが5桁以上 */
282 errcode = 99999L;
283 }
284
285 sprintf(tmpbuf,"%05d",errcode);
286 strncpy(errbuf,tmpbuf,5);
287
288 return;
289 }
290
291 /*
292 * SAMPLE1_close : サンプルテーブル1クローズ
293 */
294 #ifndef NOT_DLL
295 DllExport
296 #endif
297 void SAMPLE1_close(void)
298 {
299 if(selectflag) {
300 selectflag = 0;
301 selfetflag = 0;
302 return;
303 }
304
305 EXEC SQL WHENEVER SQLERROR CONTINUE;
306 EXEC SQL CLOSE c_SAMPLE1;
307
308
309 static void rectobuf(char *databuf,int reccnt)
310 {
311 char*datap;
312
313 datap = databuf;
314
315 /* KEY部 */
316 if(rec_ind[reccnt].column1 == (short)-1) {
317 rec[reccnt].column1.len = 0;
318 }
319 rec[reccnt].column1.arr[rec[reccnt].column1.len] = '\0';
320 padding_copy(datap,(char *)rec[reccnt].column1.arr,10,'X');
321 datap += 10;
322
323 /* DATA部 */
324 if(rec_ind[reccnt].column2 == (short)-1) {
325 rec[reccnt].column2.len = 0;
326 }
327 rec[reccnt].column2.arr[rec[reccnt].column2.len] = '\0';
328 padding_copy(datap,(char *)rec[reccnt].column2.arr,20,'X');
329 datap += 20;
330
331 return;
332 }
333
334 /*
335 * SAMPLE1_select : サンプルテーブル1セレクト
336 */
337 #ifndef NOT_DLL
338 DllExport
339 #endif
340 void SAMPLE1_select(char *errbuf,char *keybuf1,char *databuf)
341 {
342 char*datap;
343 chartmpbuf[6];
344 longerrcode;
345
346 /* 入力バッファチェック */
347 if(databuf == (char *)NULL) {
348 return;
349 }
350
351 datap = databuf;
352
353 memset(key1.arr,0,sizeof(key1.arr));
354 strncpy((char *)key1.arr,keybuf1,10);
355 key1.len = strlen((char *)key1.arr);
356
357 /* エラーが発生したらジャンプ */
358 EXEC SQL WHENEVER SQLERROR GOTO errexit;
359 EXEC SQL WHENEVER NOT FOUND GOTO errexit;
360
361 /* SQL文実行 */
362 EXEC SQL
363 SELECT
364 KEY部,
365 DATA部
366 INTO
367 :rec[0]
368 INDICATOR
369 :rec_ind[0]
370 FROM
371 サンプルテーブル1
372 WHERE
373 KEY部 = :key1;
374
375 rectobuf(databuf,0);
376
377 errexit:
378 errcode = abs(sqlca.sqlcode);
379
380 if (/* エラーコードが5桁以上 */
381 errcode = 99999L;
382 }
383
384
385 static int check_key(char *wherebuf,char *keybuf1)
386 {
387 char*inptr;
388 char*datap;
389 char*ptr;
390 int cnt;
391 int substrflag;
392 int keyflag1;
393
394 inptr = wherebuf;
395 substrflag = 0;
396 keyflag1 = 0;
397
398 /* 先頭のスペース読み飛ばし */
399 while(isspace(*inptr)) {
400 inptr++;
401 }
402
403 /* 全角文字チェック */
404 if(!(*inptr & 0x80)) {
405 return 0;
406 }
407
408 for (cnt=0;cnt<1;cnt++) {
409 /* トークン間のスペース読み飛ばし */
410 while(isspace(*inptr)) {
411 inptr++;
412 }
413
414 /* SUBSTR読み飛ばし処理 */
415 if(!strncmp(inptr,"SUBSTR",6) || !strncmp(inptr,"substr",6)) {
416 inptr += 6;
417 substrflag = 1;
418 /* '(' or スペース読み飛ばし */
419 while(isspace(*inptr) || *inptr == '(') {
420 inptr++;
421 }
422 }
423
424 if(!strncmp(inptr,"KEY部",8)) {
425 datap = keybuf1;
426 keyflag1 = 1;
427 inptr += 8;
428 }
429 else {
430 return 0;
431 }
432
433 /* SUBSTR読み飛ばし処理 */
434 if(substrflag) {
435 substrflag = 0;
436 /* ')'の位置検索 */
437 ptr = strchr(inptr,')');
438 if(ptr == (char *)NULL) {
439 return 0;
440 }
441 inptr = ptr + 1;
442 }
443
444 /* トークン間のスペース読み飛ばし */
445 while(isspace(*inptr)) {
446 inptr++;
447 }
448
449 /* =チェック */
450 if(*inptr != '=') {
451 return 0;
452 }
453 inptr++;
454
455 /* トークン間のスペース読み飛ばし */
456 while(isspace(*inptr)) {
457 inptr++;
458 }
459
460 if(*inptr =='\'') { /* シングルクォートの場合 */
461 /* シングルクォート読み飛ばし */
462 inptr++;
463
464 /* 対応するシングルクォートの位置検索 */
465 ptr = strchr(inptr,'\'');
466 if(ptr == (char *)NULL) {
467 return 0;
468 }
469
470 /* キー項目コピー */
471 strncpy(datap,inptr,ptr-inptr);
472 datap[ptr-inptr] = '\0';
473
474 inptr = ptr + 1;
475 }
476 else { /* 値の場合 */
477 /* スペースの位置検索 */
478 ptr = strchr(inptr,' ');
479 if(ptr == (char *)NULL) { /* NULLの場合 */
480 /* 文字列の最終位置をセット */
481 ptr = inptr + strlen(inptr);
482 }
483
484 /* キー項目コピー */
485 strncpy(datap,inptr,ptr-inptr);
486 datap[ptr-inptr] = '\0';
487
488 inptr = ptr;
489 }
490
491 /* トークン間のスペース読み飛ばし */
492 while(isspace(*inptr)) {
493 inptr++;
494 }
495
496 /* 検索条件終了チェック */
497 if(*inptr == '\0') {
498 break;
499 }
500
501 /* AND条件チェック */
502 if(strncmp(inptr,"AND",3) && strncmp(inptr,"and",3)) {
503 return 0;
504 }
505 inptr += 3;
506 }
507
508 if(keyflag1 && cnt < 1) {
509 return 1;
510 }
511
512 return 0;
513 }
次に、図27を参照してコピー文作成処理部410の処理動作について説明する。これは、データベース設計書CSV303の情報を基にしてコピー文310を作成する処理である。尚、図29に、作成したコピー文310の詳細構成を示す。
まず、データベース設計書CSV303の情報を読み込み(ステップS2701)、次に、データベース設計書CSV303の項目があるだけループし、テーブル名、項目名、桁数をコピー文510に出力する(ステップS2702,S2703)。
このコピー文作成処理部410の処理結果として、図29に詳細を示すコピー文508が生成される。尚、図29においては、コピー文のサンプル2901と、その内容説明2902を示している。
次に、図30を用いて、以上の図26,27で示した各処理で作成したDBアクセスモジュールとコピー文を用いたCGIプログラム処理の流れを説明する。図30においては、データベース装置3001,3003のそれぞれのコンピュータ上でのDBアクセスモジュールとコピー文を用いた処理概要を示している。
データベース装置3001においては、主キーを条件にテーブルを検索する動作を実行しており、CGI処理部3002は、WHERE句に主キーの値を設定し、SQLを実行して、サンプルテーブル2506にアクセスし、1レコードのデータをコピー文に取得する。
データベース装置3003においては、主キー以外を条件にテーブルを検索する動作を実行しており、CGI処理部3004は、WHERE句に主キー以外の項目と値を設定し、サンプルテーブル2506に対するカーソルオープンを実行し、CGI処理部3005は、フェッチ処理により、サンプルテーブル2506から複数レコードのデータをコピー文に取得し、CGI処理部3006は、サンプルテーブル2506に対するカーソルクローズを実行する。
以上、図1〜図30を用いて説明したように、本例では、プログラムされたコンピュータによって、データベースの構築を支援するシステムを構成し、データベース設計書101の情報を基に、テーブル定義のドキュメント(テーブル一覧表301、テーブル定義書302)を自動で生成すると共に、データベース設計書CSV303を生成し、そして、このデータベース設計書CSV303を基に、データベースにおけるテーブル作成SQL文と、テーブルにデータをローディングするSQL*Loader制御文、テーブルバックアップ取得SQL文、テーブル本番環境移行SQL文を自動で生成する。テーブル定義のドキュメントを自動で生成する。
すなわち、本システムは、データベース構築において開発と保守運用の全般を考慮しており、データベース設計書101の情報を基に作成された各SQL文を利用することで、テーブルの作成、テーブルへのデータのローディング、バックアップデータの取得、テーブルの本番環境へ移行など、データベースを構築する上で必要となるSQL文を自動で生成することができる。
さらに、本システムでは、CGIプログラムからテーブル全項目を固定長で1レコードおよび複数レコード抽出するモジュール(DBアクセスモジュール)と、このDBアクセスモジュールで抽出したデータを格納する変数定義ファイル(コピー文)を、データベース設計書CSV303を基に、自動で生成することができる。
このように、本例によれば、(1)データベースを管理する上で必要となるテーブル定義のドキュメント、(2)データをテーブルに取込むために必要となるローディング制御文、(3)システムを保守運用する上で必須となるデータのバックアップを取得するSQL文、(4)新規作成したテーブルや更新したテーブルを本番環境に移行するSQL、(5)DBアクセスモジュールとコピー文を含む、それぞれデータベースを構築する上で必要となるSQL文などを、データベース設計書101から自動生成したデータベース設計書CSV303の情報を基に、自動で生成することができるので、開発や保守運用の工数を削減することが可能となると共に、それぞれ、必ず整合性が取れたものとなる。
これにより、従来の技術の問題点、すなわち、データベース設計書の内容に対応するデータベース定義SQL文(テーブル作成・インデックス作成)のみを作成できるだけであり、データベースを構築する上で必要となるその他のSQL文やテーブル定義に関するドキュメントは、人手により作成しなければならない点と、CGIプログラムからテーブルを検索するSQL文も人手により作成しなければならない点を解決し、データベースの開発工数を軽減することが可能となると共に、開発者に依存しない検索SQL分の作成を可能として保守運用の複雑化を回避することができる。
尚、本発明は、図1〜図30を用いて説明した例に限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能である。例えば、図1に示すように、1台のコンピュータ(サーバ1)において、各処理を実行する構成としているが、複数のコンピュータで各処理部の機能を振り分け、負荷の分散を図る構成としても良い。
また、本例のコンピュータ構成に関しても、キーボードや光ディスクの駆動装置の無いコンピュータ構成としても良い。また、本例では、光ディスクを記録媒体として用いているが、FD(Flexible Disk)等を記録媒体として用いることでも良い。また、プログラムのインストールに関しても、通信装置を介してネットワーク経由でプログラムをダウンロードしてインストールすることでも良い。
101:データベース設計書、201:テーブル一覧作成処理部、202:テーブル定義書作成処理部、203:データベース設計書処理部、301:テーブル一覧表、302:テーブル定義書、303:データベース設計書CSV、401:テーブル作成SQL文作成処理部、402:インデックス作成SQL文作成処理部、403:インデックス削除SQL文作成処理部、404:コピーテーブルSQL文作成処理部、405:テーブルリネームSQL文作成処理部、406:旧テーブル削除SQL文作成処理部、407:SQL*Loader用制御文作成処理部、408:テーブル引上げSQL文作成処理部、501:テーブル作成SQL文、502:インデックス作成SQL文、503:インデックス削除SQL文、504:コピーテーブルSQL文、505:テーブルリネームSQL文、506:旧テーブル削除SQL文、507:SQL*Loader用制御文、508:テーブル引上げSQL文、509:DBアクセスモジュール、510:コピー文、1301:データベース設計書のサンプル、1302:データベース設計書の項目説明、1303:データベース設計書のデータ例、1401:テーブル一覧表のサンプル、1402:テーブル一覧表の項目説明、1403:テーブル一覧表のデータ例、1501:テーブル定義書のサンプル、1502:テーブル定義書の項目説明、1503:テーブル定義書のデータ例、1601:データベース設計書CSVのサンプル、1602:データベース設計書CSVの項目説明、1603:データベース設計書CSVのデータ例、1701:テーブル作成SQL文のサンプル、1702:テーブル作成SQL文の内容説明、1801:インデックス作成SQL文のサンプル、1802:インデックス作成SQL文の内容説明、1901:インデックス削除SQL文のサンプル、1902:インデックス削除SQL文の内容説明、2001:コピーテーブル作成SQL文のサンプル、2002:コピーテーブル作成SQL文の内容説明、2101:テーブルリネームSQL文のサンプル、2102:テーブルリネームSQL文の内容説明、2201:旧テーブル削除SQL文のサンプル、2202:旧テーブル削除SQL文の内容説明、2301:SQL*LOADER用制御文のサンプル、2302:SQL*LOADER用制御文の内容説明、2401:テーブル引上げSQL文のサンプル、2402:テーブル引上げSQL文の内容説明、2501:バッチ処理サーバ、2502:入力ファイル、2503:サンプルテーブル、2504:バックアップファイル、2505:コピーサンプルテーブル、2506:正のテーブルとしてのサンプルテーブル、2507:旧サンプルテーブル、2508:WEBサーバ、2801:DBアクセスモジュールの内容説明、2901:コピー文のサンプル、2902:コピー文の内容説明、3001:データベース装置、3002:CGI処理部、3002:データベース装置、3004〜3006:CGI処理部。
Claims (5)
- プログラムされたコンピュータによって、データベースを構築する上で必要となる情報を生成してデータベースの構築を支援するシステムであって、
予め記憶装置に格納されたデータベース設計書の情報を読み出し、該データベース設計書の情報を基に、テーブル一覧表を生成して記憶装置に出力する第1の処理手段と、
予め記憶装置に格納されたデータベース設計書の情報を読み出し、該データベース設計書の情報を基に、テーブル定義書を生成して記憶装置に出力する第2の処理手段と、
予め記憶装置に格納されたデータベース設計書の情報を読み出し、該データベース設計書の情報を基に、データベース設計書CSVを生成して記憶装置に出力する第3の処理手段と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、データベースにおけるテーブルを作成するSQL文を生成する第4の処理手段と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、テーブルにデータをローディングする制御文を生成する第5の処理手段と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、テーブルのバックアップを取得するSQL文を生成する第6の処理手段と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、テーブルを本番環境に移行するSQL文を生成する第7の処理手段と
を有することを特徴とするデータベース構築支援システム。 - 請求項1に記載のデータベース構築支援システムであって、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、DBアクセスモジュールを生成する第8の処理手段と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、コピー文を生成する第9の処理手段と
を有することを特徴とするデータベース構築支援システム。 - プログラムされたコンピュータによって、データベースを構築する上で必要となる情報を生成する方法であって、
予め記憶装置に格納されたデータベース設計書の情報を読み出し、該データベース設計書の情報を基に、テーブル一覧表を生成して記憶装置に出力する第1の処理手順と、
予め記憶装置に格納されたデータベース設計書の情報を読み出し、該データベース設計書の情報を基に、テーブル定義書を生成して記憶装置に出力する第2の処理手順と、
予め記憶装置に格納されたデータベース設計書の情報を読み出し、該データベース設計書の情報を基に、データベース設計書CSVを生成して記憶装置に出力する第3の処理手順と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、データベースにおけるテーブルを作成するSQL文を生成する第4の処理手順と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、テーブルにデータをローディングする制御文を生成する第5の処理手順と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、テーブルのバックアップを取得するSQL文を生成する第6の処理手順と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、上記データベースを構築する上で必要となる情報としての、テーブルを本番環境に移行するSQL文を生成する第7の処理手順と
を有することを特徴とするデータベース構築情報生成方法。 - 請求項3に記載のデータベース構築情報生成方法であって、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、DBアクセスモジュールを生成する第8の処理手順と、
上記データベース設計書CSVの情報を読み出し、該データベース設計書CSVの情報を基に、コピー文を生成する第9の処理手順と
を有することを特徴とするデータベース構築情報生成方法。 - コンピュータを、請求項1もしくは請求項2のいずれかに記載のデータベース構築支援システムにおける各処理手段として機能させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007080492A JP2008242677A (ja) | 2007-03-27 | 2007-03-27 | データベース構築支援システムとデータベース構築情報生成方法およびプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007080492A JP2008242677A (ja) | 2007-03-27 | 2007-03-27 | データベース構築支援システムとデータベース構築情報生成方法およびプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008242677A true JP2008242677A (ja) | 2008-10-09 |
Family
ID=39913970
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007080492A Pending JP2008242677A (ja) | 2007-03-27 | 2007-03-27 | データベース構築支援システムとデータベース構築情報生成方法およびプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008242677A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104484441A (zh) * | 2014-12-23 | 2015-04-01 | 中国银行股份有限公司 | 文件批量处理及调度的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1997011434A1 (fr) * | 1995-09-20 | 1997-03-27 | Hitachi, Ltd. | Procede de traitement de bordereaux |
JPH11232090A (ja) * | 1998-02-16 | 1999-08-27 | Mitsubishi Electric Corp | データベースシステムの自動生成システム |
JP2000222259A (ja) * | 1999-01-28 | 2000-08-11 | Nec Corp | Sql自動生成システム |
-
2007
- 2007-03-27 JP JP2007080492A patent/JP2008242677A/ja active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1997011434A1 (fr) * | 1995-09-20 | 1997-03-27 | Hitachi, Ltd. | Procede de traitement de bordereaux |
JPH11232090A (ja) * | 1998-02-16 | 1999-08-27 | Mitsubishi Electric Corp | データベースシステムの自動生成システム |
JP2000222259A (ja) * | 1999-01-28 | 2000-08-11 | Nec Corp | Sql自動生成システム |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104484441A (zh) * | 2014-12-23 | 2015-04-01 | 中国银行股份有限公司 | 文件批量处理及调度的方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5311873B2 (ja) | ドキュメント生成装置、ドキュメント生成方法及びプログラム | |
JP3074737B2 (ja) | ファイル更新処理装置 | |
Leavitt | Will NoSQL databases live up to their promise? | |
CN101253498B (zh) | 从半结构化的文本学习事实 | |
Schruben et al. | Geology of the conterminous United States at 1: 2,500,000 scale; a digital representation of the 1974 PB King and HM Beikman map | |
JP2000148736A (ja) | フォントの取得方法、登録方法、表示方法、印刷方法、異体字フォントを含む電子文書の取り扱い方法およびその記録媒体 | |
US6915303B2 (en) | Code generator system for digital libraries | |
CN100447779C (zh) | 文档信息处理设备及文档信息处理方法 | |
JP4769005B2 (ja) | 情報処理支援システム及び情報処理支援プログラム | |
CN112384940B (zh) | 用于web爬取电子商务资源页面的机制 | |
CN115481288A (zh) | 一种在线接口文档转离线的实现方法及装置 | |
JP4959501B2 (ja) | 情報処理装置、情報処理方法、およびプログラム | |
JP2008242677A (ja) | データベース構築支援システムとデータベース構築情報生成方法およびプログラム | |
Holt | Writing and Querying MapReduce Views in CouchDB: Tools for Data Analysts | |
EP1515245A2 (en) | Merging of datasets into a database | |
JP2004252951A (ja) | 統合業務ソフトウェアの導入運用支援システム | |
CN108614821B (zh) | 地质资料互联互查系统 | |
CN101131746A (zh) | 合约条款编辑系统及方法 | |
JP2001022734A (ja) | 情報処理装置、情報処理方法およびその方法をコンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体 | |
EP1304630A2 (en) | Report generating system | |
Firth et al. | Divisions of the United Kingdom House of Commons, from 1992 to 2003 and Beyond | |
JP2774668B2 (ja) | ドキュメント管理装置 | |
JP2009110506A (ja) | 情報処理装置及び情報処理プログラム | |
Yokouchi et al. | DandD client server system | |
Stover et al. | Seismicity map of the state of New Mexico |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20100423 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20100507 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20100907 |