你有一些选择。首先是通过发出特殊的 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来编写 SQL::Dialects::Oracle 文件,然后使用$sqlParser->dialect('Oracle')
. 不幸的是get_config
,您要继承的关键方法只返回一个大字符串,因此添加它会很笨拙。幸运的是,您可以使用get_config_as_hash
它来为您做到这一点。不幸的是,我不知道如何指定一个函数。:(
由于我在解决这个问题时遇到了很多麻烦,所以我将其报告为 bug。我还报告了一个错误,这意味着$sqlParser->dialect($dialect)
什么都不做,你必须编写my $sqlParser = SQL::Parser->new($dialect)
.