人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL文を分析して暗黙の型変換がされているSQL文を検出するプログラムをjavaで作成する問題の質問です。
いつもお世話になってます。

例えばListの中にこんな値が入っているといます
1) List1.add("SELECT * FROM teble WHERE age=20");
2) List1.add("SELECT * FROM teble WHERE age='20'");
3) List1.add("INSERT INTO table (id,nama,age) values(1,'hatena',20)");
4) List1.add("INSERT INTO table (id,name,age) values('1','hatena','20')");

このList中のsql文をteble.txtをみて分析する
テーブル名 項目名 属性 桁数 順でTab区切りになってます
table.txt
TEBLE1IDNUMBER5
TEBLE2NAMEVARCHAR210
TEBLE3ANFNUMBER3

結果は2番目と4番目のList値を出力したいです。

1、Listをループさせてから項目名と値(20..ext)を取得する
2、table.txtテキストを一行ずつ読み込んでsql文中の項目名の属性を取得する
3、属性に対して値(20..ext)に' 'が付いているかチェックする
こんな感じでやろと思っていましだがなんかうまくできません。

どなたかご教授していただければ本当に幸いです。
よろしくお願いいたします。






●質問者: kimu_507
●カテゴリ:ウェブ制作
✍キーワード:ADD Hatena Java name Number
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● kn1967
●60ポイント

完璧なものを望むのであれば、RDBMSがどのように字句解析しているのかを研究して、

それぞれのRDBMSにあわせる必要が出てきますが、サンプルに提示しておられるように、

ある程度決まった構文だけを対象にするのであれば、落ち着いて整理すれば、

それほど難しいものでも無いと思います。まずは一度整理してみてはいかがでしょう?


(1)対象RDBMSの決定。

ORACLE,SQLServer,PostgreSQL,MySQL,Access・・・それぞれ特徴があるので、

欲張らずにどれかひとつに無理やりでも特定しておくのが良いでしょう。


(2)処理の流れ

既に考えておられるような流れでよろしいかと思います。


SQL文を準備

ループ開始

パース

比較&結果表示

ループ終了


(3)クラスの設計

繰り返し利用する処理をサブルーチンやクラスなどとして、

切り分けていくことを行わずに処理の流れだけで漠然とプログラムを組んでいくと、

どこが上手く機能しないかをテストする事すら出来なくなりますので、事前に、

機能別に分け、それぞれの機能を単体でテストする方法も考えておくのが良いでしょう。


例えばですが・・・、

パース用

・SELECT文からWHERE句の要素を抜き出すクラス

・抜き出した要素から カラム=値 の形でさらに細かく抜き出して

「項目名」と「属性」のリストを作成するクラス

・INSERT INTO文から「項目名」と「属性」のリストを作成するクラス

比較用

・パース結果とリストを比較するクラス

・table.txtを読み込んで「項目名」と「属性」のリストを作成するクラス

※ WHERE句の要素を抜き出すクラス については、以前回答させていただいた

http://q.hatena.ne.jp/1247041541#a933599 と構造的には同じですが、

抜き出しパターン作成の前に、バッククォートによる予約語等の回避、

というものが存在するという事を再確認しておいてください。


question:1245081165question:1247027095question:1247041541では

コード書いたのですが、今は検証するマシンが手元に無く、文章のみで失礼します。

◎質問者からの返答

kn1967さん 返事が遅くなってすみません。

いつもありがとうございます。前の問題もおかけ様で解ける事ができました。

今回の分析文章も参考させて頂きます。

これからもよろしくお願いいたします

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ