以下是代码的一部分:
use SQL::Statement;
my $qryParse = "select colA from tableB where length(colA)>0";
my $sqlParser = SQL::Parser->new();
$sqlParser->dialect('ANSI');
my $stmt = SQL::Statement->new($qryParse,$sqlParser);
错误说:
未知函数'length'at /usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm第88行
如何告诉解析器'length'是pl / sql函数?或者也许有一些pl / sql方言文件也应该安装?
答案 0 :(得分:2)
你有一些选择。首先是extend the syntax by issuing special SQL commands告诉解析器新功能。
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);
这不能很好地扩展,所以你会想要使用你的扩展子类。不幸的是,the documentation for subclassing SQL::Parser并未对此有所了解。
最后,您可以使用SQL::Dialects::Role或通过子类化SQL::Dialects::ANSI编写SQL :: Dialects :: Oracle文件,然后使用$sqlParser->dialect('Oracle')
。不幸的是,你要子类化的关键get_config
方法只会返回一个大字符串,所以添加它会很笨重。幸运的是,您可以使用get_config_as_hash
为您完成此操作。不幸的是我无法弄清楚如何指定一个函数。 :(
由于我在解决这个问题上遇到了很多麻烦,我reported it as a bug。我还reported a bug,这意味着$sqlParser->dialect($dialect)
什么都不做,你必须写my $sqlParser = SQL::Parser->new($dialect)
。