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
TEBLE 1 ID NUMBER 5
TEBLE 2 NAME VARCHAR2 10
TEBLE 3 ANF NUMBER 3

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

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

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




回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/08/07 16:45:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント60pt

完璧なものを望むのであれば、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では

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

id:kimu_507

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

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

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

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

2009/08/03 09:30:57

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません