kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

「SQLログ取得.xls」Vectorのつづき。 英字SQL文を日本語SQLにするという考え。

SQLログ取得.xls」Vectorのつづき。 英字SQL文を日本語SQLにするという考え。
うまく動かない!
以下の修正なんかやったがぜんぜんだめだってことがわかった。
これは難しすぎる。

 手順1:Dialect_POSTGRES.phpを作って「'to_char','trim'」などpostgresの関数を入れれば
     動くのだろうと思って入れて「test_sql_parser.php」(後述)を動かした。
      結果:Parser.phpの「$dialects」に”POSTGRES”を追加しないと相手にされない。
         Parser.phpの「parseFunctionOpts」メソッドに「'to_char','trim'」を追加しないと相手にされない。
 手順2:手順1の結果をPGMに反映して「test_sql_parser.php」(後述)を動かした。
      結果:「Trim(to_char・・・」の「to_char」にエラーが出た。「test_sql_parser_kakka.txt」(後述)参照
 どうするか考えた結果:
  ・Parser.phpでは「Trim(to_char・・・」のように関数の中に関数があることを考慮していないことがわかった。
    <=これに対処するのは難しい。(リエントラント処理にすればと思うが。
     その先の「Trim(to_char((SELECT Sum(amount) FROM ・・・」)」の「SELECT Sum・・・」はどうするのかと考えると
     どうにもならない。
  ・'||'に対応していない。
    <=これに対処できるのか。処理方法が浮かばない。
  ・ということで、自分でパーズするということを考えるのはやめることにした。
  ・結論として。SQLを日本語SQLにへ整形する。は誰かが作ってくれるのを待つことにする。
 ★でもSQLの日本語は作りたい。ということで。この方法でやってみることにする。
  ・簡易的に作ることにする。
   ・テーブル定義書から「英字TBL名、日本語TBL名のペア」、「英字項目名、日本語項目名のペア」を
    抜き取るVBAマクロをつくり、これらを別シートに一覧する。
   ・SQLConverterをかけた結果にこれらを比較して日本語に置き換える
/////////////////////////////////////////////
//    以降使用した内容                     //
/////////////////////////////////////////////

■Dialect_POSTGRES.php 新規

「Dialect_ANSI.php」をコピーして以下のように,'to_char','trim'を増やした。
<<修正前>>
'functions'=>array('avg','count','max','min','sum','nextval','currval'),
<<修正後>>
'functions'=>array('avg','count','max','min','sum','nextval','currval','to_char','trim'),

■Parser.php 修正

// 2010/02/20 
    var $dialects = array("ANSI", "MySQL", "POSTGRES");
//    var $dialects = array("ANSI", "MySQL");
// 2010/02/20 end
・・・
    function parseFunctionOpts()
・・・
// 2010/02/20 start
            case 'to_char': case 'trim':
                $this->getTok();
                while ($this->token != ')') {
                    switch ($this->token) {

                        case 'ident': case 'text_val':
                            $opts['arg'][] = $this->lexer->tokText;
                            break;
                        case ',':
                            // do nothing
                            break;
                        default:
                            return $this->raiseError('Expected a string or a column name');
                    }
                    $this->getTok();
                }
                $this->lexer->pushBack();
                break;
// 2010/02/20 end

■test_sql_parser.php 新規(走らせたPGM)

<?php
require_once('SQL/Parser.php');
require_once('SQL/Compiler.php');

$sql = "
SELECT TBL.id, TBL.code, 
Trim(to_char((SELECT Sum(amount) FROM t_meisai WHERE TBL.id = t_meisai.id AND amount > 0),'999,999,990')) AS ttl_amount, 
to_char(TBL.update_ymd,'MM') || '月' || to_char(TBL.update_ymd,'DD') || '日' AS update_ymd, 
TBL.flg FROM t_mitu AS TBL 
WHERE TBL.code = '1231' ORDER BY id DESC
";

$parser = new SQL_Parser('', 'POSTGRES');
$parseTree = $parser->parse($sql);
print_r($parseTree);
?>

■実行DOS画面

D:\>C:\xampp\php\php test_sql_parser.php > test_sql_parser_kakka.txt

■test_sql_parser_kakka.txt 実行結果から抜粋

PEAR_Error Object
(
    [error_message_prefix] => 
    [mode] => 1
    [level] => 1024
    [code] => 
    [message] => Parse error: Expected a string or a column name on line 3
Trim(to_char((SELECT Sum(amount) FROM t_meisai WHERE TBL.id = t_meisai.id AND amount > 0),'999,999,990')) AS ttl_amount, 
     ^ found: "to_char"
    [userinfo] => 
・・・

02/20 17:00-23:00
02/21 09:00-11:00