いくつかのオプションがあります。1 つ目は、特別な SQL コマンドを発行して構文を拡張し、新しい関数についてパーサーに通知することです。
my $extend_sql = "CREATE FUNCTION LENGTH";
my $sql = "select colA from tableB where length(colA)>0";
my $sqlParser = SQL::Parser->new();
$sqlParser->dialect('ANSI');
my $query = join ", ", $extend_sql, $sql;
my $stmt = SQL::Statement->new($query, $sqlParser);
これはうまくスケーリングできないため、拡張機能をサブクラス化する必要があります。残念ながら、SQL::Parser のサブクラス化に関するドキュメントでは、これについてあまり詳しく説明されていません。
最後に、SQL::Dialects::Roleを使用するか、 SQL::Dialects::ANSIをサブクラス化して$sqlParser->dialect('Oracle')
. 残念ながら、get_config
サブクラス化する重要なメソッドは大きな文字列を返すだけなので、それに追加すると扱いにくくなります。幸いなことget_config_as_hash
に、それを行うために使用できます。残念ながら、関数を指定する方法がわかりません。:(
これを理解するのに非常に苦労したので、バグとして報告しました。また、何もしないことを意味するバグも報告しました。$sqlParser->dialect($dialect)
my $sqlParser = SQL::Parser->new($dialect)