■まずは訂正。(青字で)

 

/* SQL分析用フォーマット */

typedef struct ST_SQL {

    int KNo;                 /* 階層No                                 */

    int KNoSub;              /* 階層サブNo                             */

    int LKNo[64];            /* リンク元階層No(最上位の場合、0)        */

    int LKNoSub[64];         /* リンク元階層サブNo(最上位の場合、0)    */

/*    char JoinMthd[64];       /* 結合方法(join、サブクエリ)             */*/

    char JoinMthd[64];       /* 結合方法(join、サブクエリ、union等も   */

    char *JoinKey            /* 結合キー                               */

    char Crud[16+1];         /* "Insert", "Select", "Update", "Delete" */

    int DistinctFlg;         /* Distinct:有⇒1, 無⇒0                 */

    char *ColumnsStr;        /* 抽出カラム文字列                       */

    char *ColumnsOStr[1024]; /* 抽出カラムOriginal(項目別)             */

    char *ColumnsEStr[1024]; /* 抽出カラムEnglish(項目別)              */

    char *ColumnsAStr[1024]; /* 抽出カラム別名(項目別)                 */

    char FromOStr[128+1];    /* 抽出元Original                         */

    char FromEStr[64+1];     /* 抽出元English                          */

    char FromAStr[128+1]     /* 抽出元別名                             */

    char *WhereStr;          /* Where句の中身                          */

    char *GroupByStr;        /* グループ化項目                         */

    char *HavingStr;         /* グループ化前処理条件                   */

    char *OrderByStr;        /* ソート項目                             */

}

typedef struct ST_SQLS {

    char *SqlFileName;

    int FileCnt;

    ST_SQL *st_sql

}

 

同階層であっても、例えばそれがunion、union all、exceptなのかを識別できないと、設計書化できません。

しかし、わざわざ別項目化する意味もなさそうなので、結合に含めます。

階層自体は、KNo、KNosubで表現できているので、あと必要だったのは「集合句の場合、どの集合句なのか」である事さえこのデータモデルに情報として組み込めればよかったわけです。

 

■さて、データモデルが出来たところで、実装。

「SQLから設計書を自動的に作る」と言う作業は、コンピューターの仕組みから言えば、どういう仕組みが考えられるでしょうか。

①SQLを頭から読み込み、逐一分析する

②SQLを頭から読み込み、全て読み込み終わった後に、分析する

 

多分、この2つの手段以外に考える付くのは難しいでしょう。

①のメリットは、何度も読み直すことなく、その場で複雑な判断を行う事で高速化できる

②のメリットは、一旦全て読み込んだ後なので「どの様な分析方法を取れるかの裁量がある」

 

あと、これは技術的な事ですが

①はファイルから読み込みながら処理する

②はファイルを一旦全てメモリに入れてからメモリ内の操作をする

と言う違いがあります。

 

どの様な例外があっても、「また読み返せる、読み返しても速度を毀損しにくいのは②」です。

従って、一端の処理方式は「まずはSQL全体をメモリに放り込む」って所から始めます。

 

■今後の事も考えて、言語を変更かな。。。

Cで書くのが一番応用が利いて良いと、思ったものの。

設計書って殆どの場合がofficeベースなんですよね。。。

って事であれば、VBAで作ったほうがわかりやすいかもしれない。

 

少し検討。