/usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm第88行的未知函数'length'

时间:2013-06-17 18:53:48

标签: sql perl parsing

以下是代码的一部分:

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方言文件也应该安装?

1 个答案:

答案 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)