いつもお世話になってます。
例えば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)に' 'が付いているかチェックする
こんな感じでやろと思っていましだがなんかうまくできません。
どなたかご教授していただければ本当に幸いです。
よろしくお願いいたします。
完璧なものを望むのであれば、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:1245081165、question:1247027095、question:1247041541では
コード書いたのですが、今は検証するマシンが手元に無く、文章のみで失礼します。
kn1967さん 返事が遅くなってすみません。
いつもありがとうございます。前の問題もおかけ様で解ける事ができました。
今回の分析文章も参考させて頂きます。
これからもよろしくお願いいたします